k8s 中的 ingress 使用細節

2022-11-06 06:02:20

k8s中的ingress

什麼是ingress

k8s 中使用 Service 為相同業務的 Pod 物件提供一個固定、統一的存取介面及負載均衡的能力,那麼這些 Service 如何被外部的應用存取,其中常用的就是藉助於 Ingress物件。

Ingress 是 Kubernetes 中的一個資源物件,用來管理叢集外部存取叢集內部服務的方式。

Ingress 物件由 Ingress Controller 和 Ingress 策略設定來共同完成。

  • Ingress 策略:用來設定不同的轉發規則;

  • Ingress Controller :Ingress 物件的域名解析都由 Ingress Controller 來完成,Ingress Controller 就是一個反向代理程式,它負責解析 Ingress 的反向代理規則,如果 Ingress 有增刪改的變動,所有的 Ingress Controller 都會及時更新自己相應的轉發規則,當 Ingress Controller 收到請求後就會根據這些規則將請求轉發到對應的 Service。

k8s

Ingress 如何使用

這裡來個簡單的 demo 來看下 Ingress 如何使用

1、部署ingress-controller

首先來部署下 Ingress Controller 這是使用的是 ingress-nginx

使用的 k8s 版本是 v1.19.9,所以這裡選擇的 ingress-nginxv1.1.3

裡面的映象是需要FQ的,這裡打包了映象到 docker-hub 安裝指令碼

$ kubectl apply -f deploy.yaml

2、部署應用

cat <<EOF >./go-web.yaml
# deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: go-web
  name: go-web
  namespace: study-k8s
spec:
  replicas: 5
  selector:
    matchLabels:
      app: go-web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: go-web
    spec:
      containers:
        - image: liz2019/test-docker-go-hub
          name: go-app-container
          resources: {}
status: {}

---
# service
apiVersion: v1
kind: Service
metadata:
  name: go-web-svc
  labels:
    run: go-web-svc
spec:
  selector:
    app: go-web
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000
      name: go-web-http

---
# ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-web-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: www.go-web.com
      http:
        paths:
          - path: /index
            pathType: Prefix
            backend:
              service:
                name: go-web-svc
                port:
                  number: 8000
EOF

在最下面放了 ingress 的設定,通過 path: /index 將 ingress 請求轉發到 go-web-svc 的 service。

➜  ~ kubectl get ingress -n study-k8s
NAME             CLASS    HOSTS            ADDRESS                       PORTS   AGE
go-web-ingress   <none>   www.go-web.com   192.168.56.112,192.168.56.111   80      28m

存取

$ curl '192.168.56.111:80/index' \
--header 'Host: www.go-web.com'

<h1>hello world</h1><div>你好</div>%

ingress 使用細節

1、一個叢集中可以有多個 Ingress Controller, 在 Ingress 中可以指定使用哪一個Ingress Controller

2、多個 Ingress 規則可能出現競爭;

3、Ingress 可以為多個名稱空間服務;

4、關於如何暴露 ingress 服務,讓外面的服務存取到?

1、Ingress Controller 用 Deployment 方式部署,給它新增一個 Service,型別為 LoadBalancer,這樣會自動生成一個 IP 地址,通過這個 IP 就能存取到了,並且一般這個 IP 是高可用的(前提是叢集支援 LoadBalancer,通常雲服務提供商才支援,自建叢集一般沒有);

2、使用 hostPort;

  • 1、Ingress Controller 用 DaemonSet 方式部署,使用叢集內部的某個或某些節點作為邊緣節點,給 node 新增 label 來標識,使用 nodeSelector 繫結到邊緣節點,保證每個邊緣節點啟動一個 Ingress Controller 範例,用 hostPort 直接在這些邊緣節點宿主機暴露埠,然後我們可以存取邊緣節點中 Ingress Controller 暴露的埠,這樣外部就可以存取到 Ingress Controller 了;

  • 2、使用親和性排程策略,使需要部署 Ingress Controller 的節點,每個節點都有一個 Ingress Controller 部署,然後用 hostPort 直接在這些邊緣節點宿主機暴露埠,我們就能通過這些節點的 IP 和 hostPort來存取 Ingress Controller 了。

我們上面部署 Ingress Controller 的方式就是使用的 hostPort 對外暴露埠。

參考

【Kubernetes的Ingress是啥】https://www.cnblogs.com/chenqionghe/p/11726231.html
【理解k8s 的 Ingress】https://www.jianshu.com/p/189fab1845c5
【Ingress】https://www.huaweicloud.com/zhishi/Ingress.html
【Ingress 控制器】https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/
【k8s中的ingress】https://boilingfrog.github.io/2022/11/05/k8s中的ingress/