现在我们可以使用 Service 的外部 IP 取得服务,但若要正式将服务公开,需要挂上 Domain Name 方便他人存取,今天就来介绍如何在 GKE 上使用 Domain Name 公开服务。
在 GKE 上主要有两种方式可以公开服务
使用 Service 时 GKE 会创建一个 TCP Network Load Balancer
, 并且赋予一个 Regional IP
,只要将 Domain Name 挂到 Load Balancer 的 IP 上,就能成功公开服务。
Ingress 是一种 Kubernetes 元件,可将外部 HTTP(S) 流量导入到内部 Service,使用 Ingress 时 GKE 会创建一个 HTTP(S) Load Balancer
,并且赋予一个 Global IP
,同样的只要将 Domain Name 挂到此 IP 上,就能成功公开服务。
更多详细内容可以查看 Configuring domain names with static IP addresses
针对上述两种方式,大多情况我们都会使用 Ingress 来公开服务,不仅可以将外部流量入口集中在同个元件,Ingress Routing Rule 也能用来应对复杂的流量转发需求。所以今天的 Lab 会以 Ingress 的方式来实作。
预设情况下, Ingress 创建的 Load Balancer IP 是会浮动的,若需要绑定 Domain Name ,需要先建立 Static IP,并将其跟 Ingress 绑定,下面就来实际操作看看。
进入 Cloud Shell 网站
点击倒三角形->点选专案的 PROJECT_ID
,开启专案 Terminal
因为有 Dev 、 Stage 、 Production 三种环境,所以可以准备三组不同的 Static IP。
gcloud compute addresses create webapp-dev-ip --global
gcloud compute addresses create webapp-stg-ip --global
gcloud compute addresses create webapp-prod-ip --global
gcloud compute addresses list
(输出结果)
NAME: webapp-dev-ip
ADDRESS/RANGE: 35.186.239.22
TYPE: EXTERNAL
PURPOSE:
NETWORK:
REGION:
SUBNET:
STATUS: RESERVED
NAME: webapp-prod-ip
ADDRESS/RANGE: 34.117.112.72
TYPE: EXTERNAL
PURPOSE:
NETWORK:
REGION:
SUBNET:
STATUS: RESERVED
NAME: webapp-stg-ip
ADDRESS/RANGE: 34.96.76.172
TYPE: EXTERNAL
PURPOSE:
NETWORK:
REGION:
SUBNET:
STATUS: RESERVED
接着就可以将 IP 绑定,此步骤需要先有自己的一组 Domain Name,笔者选用的是 GoDaddy 来管理 DNS 纪录。
A Record
对应到不同 Domain Name设定完成後, DNS 会需要一段时间才会生效,可以用 nslookup
指令查询看看。
nslookup <one of your domain>
(输出结果)
Server: 169.254.169.254
Address: 169.254.169.254#53
Non-authoritative answer:
Name: dev.uccuz.online
Address: 35.186.239.22
有回应 IP Address 代表运作成功。
接着就来准备 Ingrss 设置,我们会在之前的 Helm Chart 里建立相关 yaml 档案。
ingress.yaml
档案cd ~/webapp && touch templates/ingress.yaml
Explorer -> Open Folder -> 选择 webapp 资料夹 -> Open
templates/ingress.yaml
档案并以下面内容取代apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ .Release.Name }}
annotations:
kubernetes.io/ingress.global-static-ip-name: {{ .Values.ingress.ip }}
spec:
rules:
- host: "{{ .Values.ingress.domain }}"
http:
paths:
- path: /
backend:
serviceName: {{ .Release.Name }}
servicePort: 80
{{ .Values.ingress.ip }}
以及 {{ .Values.ingress.domain }}
需要在 values 档案中配置
之前的章节我们针对不同环境建立各自的 values 档案,这里就可以设置不同的 IP 以及 Domain Name。
<your domain name>
改成你的 Domain Name service:
type: NodePort
port: 80
ingress:
ip: webapp-dev-ip
domain: <your dev domain name>
service:
type: NodePort
port: 80
ingress:
ip: webapp-stage-ip
domain: <your stage domain name>
service:
type: NodePort
port: 80
ingress:
ip: webapp-prod-ip
domain: <your production domain name>
使用 Ingress 时需要将 Service Type 改为 NodePort
cd ~/webapp
helm upgrade webapp-dev .
(输出结果)
Release "webapp-dev" has been upgraded. Happy Helming!
NAME: webapp-dev
LAST DEPLOYED: Sat Sep 25 16:45:00 2021
NAMESPACE: default
STATUS: deployed
REVISION: 3
TEST SUITE: None
部属完成後,可以检查 Ingress 是否成功建立。
kubectl get ingress
(输出结果)
NAME CLASS HOSTS ADDRESS PORTS AGE
webapp-dev <none> dev.uccuz.online 35.186.239.22 80 93s
可以看到 Ingress 已经与 Domain Name 以及 IP Address 做绑定,到浏览器测试看看。
<your dev domain name>
成功透过 Domain Name 取得服务。
有可能出现 404. That’s an error.,可以等待一段时间再尝试看看。
>>: IOS、Python自学心得30天 Day-23 Firebase衔接Python-1
铁人挑战最後一天啦! 让我们整理一下之前的文章吧。 DAY1-Alpine.js之一步一脚印 安装下...
於Visual Studio2019新增一个新的.NET Core Web Application ...
今天介绍的内容为角色攻击,玩家透过滑鼠发动攻击。 ...
直接在官网上下载即可。 这边选择自己的系统 这里将这两个打勾就能直接用右键开启 ...
.CISO应该适当地定位安全功能,例如报告线,角色和职责,并将安全集成到业务功能和流程中。 .数据...