k8s-暴露容器应用/扩容

一、暴露应用的方式

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    # 规则名称  

  

  应用规则时若报如下错误:

  

   解决办法:

  

   再次执行应用规则命令:

  

   最后检查规则是否已存在:

  

四、访问页面

  

五、容器动态扩容

1、找到yaml配置文件:

 2、再次应用更新:

 

posted @ 2021-06-25 00:44  漫步sch  阅读(540)  评论(0编辑  收藏  举报