溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes進階之ingress-nginx

發(fā)布時間:2020-07-11 01:47:17 來源:網(wǎng)絡(luò) 閱讀:1089 作者:wx5c1cfd6e22842 欄目:系統(tǒng)運維
Kubernetes進階之ingress-nginx

目錄:
一 從外部訪問應(yīng)用最佳方式
二 配置管理
三 數(shù)據(jù)卷與數(shù)據(jù)持久卷
四 再談有狀態(tài)應(yīng)用部署
五 K8S 安全機制

說在前面的話,選擇nodeport的方式去暴露端口,那你需要得去判斷暴露的端口有沒有被占用,再創(chuàng)建新的應(yīng)用會判斷端口有沒有被分配出去
nodeport本身是基于默認的iptables的代理模式做的網(wǎng)絡(luò)轉(zhuǎn)發(fā),也就是SANT,DANT,基于四層的,做七層是做不了的,性能差一點,因為它需要防火墻的轉(zhuǎn)發(fā)和過濾。

一、從外部訪問應(yīng)用最佳方式

  1. Pod與Ingress的關(guān)系
    ? 通過Service相關(guān)聯(lián)
    ? 通過Ingress Controller實現(xiàn)Pod的負載均衡
    • 支持TCP/UDP 4層和HTTP 7層
      Kubernetes進階之ingress-nginx
  2. Ingress Controller
    controller類似裝的k8s組件,時常的要去api去交互,時常去獲取api的相關(guān)的信息,刷新自己的規(guī)則,類似與其他控制器
    ingress,k8s設(shè)計了一個比較全局性的負載均衡器,準確的來說Ingress它是k8s中的一個規(guī)則,實現(xiàn)這個規(guī)則就是使用的這個控制器,一般稱為ingress控制器
    ingress控制器主要做的工作就是,它訪問到這個控制器,它幫你轉(zhuǎn)發(fā)的具體pod,也就是集群池,關(guān)聯(lián)的哪些應(yīng)用,哪些pod的IP,會幫你關(guān)聯(lián)出來,暴露的端口80,443
    Kubernetes進階之ingress-nginx
    1.部署Ingress Controlle
    部署文檔:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
  3. 創(chuàng)建Ingress規(guī)則,為你的應(yīng)用暴露一個端口,暴露一個域名,讓用戶去訪問這個ingress controller控制器就可以了
    3.控制器選擇類型
    https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
    注意事項:
    ? 鏡像地址修改成國內(nèi)的: zhaocheng172/nginx-ingress-controller:0.20.0
    ? 使用宿主機網(wǎng)絡(luò):hostNetwork: true
    [root@k8s-master demo]# wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
    [root@k8s-master demo]# kubectl apply -f mandatory.yaml
    [root@k8s-master demo]# kubectl get pod -n ingress-nginx
    NAME                                        READY   STATUS    RESTARTS   AGE
    nginx-ingress-controller-5654f58c87-r5vcq   1/1     Running   0          46s

    分配給node2上面了,我們可以用netstat去查看我們監(jiān)聽的端口80/443

    [root@k8s-master demo]# kubectl get pod -n ingress-nginx -o wide
    NAME                                        READY   STATUS    RESTARTS   AGE     IP              NODE        NOMINATED NODE   READINESS GATES
    nginx-ingress-controller-5654f58c87-r5vcq   1/1     Running   0          3m51s   192.168.30.23   k8s-node2   <none>           <none>
    [root@k8s-master demo]# vim ingress.yaml 
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: example-ingress
    spec:
    rules:
    - host: www.dagouzi.com
    http:
      paths:
      - backend:
          serviceName: deployment-service  
          servicePort: 80
    [root@k8s-master demo]# kubectl create -f ingress.yaml 
    [root@k8s-master demo]# kubectl get ingress -o wide
    NAME              HOSTS             ADDRESS   PORTS   AGE
    example-ingress   www.dagouzi.com             80      49m

    測試訪問,這里我是寫到了我的hosts文件中,要是做域名解析的話也是解析我們ingress的IP
    Kubernetes進階之ingress-nginx
    這種類型呢,只能給我們ingress-nginx分配到一個節(jié)點上,如果我們的ingress-nginx掛了就肯定訪問不到我們的應(yīng)用服務(wù)了
    要是解決這個問題,我們就可以將副本進行擴容,使用DaemonSet的形式可以使我們的節(jié)點都能起一個pod,把副本刪除,因為這里不需要副本
    ,需要把之前的資源刪除才能修改

    [root@k8s-master demo]# kubectl delete -f mandatory.yaml 
    [root@k8s-master demo]# kubectl get pod -n ingress-nginx -o wide
    NAME                             READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
    nginx-ingress-controller-4s5ck   1/1     Running   0          38s   192.168.30.22   k8s-node1   <none>           <none>
    nginx-ingress-controller-85rlq   1/1     Running   0          38s   192.168.30.23   k8s-node2   <none>           <none>

    查看我們的監(jiān)聽端口,node1/node2,上面都有,不過這樣的實例,比較適合小型的集群
    一般我們還可以在這樣DaemonSet控制器前面再跑兩個基于4層的負載均衡器
    User-->lb(vm-nginx/lvs/haproxy)--->node1/node2的IP,再使用算法,進行輪詢,---->pod

    [root@k8s-node1 ~]# netstat -anpt |grep 80
    tcp        0      0 0.0.0.0:18080           0.0.0.0:*               LISTEN      63219/nginx: master 
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      63219/nginx: master 
    tcp        0      0 127.0.0.1:33680         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33700         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33696         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33690         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:18080         127.0.0.1:33580         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33670         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33660         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33676         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33666         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33686         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33656         127.0.0.1:18080         TIME_WAIT   -                   
    tcp6       0      0 :::18080                :::*                    LISTEN      63219/nginx: master 
    tcp6       0      0 :::80                   :::*                    LISTEN      63219/nginx: master 
    [root@k8s-node1 ~]# netstat -anpt |grep 443
    tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      63219/nginx: master 
    tcp        0      0 192.168.30.22:34798     192.168.30.21:6443      ESTABLISHED 1992/kube-proxy     
    tcp        0      0 192.168.30.22:44344     10.1.0.1:443            ESTABLISHED 6556/flanneld       
    tcp        0      0 192.168.30.22:44872     192.168.30.21:6443      ESTABLISHED 1718/kubelet        
    tcp        0      0 192.168.30.22:58774     10.1.0.1:443            ESTABLISHED 63193/nginx-ingress 
    tcp6       0      0 :::443                  :::*                    LISTEN      63219/nginx: master

