如何在TKE集群玩转nginx-ingress

一:了解什么是ingress

kubernetes Ingess 是有2部分组成,Ingress Controller 和Ingress服务组成,常用的Ingress Controller 是ingress-nginx,工作的原理是:

Ingress Controller 会动态感知集群中的Ingress的规则变化,然后读取,动态生成Nginx的配置文件,最后注入到运行nginx的pod的中,然后会自动reload,配置生效。

用kubernetes Ingress 是由于它是7层调度,可以直接卸载https会话,代理的后端的pod可以直接使用明文的http协议。

而Service NodePort/Loadbalancer/ClusterIP 等类型,是4层的调度,做不到这点,然而现在https是一种趋势,所以在kubernetes 对外暴露服务得时候我们还是要选择Ingress。

简单理解:service 是四层负载均衡只能代理四层转发,ingress 是七层负载均衡用来代理七层转发

二:nginx-ingress需要使用哪些组件

1.Ingress-Controller: 核心组件,用于七层请求转发

2.ingress: 外部配置,ingress中配置的转发规则会自动注入到ingress-controller中

3.Ingress-Controller-service: Ingress-Controller组件的前段service,用于接入外部流量

4.nginx-ingress-default-backend: ingress-controller中没有对应转发规则的时候,请求自动分发到这个默认容器内(可以理解为网站文件中的404配置文件)

5.service: 底层容器服务,用于标识后段的pod信息(只起标识作用,真正的请求不经过service)

以上四个是部署nginx-ingress 的几个基于容器的组件,当然这里还要搭配到具体的ServiceAccount 和 Role 来使用,剩余部分这里不做详细解释。

请求流程图:

2.使用helm部署nginx-ingress

这里同样可以直接在控制台操作,如图:

点击完成,选择进入刚才创建的helm 应用,可以看到详细状态,都安装了哪些东西。如图:

从这里可以看到是安装了这么多的资源,接下来需要做的就是登录命令行,检查下这些资源是否都创建完成,是否都正常运行。(主要检查下面的两个service 和 deployment 资源)

只要这里资源都正常存在,确保 pod 都是正常running 状态,就可以了。

四:验证nginx-ingress

nginx-ingress-contraller 相关组件配置完成,接下来就需要验证nginx-ingress 转发了。

这里需要先部署一个用来被访问的容器资源,我们这里就使用最简单的nginx容器。

  • apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
  • kind: Deployment
  • metadata:
  • name: nginx
  • spec:
  • selector:
  • matchLabels:
  • app: nginx
  • replicas: 2 # tells deployment to run 2 pods matching the template
  • template:
  • metadata:
  • labels:
  • app: nginx
  • spec:
  • containers:
  • - name: nginx
  • image: nginx:1.12
  • ports:
  • - containerPort: 80
  • ---
  • apiVersion: v1
  • kind: Service
  • metadata:
  • name: nginx
  • namespace: default
  • spec:
  • clusterIP: None
  • ports:
  • - name: tcp-80-80
  • port: 80
  • protocol: TCP
  • targetPort: 80
  • selector:
  • app: nginx
  • sessionAffinity: None
  • type: ClusterIP
  • status:
  • loadBalancer: {}
展开

这里nginx的service 使用clusterIP Headless 的暴露方式,专门用于nginx-ingress 的访问方式。

具体Headless 的使用说明:不创建用于集群内访问的ClusterIP,访问Service名称时返回后端Pods IP地址,用于适配自有的服务发现机制。

重点来了:创建nginx-ingress ,配置转发规则

因为我们这里是在TKE 集群中创建,所以要规避qcloud 类型的ingress ,可以参考官网文档:

https://cloud.tencent.com/document/product/457/31711

  • apiVersion: extensions/v1beta1
  • kind: Ingress
  • metadata:
  • annotations:
  • kubernetes.io/ingress.class: nginx ## 可选值:qcloud(CLB类型ingress), nginx(nginx-ingress)
  • ## kubernetes.io/ingress.subnetId: subnet-xxxxxxxx ##若是创建CLB类型内网ingress需指定该条annotation
  • name: my-ingress
  • namespace: default
  • spec:
  • rules:
  • - host: www.kubernete.cn
  • http:
  • paths:
  • - backend:
  • serviceName: nginx
  • servicePort: 80
  • path: /
  • root@VM-20-7-ubuntu:/data/docker# kubectl get ingress | grep my-ingress
  • my-ingress www.kubernete.cn 192.144.216.168 80 29s
  • root@VM-20-7-ubuntu:/data/docker# kubectl describe ingress my-ingress
  • Name: my-ingress
  • Namespace: default
  • Address: 192.144.216.168
  • Default backend: default-http-backend:80 (<none>)
  • Rules:
  • Host Path Backends
  • ---- ---- --------
  • www.kubernete.cn
  • / nginx:80 (<none>)
  • Annotations:
  • kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx"},"name":"my-ingress","namespace":"default"},"spec":{"rules":[{"host":"www.kubernete.cn","http":{"paths":[{"backend":{"serviceName":"nginx","servicePort":80},"path":"/"}]}}]}}
  • kubernetes.io/ingress.class: nginx
  • Events:
  • Type Reason Age From Message
  • ---- ------ ---- ---- -------
  • Normal CREATE 112s nginx-ingress-controller Ingress default/my-ingress
  • Normal UPDATE 98s nginx-ingress-controller Ingress default/my-ingress

ps:正常来讲,创建nginx 类型ingress ,这里不该生成Address ,这里应该是TKE 底层逻辑问题,会自动生成Address ,这里的Address 地址是node IP (已跟产品侧提需求修改,这里先不关注Address 问题)

我们上面讲过,这里创建完ingress ,会自动把转发信息同步到ingress-controller 中,我们这就进入ingress-controller

所在的pod 观察下,对应的转发规则是否生成。

如果这里大家有其他问题,可以在下方评论处留言,一起学习。

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
<<上一篇
下一篇>>