Day26 - 替 Kubernetes 服务挂上心爱的 Domain

前言

现在我们可以使用 Service 的外部 IP 取得服务,但若要正式将服务公开,需要挂上 Domain Name 方便他人存取,今天就来介绍如何在 GKE 上使用 Domain Name 公开服务。

https://ithelp.ithome.com.tw/upload/images/20210926/20139235vfblMorRfm.png

公开服务方式

在 GKE 上主要有两种方式可以公开服务

  • Service of type loadBalancer
  • Ingress

使用 Service 时 GKE 会创建一个 TCP Network Load Balancer , 并且赋予一个 Regional IP ,只要将 Domain Name 挂到 Load Balancer 的 IP 上,就能成功公开服务。

https://ithelp.ithome.com.tw/upload/images/20210926/20139235qOWDEsH9au.png

Ingress 是一种 Kubernetes 元件,可将外部 HTTP(S) 流量导入到内部 Service,使用 Ingress 时 GKE 会创建一个 HTTP(S) Load Balancer ,并且赋予一个 Global IP ,同样的只要将 Domain Name 挂到此 IP 上,就能成功公开服务。

https://ithelp.ithome.com.tw/upload/images/20210926/20139235eRKwXaUNhb.png

更多详细内容可以查看 Configuring domain names with static IP addresses

针对上述两种方式,大多情况我们都会使用 Ingress 来公开服务,不仅可以将外部流量入口集中在同个元件,Ingress Routing Rule 也能用来应对复杂的流量转发需求。所以今天的 Lab 会以 Ingress 的方式来实作。

建立 Static IP 以及 Domain Name

预设情况下, Ingress 创建的 Load Balancer IP 是会浮动的,若需要绑定 Domain Name ,需要先建立 Static IP,并将其跟 Ingress 绑定,下面就来实际操作看看。

  1. 进入 Cloud Shell 网站

  2. 点击倒三角形->点选专案的 PROJECT_ID,开启专案 Terminal

因为有 Dev 、 Stage 、 Production 三种环境,所以可以准备三组不同的 Static IP。

  1. 建立 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
  1. 列出所有 IP
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 纪录。

  1. 在 DNS 上设定 A Record 对应到不同 Domain Name

https://ithelp.ithome.com.tw/upload/images/20210926/20139235w2DPcjmHyG.png

设定完成後, DNS 会需要一段时间才会生效,可以用 nslookup 指令查询看看。

  1. 检查 DNS 是否运作成功
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 代表运作成功。

建立 Ingress Controller

接着就来准备 Ingrss 设置,我们会在之前的 Helm Chart 里建立相关 yaml 档案。

  1. 在 Helm chart 建立 ingress.yaml 档案
cd ~/webapp && touch templates/ingress.yaml
  1. 点击左上 Explorer -> Open Folder -> 选择 webapp 资料夹 -> Open

  1. 点击 templates/ingress.yaml 档案并以下面内容取代

https://ithelp.ithome.com.tw/upload/images/20210926/20139235n5yO6PVTgJ.png

  • 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。

  1. 在不同 values 档案并贴上以下内容,并将 <your domain name> 改成你的 Domain Name

https://ithelp.ithome.com.tw/upload/images/20210926/20139235JZL0Bvq7GJ.png

  • values.yaml 修改部分
  service:
    type: NodePort
    port: 80

ingress:
  ip: webapp-dev-ip
  domain: <your dev domain name>

https://ithelp.ithome.com.tw/upload/images/20210926/20139235ZmGxY2VcZ6.png

  • values.stage.yaml 修改部分
  service:
    type: NodePort
    port: 80

ingress:
  ip: webapp-stage-ip
  domain: <your stage domain name>

https://ithelp.ithome.com.tw/upload/images/20210926/20139235WXTE03YJU0.png

  • values.production.yaml 修改部分
  service:
    type: NodePort
    port: 80

ingress:
  ip: webapp-prod-ip
  domain: <your production domain name>

使用 Ingress 时需要将 Service Type 改为 NodePort

  1. 更新 Helm Chart
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 是否成功建立。

  1. 检查 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 做绑定,到浏览器测试看看。

  1. 到浏览器输入网址
<your dev domain name>

成功透过 Domain Name 取得服务。

https://ithelp.ithome.com.tw/upload/images/20210926/20139235vfJ8aTsMOH.png

有可能出现 404. That’s an error.,可以等待一段时间再尝试看看。


<<:  [Day26] MACD指标

>>:  IOS、Python自学心得30天 Day-23 Firebase衔接Python-1

Day30-铁人三十天回顾Alpine.js总整理

铁人挑战最後一天啦! 让我们整理一下之前的文章吧。 DAY1-Alpine.js之一步一脚印 安装下...

.NET Core第2天_.NET Core应用程序布署_Azure平台版

於Visual Studio2019新增一个新的.NET Core Web Application ...

Unity与Photon的新手相遇旅途 | Day10-角色攻击

今天介绍的内容为角色攻击,玩家透过滑鼠发动攻击。 ...

DAY29-VSCODE安装

直接在官网上下载即可。 这边选择自己的系统 这里将这两个打勾就能直接用右键开启 ...

资讯安全治理(Information Security Governance)

.CISO应该适当地定位安全功能,例如报告线,角色和职责,并将安全集成到业务功能和流程中。 .数据...