K8S經過Ingress和外部負載均衡暴露服務

一. 背景知識

Kubernetes 經過 Ingress 暴露服務有兩種方案:html

  1. 將服務的域名直接指向到其中一臺 worker 節點上. 這種方式將流量集中到這一臺 worker 節點上, 容易引發單點故障, 故只適用於開發, 測試, 和Demo環境. 示意圖以下:image.png
  2. 將服務的域名指向獨立負載均衡服務到全部 worker 節點, 而 Ingress 會監聽全部 worker 節點上的流量並進行相應的分發, 從而保證正確的服務.
    在這種方案下, 即使咱們不是全部的節點都啓動了該服務的容器, Ingress也會正確分發. 好比咱們咱們有 3 個 worker 節點: ttg12 / ttg13 / ttg14, 而服務對應的 Deployment 中設置的 replica=2, 也就是隻啓動2個副本. 假設這2個容器啓動在 ttg12 和 ttg13 上. 這時候, 負載均衡服務器上轉發的流量也會打到 ttg14 上, 雖然這個節點自己並無對應的 pod, 但經過 Ingress, 也能正常地提供服務. 示意圖以下:
    image.png

二. 部署

本文示例部署一個 lb-tomcat9.faceless.cn 的域名指向 負載均衡服務器, 並經過 Ingress 提供服務.nginx

2.1 部署 Deployment 和 Service

本地新建文件 lb-tomcat9-svc.yaml:segmentfault

apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: tomcat9-dev-dpl
  labels:
    app: tomcat9
    env: dev
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat9
      env: dev
  template:
    metadata:
      labels:
        app: tomcat9
        env: dev
    spec:
      containers:
      - name: tomcat9
        image: tomcat:9.0.37-jdk8-openjdk
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: tomcat9-dev-svc
  labels:
    app: tomcat9
    env: dev
spec:
  selector:
    app: tomcat9
    env: dev
  ports:
  - name: nginx-port
    protocol: TCP
    port: 8080
    targetPort: 8080

應用本配置文件:api

kubectl apply -f lb-tomcat9-svc.yaml

輸出:tomcat

deployment.apps/tomcat9-dev-dpl created
service/tomcat9-dev-svc created

2.2 部署 Ingress

在本地新建 Ingress 配置 lb-tomcat9-ingress.yaml, 將 lb-tomcat9.faceless.cn 域名下的全部流量分發給 tomcat9-dev-svc 服務:bash

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: lb-tomcat9-ingress
spec:
  rules:
  - host: lb-tomcat9.faceless.cn
    # Ingress 的 `http` 端口爲 80, 對應在負載均衡配置文件中 **upstream** 模塊下配置的端口
    http:
      paths: 
      - path: /
        backend:
          serviceName: tomcat9-dev-svc
          servicePort: 8080

應用本配置文件:服務器

kubectl apply -f lb-tomcat9-ingress.yaml

輸出:app

ingress.networking.k8s.io/lb-tomcat9-ingress configured

注意 Ingress 除了部署資源以外, 還須要對應的 Ingress Controller. 本文使用 Nignx 出廠的 nginx/nginx-ingress 控制器. 可以使用 Kuboard 教程中的配置腳本安裝:負載均衡

kubectl apply -f https://kuboard.cn/install-script/v1.18.x/nginx-ingress.yaml

具體請參考: https://kuboard.cn/install/install-k8s.html#安裝-ingress-controller.less

另外關於 Nginx Ingress 的兩種不一樣實現, 請參考個人另外一篇博文: K8S Ingress控制器兩個實現版本(kubernetes-ingress 和 ingress-nginx)的區別.

2.3 驗證是否生效

先經過 kubectl get pods | grep tomcat9-dev-dpl 確認 2 個 pods 的狀態都已爲 Running.

而後在本地經過 /etc/hostslb-tomcat9.faceless.cn 域名分別執行 ttg12 / ttg13 / ttg14 對應的 IP, 並訪問 http://lb-tomcat9.faceless.cn, 查看這3個IP是否都能正常返回.

2.4 部署 負載均衡

本文負載均衡 (Load Balancer) 使用 Nginx 實現, 對應的配置文件爲:

# 這裏定義了一個名稱爲`lb_tomcat9_server`的`上游`, 即負載均衡的目標站點清單
upstream lb_tomcat9_server {
  server ttg12:80;
  server ttg13:80;
  server ttg14:80;
}
# 下面定義`lb-tomcat9.faceless.cn`站點, 將全部流量轉發到`lb_tomcat9_server`
server {
    listen       80;
    listen  [::]:80;
    server_name  lb-tomcat9.faceless.cn;

    location / {
    
        proxy_set_header  Host  $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;


        proxy_pass http://lb_tomcat9_server;
    }

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

更多細節可參考筆記: Docker 容器部署 Nginx 實現負載均衡

相關文章
相關標籤/搜索