K8S 部署 ingress-nginx (一) 原理及搭建


Kubernetes 暴露服務的有三種方式,分別為 LoadBlancer Service、NodePort Service、Ingress。官網對 Ingress 的定義為管理對外服務到集群內服務之間規則的集合,通俗點講就是它定義規則來允許進入集群的請求被轉發到集群中對應服務上,從來實現服務暴漏。 Ingress 能把集群內 Service 配置成外網能夠訪問的 URL,流量負載均衡,終止SSL,提供基於域名訪問的虛擬主機等等。

LoadBlancer Service

LoadBlancer Service 是 Kubernetes 結合雲平台的組件,如國外 GCE、AWS、國內阿里雲等等,使用它向使用的底層雲平台申請創建負載均衡器來實現,有局限性,對於使用雲平台的集群比較方便。

NodePort Service

NodePort Service 是通過在節點上暴漏端口,然后通過將端口映射到具體某個服務上來實現服務暴漏,比較直觀方便,但是對於集群來說,隨着 Service 的不斷增加,需要的端口越來越多,很容易出現端口沖突,而且不容易管理。當然對於小規模的集群服務,還是比較不錯的。

Ingress

Ingress 使用開源的反向代理負載均衡器來實現對外暴漏服務,比如 Nginx、Apache、Haproxy等。Nginx Ingress 一般有三個組件組成:
1)ingress是kubernetes的一個資源對象,用於編寫定義規則。
2)反向代理負載均衡器,通常以Service的Port方式運行,接收並按照ingress定義的規則進行轉發,通常為nginx,haproxy,traefik等,本文使用nginx。
3)ingress-controller,監聽apiserver,獲取服務新增,刪除等變化,並結合ingress規則動態更新到反向代理負載均衡器上,並重載配置使其生效。
以上三者有機的協調配合起來,就可以完成 Kubernetes 集群服務的暴漏。

組件說明

externalLB : 外部的4層負載均衡器
<Service> ingress-nginx : nodePort 類型的 service 為 <IngressController> ingress-nginx 的 pod 接入外部流量
<IngressController> ingress-nginx : ingress-nginx pod, 負責創建負載均衡(一個安裝了nginx 的 pod)
<Ingress> : Ingress 根據后端 Service 實時識別分類及 IP 把結果生成配置文件注入到 ingress-nginx pod 中
<Service> site1 : Service 對后端的pod 進行分類(只起分類作用)

這里需要如下鏡像
gcr.io/google_containers/defaultbackend:1.4
gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.1

在node節點上導入鏡像: gcr.io/google_containers/defaultbackend:1.4
nginx-ingress-controller 鏡像可自動下載

cd ~
mkdir ingress-nginx
cd ingress-nginx/

for file in namespace.yaml configmap.yaml rbac.yaml tcp-services-configmap.yaml with-rbac.yaml udp-services-configmap.yaml default-backend.yaml;do wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.17.0/deploy/$file; done

kubectl apply -f namespace.yaml 
kubectl get ns 

kubectl apply -f ./

kubectl get pods -n ingress-nginx --show-labels
cd ~
mkdir ingress && cd ingress

vi deploy-demo.yaml
# 內容如下 
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  selector:
    app: myapp
    release: canary
  ports:
  - name: http
    targetPort: 80
    port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v2
        ports:
        - name: http
          containerPort: 80
          
kubectl apply -f deploy-demo.yaml
kubectl get svc
kubectl get pods

cd ~/ingress-nginx
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.17.0/deploy/provider/baremetal/service-nodeport.yaml

# 修改 service-nodeport.yaml
vi service-nodeport.yaml 
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: 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: ingress-nginx
    
kubectl apply -f ./

# 在外網上面訪問 http://192.168.0.205:30080 看到 default backend - 404 則證明成功

cd ~/ingress

vi ingress-myapp.yaml
# 內容是 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myapp
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myapp.klvchen.com
    http:
      paths:
      - path:
        backend:
          serviceName: myapp
          servicePort: 80

# 創建 ingress
kubectl apply -f ingress-myapp.yaml 

# 查看 ingress
kubectl get ingress

# 查詳細信息 ingress
kubectl describe ingress ingress-myapp

# 通過修改 host 可以通過域名訪問,修改 hosts 文件,添加下面記錄
192.168.0.205		myapp.klvchen.com

# 訪問 http://myapp.klvchen.com:30080/

參考:https://blog.csdn.net/aixiaoyang168/article/details/78485581
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.17.0/deploy


免責聲明!

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



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