目录
- 一、Ingress服务简介
- 二、ingress部署
- 三、ingress管理多个service
- 四、ingress管理多个service
- 五、Ingress认证
- 六、Ingress地址重写
一、Ingress服务简介
单独用service暴露服务的方式,在实际生产环境中不太适用。
ClusterIP的方式只能在集群内部访问;NodePort方式,当服务在集群中运行过多时,NodePort的端口管理是灾难;LoadBalance方式受限于云平台,且通常在云平台部署ELB还需要额外的费用。
一种全局的、为了代理不同后端 Service 而设置的负载均衡服务,就是 Kubernetes 里的Ingress 服务。Ingress由两部分组成:Ingress controller和Ingress服务。
Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力。业界常用的各种反向代理项目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维护了对应的 Ingress Controller。
ingress服务的使用必须在策略网络中才能实现,如calico网络
二、ingress部署
用deployment控制器部署ingress-controller,创建一个LoadBalancer类型的service关联这组pod。LoadBalancer的service绑定了公网地址。真机进行域名解析之后,即可实现集群服务的对外暴露
真机将ingress的安装包发送给server1
server2建立存放deploy.yaml资源清单的目录
真机将ingress-nginx部署所需资源清单文件deploy.yaml发送给server2
在仓库中添加项目ingress-nginx
server1导入镜像,并将ingress相关镜像上传至仓库
server2修改yaml文件的镜像版本
执行deploy.yaml清单
查看所有namespace,可以看到新创建的ingress-nginx
查看ingress-nginx的所有信息,可以看到ingress-nginx-controller已经running
查看svc暴露端口为31074
客户端测试访问server2的31074端口,访问成功
三、ingress管理多个service
编写ingress.yaml文件,指定www1.westos.org对应的服务是myapp-svc
编辑svc.yaml文件,对应镜像是v1版本;
应用svc.yaml文件,查看服务,看到新创建的myapp-svc服务,集群ip是10.99.67.192
删除之前的ns.yaml配置文件以及相关ns,查看网络策略,已经清空;
查看myapp-svc的详细信息,ip为10.96.67.192,测试访问,可以看到访问成功
现在应用刚刚编辑的ingress.yaml配置,可以看到ingress-demo被创建
查看ingress-demo详细信息,可以看到域名为www1.westos.org,后端服务是myapp-svc,有三个服务后端实现负载均衡
修改 ingress-nginx-controller的服务类型为LoadBalancer
查看服务的类型已经变成了LoadBalancer,外部访问地址为172.25.36.20
在真机上加上本地解析;
访问域名,可以实现负载均衡
编辑deployment.yaml文件,指定镜像为myapp:v1,标签为nginx,副本为3个;
列出所有pod并查看标签,可以看到有标签为myapp的pod和标签为nginx的pod各有3个
编辑svc.yaml,配置nginx服务和myapp服务
应用配置,查看服务
查看myapp服务和nginx服务的详细信息
继续编写ingress.yaml文件,赋予域名匹配,用于匹配两个不同的service
应用该配置
此时有两个ingress信息
真机配置域名解析;
测试访问域名,可以访问到对应的service,且负载均衡
连接到ingress-nginx-controller容器,查看nginx.conf配置文件,可以看到nginx的服务代理
controller始终监听k8s的信息变更,把所作的配置动态加入ingress的/etc/nginx下的nginx配置文件
四、ingress管理多个service
现在想通过443端口HTTPS方式(加密)来访问服务,删除ingress-nginx,留下ingress-myapp用于实验测试
server2在ingress目录下生成证书和密钥
用生成的证书和key创建tls-secrets(secrets对应密钥)
编辑ingress文件,将前面的www2.westos.org部分注释掉,修改 www1.westos.org部分,使得用户在访问指定域名时重定向到指定tls端口,利用给定的tls-secrets走加密路径访问
执行ingress.yaml文件,并查看信息,可以看到已经配置了TLS加密
在真机上访问curl www1.westos.org,发现是308:表示重定向
curl www1.westos.org -I 查看重定向地址,查看到已经重定向到了httpds://www1.westos.org
curl命令不支持重定向(需要加-k参数),访问httpds://www1.westos.org
五、Ingress认证
因为认证需要系统自带的认证功能,因此安装httpd-tools认证生成插件
创建认证用户和密钥;
导入到新创建的secret中
查看所有secrets,可以刚才创建的secret
编辑文件ingress.yaml导入证书(在元数据下加入认证设置,设定认证类型以及认证的secrets)
执行ingress清单,查看证书信息是否已添加
访问测试,浏览器访问:www1.westos.org,发现需要输入账号和密码才可以登陆
六、Ingress地址重写
目的:把默认的发布页地址重写为一个特定的网页
修改文件ingress.yaml,将根目录重新定向到/hostname.html
进入myapp镜像中的容器
可以看到,/hostname.html就是/etc/hostname的别名,ingress.yaml文件中写/hostname.html,就等于写/etc/hostname,用来查看主机名
查看/etc/hostname,内容是myapp-deployment;
应用配置
客户端测试,访问www1.westos.org自动地址重写为www1.westos.org/hostname.html,改变了默认发布目录
当既有TLS安全访问也有地址重写,地址重写先触发
采用上述方式写死路径,在以后修改的时候会很不方便,可以使用下面方法动态读取路径
/ $ 2表示抓取第二列输入内容,指向的页面一定是在后端真实存在的;
path: /westos(/|$)(.) ,表示自动抓取westos后的内容。
$2匹配的是(.),something关键字触发重定向机制
$2指向页面一定是在后端真实存在的
修改ingress.yaml文件
应用ingress
客户端访问www1.westos.org显示404,找不到页面;
访问www1.westos.org/westos可以正常访问(此时自动跳转到www1.westos.org,忽略westos)
使用浏览器访问
www1.westos.org/westos可以访问成功
既有TLS也有地址重写的情况下,哪一个会先触发呢;
修改ingress.yaml配置文件,将根目录重定向到westos
应用配置后,测试访问,可以看到先进行了重定向,再触发了TLS
-k访问443加密端口,显示需要认证;
-u 后跟认证用户和密码即可查看
访问成功
测试负载均衡