k8s ingress及ingress controller


使用 Kubernetes Ingress 對外暴露服務

k8s 對外暴露服務的方法

向 k8s 集群外部暴露服務的方式有三種:

nodePort
LoadBalancer
Ingress

每種方式都有各自的優缺點

  • nodePort 方式在服務變多的情況下會導致節點要開的端口越來越多,不好管理。
  • LoadBalancer 更適合結合雲提供商的 LB 來使用,但是在 LB 越來越多的情況下對成本的花費也是不可小覷。
  • Ingress 是 k8s 官方提供的用於對外暴露服務的方式,也是在生產環境用的比較多的方式,
一般在雲環境下是 LB + Ingress Ctroller 方式對外提供服務,這樣就可以在一個 LB 的情況下根據域名路由到對應后端的 Service,有點類似於 Nginx 反向代理,只不過在 k8s 集群中,這個反向代理是集群外部流量的統一入口。

Ingress 及 Ingress Controller 簡介

Ingress

Ingress 是 k8s 資源對象,用於對外暴露服務,該資源對象定義了不同主機名(域名)及 URL 和對應后端 Service(k8s Service)的綁定,根據不同的路徑路由 http 和 https 流量。

而 Ingress Contoller 是一個 pod 服務,封裝了一個 web 前端負載均衡器,同時在其基礎上實現了動態感知 Ingress 並根據 Ingress 的定義動態生成 前端 web 負載均衡器的配置文件,比如 Nginx Ingress Controller 本質上就是一個 Nginx,只不過它能根據 Ingress 資源的定義動態生成 Nginx 的配置文件,然后動態 Reload。

Ingress Controller

獨立運行的1個或1組pod,擁有7層代理能力或調度能力的應用程序 (DaemonSet)

Ingress Controller 的重大作用是將前端負載均衡器和 Kubernetes 完美地結合了起來,一方面在雲、容器平台下方便配置的管理,另一方面實現了集群統一的流量入口,而不是像 nodePort 那樣給集群打多個孔。

總的來說要使用 Ingress

得先部署 Ingress Controller 實體(相當於前端 Nginx),
然后再創建 Ingress (相當於 Nginx 配置的 k8s 資源體現),
Ingress Controller 部署好后會動態檢測 Ingress 的創建情況生成相應配置。

Ingress Controller 的實現有很多種:

基於 Nginx
基於 HAProxy
基於 Traefik
基於 Envoy
基於 OpenResty 的 Kong Ingress Controller 等

更多 Controller 見:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

部署Ingress

部署pod節點

apiVersion:v1
kind:Service
metadata:
  name: myapp-deploy
  namspace: default
spec:
  selector:
    app: myapp
    release: canary
  ports:
  - name: http
    targetPort: 80
    port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namspace: default
spec:
  replicas:3
  selector:
    matchLables:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v2
        ports:
        - name: https
          containerPort: 80

獲取nodeport配置文件

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

修改配置文件

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 30080
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
      nodePort: 30443
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---


定義ingress管理pod svs

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myapp
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: ingress.evescn.com
    http:
     paths:
     - path:
       backend:
         serviceName: myapp
         servicePort: 80
  • 說明:
kubernetes.io/ingress.class: "nginx":Nginx Ingress Controller 根據該注解自動發現 Ingress;
host: ingress.evescn.com:對外訪問的域名;
serviceName: myapp:對外暴露的 Service 名稱;
servicePort: 80:nginx service 監聽的端口;

查看Ingress信息

# kubectl describe ingress ingress-myapp
Name:             ingress-myapp
Namespace:        default
Address:          10.96.73.17
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host                Path  Backends
  ----                ----  --------
  ingress.evescn.com  
                         myapp:80 (10.44.0.2:80,10.44.0.3:80,10.44.0.4:80)
Annotations:
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx"},"name":"ingress-myapp","namespace":"default"},"spec":{"rules":[{"host":"ingress.evescn.com","http":{"paths":[{"backend":{"serviceName":"myapp","servicePort":80},"path":null}]}}]}}

  kubernetes.io/ingress.class:  nginx
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  CREATE  37m   nginx-ingress-controller  Ingress default/ingress-myapp
  Normal  UPDATE  36m   nginx-ingress-controller  Ingress default/ingress-myapp
  Normal  CREATE  17m   nginx-ingress-controller  Ingress default/ingress-myapp
  Normal  UPDATE  17m   nginx-ingress-controller  Ingress default/ingress-myapp

修改主機hosts文件

192.168.0.101 master1 master ingress.evescn.com

訪問網站,測試代理

# for i in `seq 0 10`; do curl ingress.evescn.com:30080/hostname.html; done
myapp-deploy-67d58676c9-qnrrg
myapp-deploy-67d58676c9-5s7q8
myapp-deploy-67d58676c9-mkcjr
myapp-deploy-67d58676c9-qnrrg
myapp-deploy-67d58676c9-5s7q8
myapp-deploy-67d58676c9-mkcjr
myapp-deploy-67d58676c9-qnrrg
myapp-deploy-67d58676c9-5s7q8
myapp-deploy-67d58676c9-mkcjr
myapp-deploy-67d58676c9-qnrrg
myapp-deploy-67d58676c9-5s7q8

參考文檔

https://qhh.me/2019/08/12/%E4%BD%BF%E7%94%A8-Kubernetes-Ingress-%E5%AF%B9%E5%A4%96%E6%9A%B4%E9%9C%B2%E6%9C%8D%E5%8A%A1/
https://juejin.im/post/5db8da4b6fb9a0204520b310
https://mritd.me/2017/03/04/how-to-use-nginx-ingress/
https://zhangguanzhang.github.io/2018/10/06/IngressController/


免責聲明!

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



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