一、暴露应用的方式
1、NodePort:
NodePort服务是让外部请求直接访问服务的最原始方式,NodePort是在所有的节点(虚拟机)上开放指定的端口,所有发送到这个端口的请求都会直接转发到服务中的pod里;
NodePort服务的YAML文件如下:
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: my-nodeport-service 5 selector: 6 app: my-appspec 7 type: NodePort 8 ports: 9 - name: http 10 port: 80 11 targetPort: 80 12 nodePort: 30008 13 protocol: TCP
这种方式有一个“nodePort”的端口,能在节点上指定开放哪个端口,如果没有指定端口,它会选择一个随机端口。
这种方式的不足:
1)一个端口只能供一个服务使用
2)端口只能使用30000-32767之间的端口
3)如果节点/虚拟机的IP地址放生变化,需要人工进行处理;
三种端口说明:
nodePort:外部机器(windows浏览器)可访问的端口,比如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=30001,那么其它就可以通过浏览器访问scheme://node:30001访问到该服务;
targetPort:
容器的端口,与制作容器时暴露的端口一致(Dockerfile中的EXPOSE),例如docker.io官方的nginx暴露的是80端口;
port:
k8s中的各个服务之间访问的端口,虽然mysql容器暴露了3306端口,但是外部机器不能访问到mysql服务,因为他没有配置NodePort类型,该3306端口是集群内其他容器需要通过3306端口访问该服务。
2、LoadBalancer
LoadBalancer可以暴露服务,这种方式需要向云平台申请负载均衡器,目前很多云平台都支持,但是这种方式深度耦合了云平台(相当于是购买服务);从外部的访问通过负载均衡器LoadBalancer转发到后端的pod,具体如何实现要看云提供商。
3、Ingress
ingress英文翻译为入口,及外部请求进入k8s集群必经之口,如下图:
虽然k8s集群内部署的pod、service都有自己的IP,但是却无法提供外网访问,以前我们可以通过监听NodePort的方式暴露服务,但是这种方式并不灵活,生产环境也不建议使用;
Ingress是k8s集群中的一个API资源对象,相当于一个集群网关,我们可以自定义路由规则来转发、管理、暴露服务(一组pod),比较灵活,生产环境建议使用这种方式;
Ingress不是k8s内置的,需要单独安装,而且有多种类型Google Cloud Load Balancer,Nginx,Contour、Istio等等,我们这里选择官方维护Ingress Nginx。
使用Ingress Nginx的步骤:
二、Ingress Nginx部署
代码位置:https://github.com/kubernetes/ingress-nginx
ingress-nginx是使用NGINX作为反向代理和负载均衡器的k8s的Ingress控制器;
部署方式参考:https://kubernetes.github.io/ingress-nginx/deploy/
1、官方给的命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
2、推荐分布下载应用:
(1)wget
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
(2)修改下载下来的deploy.yaml文件,332行修改成阿里云镜像;329行新增一个网络配置
(3)应用deploy.yaml文件
kubectl apply -f deploy.yaml
(4)查看ingress状态
三、创建并应用Ingress规则
1、配置规则
以启用nginx为例,配置ingress规则如下:
2、应用规则
应用规则命令:kubectl apply -f ingress-nginx-rule.yaml
应用规则时若报如下的错:
先检查看正在运行的ingress规则
kubectl get ing(ress)
发现该规则已在运行后,删除该规则:
kubectl delete ing(ress) k8s-ingress # 规则名称
应用规则时若报如下错误:
解决办法:
再次执行应用规则命令:
最后检查规则是否已存在:
四、访问页面