Ingress 公开了从集群外部到集群内 services 的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
一种全局的、为了代理不同后端 Service 而设置的负载均衡服务,就是 Kubernetes 里的 Ingress 服务。
• Ingress由两部分组成:Ingress controller和Ingress服务。
• Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力。业界常用的各种 反向代理项目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维 护了对应的 Ingress Controller
官网:https://kubernetes.github.io/ingress-nginx/
下载ingress-nginx文件,得到deploy.yaml文件,编辑查看所需镜像:
在私有仓库主机从外界拉取ingress服务所需镜像,打标签推送到我们的私有仓库上
在deploy.yaml文件中更改镜像名称,与私有仓库中的镜像名相契合
应用deploy.yaml,可以查看到刚刚添加的 Ingress-nginx 的状态是Active:
kubectl get namespaces ##创建了一个以ingress-nginx命名的空间
kubectl get pod -n ingress-nginx ##查看pod时指定namespace
kubectl get all -n ingress-nginx ##查看ingress-nginx下的所有信息资源
kubectl get pod -n ingress-nginx -o wide ##查看pod运行在那些节点
kubectl get svc -n ingress-nginx ##获取到端口 31181
kubectl describe svc -n ingress-nginx ingress-nginx-controller ##查看服务详细信息
测试:
物理机上访问,访问到的是404报错,这是因为ingress-nginx上没有资源信息
结合ingress-nginx来做负载均衡
vim ingress.yml ##创建ingress服务,pod名称为ingress1,当在浏览器上访问www1.westos.org时负载到myservice上
kubectl apply -f ingress.yml ##应用ingress.yml
kubectl get ingress ##pod地址在server4
kubectl get svc -n ingress-nginx ##得到端口31181
测试:
先在物理机上添加解析,然后再访问
进入pod内部查看已经自动添加www1.westos.org域名信息:
添加www2.westos.org来验证可以自动添加域名解析信息:
创建两个service:
给myservice2添加pod(这里使用deployment控制器控制pod)
== 添加ingress服务:www2.westos.org,当在浏览器上访问www2.westos.org时负载到myservice2上==
添加www2.westos.org的解析
测试:成功访问
进入pod内部查看自动创建www2.westos.org域名信息
用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用 HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访 问服务
• 优点是整个请求链路最简单,性能相对NodePort模式更好。
• 缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress- controller pod。
• 比较适合大并发的生产环境使用。
kubectl get all -n ingress-nginx ##查看ingress-nginx下所有信息
vim deploy.yaml ## 编辑文件更改控制器类型为DaemSet,使用 HostNetwork直接把该pod与节点server4的网络打通
kubectl -n ingress-nginx delete deployments.apps ingress-nginx-controller ##删除deplyments.apps控制器
kubectl apply -f deploy.yaml ##应用deploy.yaml
kubectl get all -n ingress-nginx ##查看ingress-nginx下所有信息,可以看到控制器类型已经改为DaemonSet
删除ingress-nginx的service
查看server4节点:打开了80和443端口
不加端口直接访问服务,并实现负载均衡
设置访问www1.westos.org时进行轮询,访问www2.westos.org时保持会话
kubectl apply -f deploy.yaml ##将之前删除ingress-nginx的service重新加载进来
vim deploy.yaml ##设置访问www1.westos.org时进行轮询,访问www2.westos.org时保持会话
kubectl apply -f deploy.yaml ##应用deploy.yaml
kubectl get ingress ##pod成功分配到ingress1、ingress2
kubectl describe ingress ingress1 ##查看pod ingress1设置已经生效
kubectl describe ingress ingress2 ##查看pod ingress2设置已经生效
测试:
在浏览器上访问测试,访问www1.westos.org时是轮询调度
访问www2.westos.org时会话保持,成功实现
指定包含 TLS 私钥和证书的 secret Secret 来加密 Ingress
如果 Ingress 中的 TLS 配置部分指定了不同的主机,那么它们将根据通过 SNI TLS 扩展指定的主机名(如果 Ingress 控制器支持 SNI)在同一端口上进行复用。 TLS Secret 必须包含名为 tls.crt 和 tls.key 的密钥,这些密钥包含用于 TLS 的证书和私钥
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc" ##生成tls.crt 和 tls.key 的密钥
kubectl create secret tls tls-secret --key tls.key --cert tls.crt ##指定包含TLS私钥和证书的secret Secret 来加密Ingress
kubectl get secrets
vim tls.yml ##编辑tls.yml清单,Ingress 中的 TLS 配置指定www1.westos.org
kubectl apply -f tls.yml ##应用tls.yml
kubectl get ingress ##查看ingress信息
kubectl describe ingress nginx-tls
再次访问www1.westos.org时自动加密访问:
进入pod内部查看自动创建www1.westos.org加密认证信息