Ingress實戰


一、概述

Ingress

Ingress 是 Kubernetes 的一種 API 對象,將集群內部的 Service 通過 HTTP/HTTPS 方式暴露到集群外部,並通過規則定義 HTTP/HTTPS 的路由。Ingress 具備如下特性:集群外部可訪問的 URL、負載均衡、SSL Termination、按域名路由(name-based virtual hosting)。

Ingress Controller (通常需要負載均衡器配合)負責實現 Ingress API 對象所聲明的能力。如下圖所示:

  1. Ingress Controller 監聽所有 worker 節點上的 80/443 端口
  2. Ingress Controller 將所有對域名為 a.kuboard.cn 的 HTTP/HTTPS 請求路由到 Service B 的 9080 端口
  3. Service B 將請求進一步轉發到其標簽所選擇的 Pod 容器組(通過 targetPort 指定容器組上的端口號)

該圖中,請求被轉發的過程為:

  1. 假設您將 a.kuboard.cn 的 DNS 解析到了集群中的一個 worker 節點的 IP 地址 192.168.2.69。(如果您的 worker 節點有外網地址,請使用外網地址,這樣您可以從外網訪問您的服務)
  2. 從客戶端機器執行命令 curl http://a.kuboard.cn/abc/,該請求您將被轉發到 192.168.2.69 這個地址的 80 端口,並被 Ingress Controller 接收
  3. Ingress Controller 根據請求的域名 a.kuboard.cn 和路徑 abc 匹配集群中所有的 Ingress 信息,並最終找到 Ingress B 中有這個配置,其對應的 Service 為 Service B 的 9080 端口
  4. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM