十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
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
[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
nginx-ingress-controller-85rlq 1/1 Running 0 38s 192.168.30.23 k8s-node2
查看我们的监听端口,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
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。