基于https形式進行訪問

[root@k8s-master cert]# cat cfssl.sh
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
[root@k8s-master cert]# sh cfssl.sh
[root@k8s-master cert]# ls
certs.sh  cfssl.sh
[root@k8s-master cert]# chmod +x certs.sh 
[root@k8s-master cert]# sh certs.sh 

為我們的域名生成證書,一個key,一個pem

[root@k8s-master cert]# ls
blog.ctnrs.com.csr       blog.ctnrs.com-key.pem  ca-config.json  ca-csr.json  ca.pem    cfssl.sh
blog.ctnrs.com-csr.json  blog.ctnrs.com.pem      ca.csr          ca-key.pem   certs.sh

把我們的key放入到我們的k8s中,使用ingress的時候使用這個key

[root@k8s-master cert]# kubectl create secret tls blog-ctnrs-com --cert=blog.ctnrs.com.pem --key=blog.ctnrs.com-key.pem
[root@k8s-master cert]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
blog-ctnrs-com        kubernetes.io/tls                     2      3m1s
default-token-m6b7h   kubernetes.io/service-account-token   3      9d

[root@k8s-master demo]# vim ingress-https.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tls-example-ingress
spec:
  tls:
  - hosts:
    - blog.ctnrs.com
    secretName: blog-ctnrs-com
  rules:
    - host: blog.ctnrs.com
      http:
        paths:
        - path: /
          backend:
            serviceName: deployment-service
            servicePort: 80
[root@k8s-master demo]# kubectl create -f ingress-https.yaml 
ingress.extensions/tls-example-ingress created
[root@k8s-master demo]# kubectl get ingress
NAME                  HOSTS             ADDRESS   PORTS     AGE
example-ingress       www.dagouzi.com             80        3h36m
tls-example-ingress   blog.ctnrs.com              80, 443   5s

Kubernetes進階之ingress-nginx
這里提示不安全,因為我們是用自簽的證書進行認證的,如果我們把買的證書替換了就可以正常去訪問了
Kubernetes進階之ingress-nginx
小結(jié):
暴露外部訪問的兩種方式
User --> lb(外部的負載均衡+keepalived) -->ingress controller (node1/node2)---->pod
User --》 node(vip ingress controller+keepalived主備)-->pod
Ingress(http/https) --> service --->pod

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI