一、概述
Ingress
Ingress 是 Kubernetes 的一種 API 對象,將集群內部的 Service 通過 HTTP/HTTPS 方式暴露到集群外部,並通過規則定義 HTTP/HTTPS 的路由。Ingress 具備如下特性:集群外部可訪問的 URL、負載均衡、SSL Termination、按域名路由(name-based virtual hosting)。
Ingress Controller (通常需要負載均衡器配合)負責實現 Ingress API 對象所聲明的能力。如下圖所示:
- Ingress Controller 監聽所有 worker 節點上的 80/443 端口
- Ingress Controller 將所有對域名為 a.kuboard.cn 的 HTTP/HTTPS 請求路由到 Service B 的 9080 端口
- Service B 將請求進一步轉發到其標簽所選擇的 Pod 容器組(通過 targetPort 指定容器組上的端口號)
該圖中,請求被轉發的過程為:
- 假設您將 a.kuboard.cn 的 DNS 解析到了集群中的一個 worker 節點的 IP 地址
192.168.2.69
。(如果您的 worker 節點有外網地址,請使用外網地址,這樣您可以從外網訪問您的服務) - 從客戶端機器執行命令
curl http://a.kuboard.cn/abc/
,該請求您將被轉發到192.168.2.69
這個地址的 80 端口,並被 Ingress Controller 接收 - Ingress Controller 根據請求的域名
a.kuboard.cn
和路徑abc
匹配集群中所有的 Ingress 信息,並最終找到Ingress B
中有這個配置,其對應的 Service 為Service B
的9080
端口 - Ingress Controller 通過 kube-proxy 將請求轉發到
Service B
對應的任意一個 Pod 上 與Service B
的9080
端口對應的容器端口上。(從 Ingress Controller 到 Pod 的負載均衡由 kube-proxy + Service 實現)
Ingress Controller
如上所述,您必須在 Kubernetes 集群中安裝了 Ingress Controller,您配置的 Ingress 才能生效。
划重點 Ingress 只是 Kubernetes 中的一種配置信息;Ingress Controller 才是監聽 80/443 端口,並根據 Ingress 上配置的路由信息執行 HTTP 路由轉發的組件。
Ingress Controller 有多種實現可供選擇,請參考 Kubernetes 官方文檔 Additional controllers,比較常用的有 Traefic 、 Nginx Ingress Controller for Kubernetes 等。
如果您參考 https://kuboard.cn 網站上提供的文檔安裝了 Kubernetes,您應該已經完成了 Nginx Ingress Controller for Kubernetes 在您 Kubernetes 集群中的安裝。該 Ingress Controller 以 DaemonSet 的類型部署到 Kubernetes,且監聽了 hostPort 80/443
二、安裝Ingress Controller
環境介紹
系統 | docker | ip | 主機名 | 配置 |
---|---|---|---|---|
centos 7.6 | 19.03.5 | 192.168.31.150 | k8s-master | 2核4G |
centos 7.6 | 19.03.5 | 192.168.31.183 | k8s-node01 | 2核4G |
centos 7.6 | 19.03.5 | 192.168.31.178 | k8s-node02 | 2核4G |
安裝
在 master 節點上執行
kubectl apply -f https://kuboard.cn/install-script/v1.17.x/nginx-ingress.yaml
配置域名解析
將域名 *.demo.yourdomain.com 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也可以是 demo-worker-a-1 的地址 y.y.y.y)
驗證配置
在瀏覽器訪問 a.demo.yourdomain.com,將得到 404 NotFound 錯誤頁面
發布應用
應用yaml
這里以flaskapp為例
vi flaskapp.yaml
內容如下:
--- apiVersion: apps/v1 kind: Deployment metadata: annotations: k8s.eip.work/displayName: flaskapp k8s.eip.work/ingress: 'false' k8s.eip.work/service: ClusterIP k8s.eip.work/workload: svc-flaskapp labels: k8s.eip.work/layer: svc k8s.eip.work/name: svc-flaskapp name: svc-flaskapp namespace: default spec: replicas: 1 selector: matchLabels: k8s.eip.work/layer: svc k8s.eip.work/name: svc-flaskapp template: metadata: labels: k8s.eip.work/layer: svc k8s.eip.work/name: svc-flaskapp spec: containers: - image: jcdemo/flaskapp imagePullPolicy: Always name: flaskapp restartPolicy: Always --- apiVersion: v1 kind: Service metadata: annotations: k8s.eip.work/displayName: flaskapp k8s.eip.work/workload: svc-flaskapp labels: k8s.eip.work/layer: svc k8s.eip.work/name: svc-flaskapp name: svc-flaskapp namespace: default spec: ports: - name: wjaz2a nodePort: 0 port: 5000 protocol: TCP targetPort: 5000 selector: k8s.eip.work/layer: svc k8s.eip.work/name: svc-flaskapp type: ClusterIP
注意:此段yaml內容,使用Kuboard生成的,創建工作負載,可以預覽yaml文件。
關於Kuboard的使用,請參考鏈接:
https://www.cnblogs.com/xiao987334176/p/12060855.html
ingress yaml
vi flaskapp-ingress.yaml
內容如下:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: svc-flaskapp namespace: default annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: flaskapp.baidu.com http: paths: - path: backend: serviceName: svc-flaskapp servicePort: 5000
注意: Kuboard也可以生成ingress,但是有bug,外部無法訪問。
因此這段,我是手動編寫的。注意修改上面的紅色文字。
執行yaml
kubectl apply -f flaskapp.yaml
kubectl apply -f flaskapp-ingress.yaml
查看pod
# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES svc-flaskapp-774c665d-c42ft 1/1 Running 0 113m 10.244.58.194 k8s-node02 <none> <none>
查看svc
# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 56d svc-flaskapp ClusterIP 10.1.116.148 <none> 5000/TCP 123m
查看ingresses
# kubectl get ingresses.extensions NAME HOSTS ADDRESS PORTS AGE svc-flaskapp flaskapp.baidu.com 80 106m
設置域名解析
如果沒有dns,修改windows 10的hosts,添加一條記錄
192.168.31.164 flaskapp.baidu.com
注意:解析到任意node節點都可以!
訪問頁面
http://flaskapp.baidu.com/
效果如下:
本文參考鏈接:
https://www.kuboard.cn/learning/k8s-intermediate/service/ingress.html#ingress
https://www.kuboard.cn/install/install-k8s.html#%E5%AE%89%E8%A3%85-ingress-controller