02.26 「Kubernetes系列」第6篇 Ingress controller


「Kubernetes系列」第6篇 Ingress controller - nginx組件介紹


1. 概述

在上一篇文章中我們介紹瞭如何通過helm進行安裝部署traefik組件,文中還提到常用的ingress controller除了traefik還有Nginx、HAProxy、Kong等,在本篇文章中我們就介紹如何安裝部署Nginx-ingress,只有在經過積累不同組件的使用經驗之後,我們才能更好的比較其優劣,形成最佳實踐。

2. nginx-ingress組件的安裝部署

2.1 通過helm查找nginx-ingress

<code># step1: 通過helm查找nginx-ingress> helm search nginx-ingress> helm inspect stable/nginx-ingress/<code>

2.2 鏡像下載及上傳

部分企業由於服務器沒有外網訪問策略以及防火牆的原因無法獲取國外Docker鏡像,所以我們事先需要將所需鏡像準備好,並上傳到企業私有鏡像倉庫。

<code># step2: 鏡像準備> docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.1> docker tag quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.1 registry.hankercloud.com/ingress-controller/nginx-ingress-controller:0.25.1> docker push registry.hankercloud.com/ingress-controller/nginx-ingress-controller:0.25.1> > docker pull k8s.gcr.io/defaultbackend-amd64:1.5> docker tag k8s.gcr.io/defaultbackend-amd64:1.5 registry.hankercloud.com/google_containers/defaultbackend-amd64:1.5> docker push registry.hankercloud.com/google_containers/defaultbackend-amd64:1.5/<code>

2.3 組件部署

在上一篇博客中,我們是採用Deployment模式部署的traefik組件,這次我們採用DaemonSet的模式來部署nginx-ingress組件。

<code># step3: 組件部署 > helm install stable/nginx-ingress --name nginx-ingress --namespace=kube-system \\    --set fullnameOverride=nginx-ingress \\    --set controller.kind=DaemonSet \\    --set controller.daemonset.useHostPort=true \\    --set controller.metrics.enabled=true \\    --set controller.image.repository=registry.hankercloud.com/ingress-controller/nginx-ingress-controller \\    --set defaultBackend.image.repository=registry.hankercloud.com/google_containers/defaultbackend-amd64# step4: 檢查部署是否成功> helm list> kubectl get all -n kube-system > kubectl logs $POD_NAME -n kube-system   /<code> 

2.4 負載均衡配置及域名解析處理

本次我們採用DaemonSet部署nginx-ingress組件,並且使用了主機的80和443接口用來分別接收http和https請求,我們將相應的域名解析到nginx-ingress Pod所在的主機IP之後,就可以通過域名來進行相應的域名訪問了。

但上述配置方式無法做到高可用,當nginx-ingress的Pod實例故障或者其所在主機發生故障時,會導致相應的域名無法訪問,所以建議在公有云購買負載均衡設備並配置相應的後端服務器列表以實現高可用的目的。

2.5 安裝調試

在上文中我們通過helm部署了一個wordpress應用,本文我們繼續通過該應用進行域名訪問,在本機控制檯輸入 > curl -i http://10.0.0.182 -H 'Host: blog.hankercloud.com',如果看到有正常返回則說明部署成功。

3. 企業場景及解決方案

3.1 如何做內外網的隔離

  • Step1: 我們首先部署了兩個ingress組件,其中之一是接收內網訪問請求,另外一個是接收外網訪問請求,相應配置如下:
<code># 內網nginx-ingress配置聲明:spec:  template:    spec:      containers:      - args:        - /nginx-ingress-controller        - --default-backend-service=kube-system/nginx-ingress-default-backend        - --election-id=ingress-controller-leader        - --ingress-class=nginx        - --configmap=kube-system/nginx-ingress-controller/<code> 
<code># 外網nginx-ingress配置聲明:spec:  template:    spec:      containers:      - args:        - /nginx-ingress-controller        - --default-backend-service=kube-system/nginx-ingress-external-default-backend        - --election-id=ingress-controller-leader        - --ingress-class=nginx-external        - --configmap=kube-system/nginx-ingress-external-controller/<code>

兩者的主要區別在於參數 --ingress-class 設置的值是不一樣的

  • Step2: 對於需要暴露到公網的域名,修改其ingress的定義,相應配置參考如下:
<code>metadata:  name: www  annotations:    kubernetes.io/ingress.class: "nginx-external"/<code>
  • Step3: 檢查是否配置成功,執行 kubectl exec ${POD_NAME} -n kube-system cat /etc/nginx/nginx.conf 查看配置文件中是否已經包含外網域名的相關配置,並在本地進行測試驗證

https://kubernetes.github.io/ingress-nginx/deploy/

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/


分享到:


相關文章: