您好,登錄后才能下訂單哦!
Kubernetes進階之ingress-nginx
目錄:
一 從外部訪問應用最佳方式
二 配置管理
三 數據卷與數據持久卷
四 再談有狀態應用部署
五 K8S 安全機制
說在前面的話,選擇nodeport的方式去暴露端口,那你需要得去判斷暴露的端口有沒有被占用,再創建新的應用會判斷端口有沒有被分配出去
nodeport本身是基于默認的iptables的代理模式做的網絡轉發,也就是SANT,DANT,基于四層的,做七層是做不了的,性能差一點,因為它需要防火墻的轉發和過濾。
一、從外部訪問應用最佳方式
[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去查看我們監聽的端口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
這種類型呢,只能給我們ingress-nginx分配到一個節點上,如果我們的ingress-nginx掛了就肯定訪問不到我們的應用服務了
要是解決這個問題,我們就可以將副本進行擴容,使用DaemonSet的形式可以使我們的節點都能起一個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>
查看我們的監聽端口,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
這里提示不安全,因為我們是用自簽的證書進行認證的,如果我們把買的證書替換了就可以正常去訪問了
小結:
暴露外部訪問的兩種方式
User --> lb(外部的負載均衡+keepalived) -->ingress controller (node1/node2)---->pod
User --》 node(vip ingress controller+keepalived主備)-->pod
Ingress(http/https) --> service --->pod
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。