前言
ingress objects with security control 一个具有安全控制的入口对象
what is ingress? 什么是入口
setup an ingress with services 使用服务设置入口
secure an ingress with tls 使用tls保护入口
参见官方文档
https://kubernetes.io/docs/concepts/services-networking/ingress/
一个API对象,用于管理对集群中服务的外部访问,通常是HTTP。
入口可以提供负载平衡,SSL和基于名称的虚拟主机。
1. 什么是ingress?
一般的外部访问应用的流程
- 通过yaml等资源创建一个nginx pod应用(也可以是其他应用,用nginx镜像就因为简单)
- 外部用户通过LoadBalancer(负载均衡)映射到NodePort(主机暴露的3000-32767任一端口)通过ClusterIP(服务在集群内的ip)到pod应用暴露的端口。
metallb裸金属的代理方式 还有traefik kong istio等是怎么玩的?也没有深入研究下traefik。个人使用就是用腾讯云的slb负载均衡使用tcp的方式绑定了work节点的80 443 Nodeport 然后service都是用了ClusterIP的方式。至于端口没有使用http https的方式是因为slb服务只能挂载一个证书。域名比较乱。为了方便管理,证书就使用在集群内用secret的方式管理挂载了。
kubernetes的网络通信有时间要深入研究一下了。自己太浮躁掌握的太浅。正巧今天看到了倪鹏飞大佬分享的如何快速掌握kubernetes网络,可以有时间看下:https://mp.weixin.qq.com/s/Tq1dq57Y0FPgzwPxzixHoA。
2 . 举一个例子简单http的例子
注: service1 service2就用默认的nginx apache镜像去区分了。index.html毕竟不一样。很容易区分出来部署效果。
2.1 创建ingress-nginx入口
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.40.2/deploy/static/provider/baremetal/deploy.yaml
嗯!镜像库被墙了,国外服务器下载了然后修改了标签上传到了自己的harbor仓库,然后直接修改deployment中image的标签。当然了我在work节点直接docker pull下了镜像。对于私有仓库正常的是建立一个秘钥secret在namespace,然后配置文件也添加上有pull镜像权限的secret的方式进行部署。
kubectl edit deployment ingress-nginx-controller -n ingress-nginx
OK ,访问master节点IP+nodeport 与work节点IP+nodeport都是可以正常返回的
2.2. 创建pod service 以及ingress入口
kubectl run pods1 --image=nginx -n ingress kubectl run pods2 --image=httpd -n ingress kubectl expose pod pods1 --port 80 --name service1 -n ingress kubectl expose pod pods2 --port 80 --name service2 -n ingress
注:随便编排在那一个命名空间都可以的,没有再default空间部署是因为我保留了再default空间的network policy。不想删除了,就建立一个新的空间没有网络规则的空间演示了。另外,这里是不是也可以玩下网络规则呢?题外话了哈哈。
创建ingress入口文件
2.3. 测试部署结果
curl 10.0.4.14:31279/service1 curl 10.0.4.14:31279/service2
两个service返回不一样的 一个nginx 一个apache简单测试通过。
3. 创建一个https的例子
3.1 首先确认一下https对外映射的端口是30437
3.2 关键一下直接访问是什么结果。以及熟悉下curl
curl https://10.0.2.17:30437/service1 curl https://10.0.2.17:30437/service2 curl https://10.0.2.17:30437/service1 -k curl https://10.0.2.17:30437/service2 -k
嗯 -k忽略证书。
3.3 curl -kv 跟踪下证书
curl https://10.0.2.17:30437/service1 -kv curl https://10.0.2.17:30437/service2 -kv
由上图可知ingress 入口默认的证书用的是kubernetes 自签名的通配符证书
3.4 创建自己的证书,并将证书以secret的方式挂载在相应命名空间
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes kubernets create secret tls secure-ingress --cert=cert.pem --key=key.pem -n ingress
3.5 修改ingress配置文件
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: secure-ingress namespace: ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: tls: - hosts: - secure-ingress.com secretName: secure-ingress rules: - host: secure-ingress.com http: paths: - path: /service1 pathType: Prefix backend: service: name: service1 port: number: 80 - path: /service2 pathType: Prefix backend: service: name: service2 port: number: 80
so 为什么还是kubernetes 自签名的通配符证书,创建自己的证书?因为配置文件里面的host是secure-ingress.com的域名方式。
3.6 正确的打开方式
3.6.1host添加解析
cat /etc/hosts 10.0.2.17 secure-ingress.com
3.6.2 另外一种方式curl 的用法 resolve
curl https://secure-ingress.com:30437/service1 -kv --resolve secure-ingress.com:30437:10.0.2.17
OK简单的跑完。欠了两个基础知识,一个curl的各种玩法, 还有kubernetes的网络通信原理。有机会补上