我的K8s之路(2)-ingress实现k8s服务访问


上回写了一篇入门级的小文,做为这一系列的开始,毕竟什么都是从部署做起的。从k8s本身来说,无论是pod、控制器、svc,还是配置运行条件等等,都是基本内容,只要是接触过,多少都有了解,这也是我每回讲课带班必讲的。但是有一个配置,严格上来说不能算是k8s本身提供的功能,应该说是k8s与其它软件配合实现的,这一部分在CKA考试是没有的,但在实际生产环境是经常会用m 8 _ ) ( d { ` w到的,一般的k8s培训也都会讲到,这回就跟大伙简单说说:ingress

ingress英译过来的e R w +意思是进入或入境权,这与8 d N : W 8它要实现的功能很是帖f X n Y / p y J (切。为什么会有它的存在呢?这与k8s本身提供s n C ) M = k ` 服务暴露功能有关,k8s存在的意义在于容器编排,容器的意义是运行应用,所以k8s实际的功能是根据不同的业务需求编排运行应用。而应用运行的意义是要能被访问,这就牵扯到了如何将服务暴露出去接受访问


k8s本身能够创建services资源暴露服务,目前来说提供三种服务暴露方式:
1. clusterIP,这种方式只提供[ t j n D x .k8s集群内部访问,如果应用之间要通G I ?讯,或做测试是很方便的,但无法提供外部访问。

2. nodePort,这种方式是能够提供集群外部访问的,但是有个先天不足,这种暴露服务需要集群内每个节点都提g h . (供相同的服务端口,无论访问哪个节点的IPv ; # n 8 Y o W:PORT,都可以通过service指向M ] z m / @ f Z后端运行的控制器或POD。其端口是随机的Q # { T ),范围在30000到32767之间。既然是随机的,就有不确定性,很多路由、防火墙等这些网络设备配置上有一定困难,而且也并不是标准访问端口。个人认为最大的不足还不是端口号,是一个服务导致d v |每个节点都要暴露端口,实用性不是很高。

3. 负载均衡,这种方式k8s只提供内部支持,真正的实现y ^ / ? C d & L要靠外部云供应商提供的负^ S @ 载均衡器= ] K B ; |技术,功能落地是没有问题,但会有产生费用,客户还是希望少花多办事的。

基于以上几点,这才有P # R } } h q了第三方解决方案~ h a D 8 7 },即ingress。ingress的功能实现在于能够将外部的访问,准备路由到对应的service服务,由两部分组成:

1、 Kubernett ) M 6 { & )es Ingress
2、 Kubernetes Ingress Controller

Kubernetes Ingress是k8s的源生资源,也提供API访问。主要定义了外部通过IP或域名、或加路径访问{ ) e i } n V S n集群y W n j 5 U h 5内部的service。但是光有它还不够,具体实现要靠Ingress Controller来做。
Ingress Controller即] # ] u h ] Xingess控制器,是在定义ingress资源之前,手动部署在k8s集群的,与其它应用一样也是一个POD,它的作用是随时与k8s的ingress APB l N | t f a mI进行通讯,检6 0 # f I ,查是否要为外部访问路由到service创建规则。
我的K8s之路(2)-ingress实现k8s服务访问
网上找了张图,简单了点,不过基本上是这样的(懒得自己画了:)
这两个说白了等于是一个定义了访问规则,一个来实现路R E 9由访问。


上述说的是概念定义,现在业界实现ingress功能的有那么几种,比较多的是用nginx来实现,还有Traefik、HAproxy,包括G, M 4 h 8 L f pKE等等,这次的测试就以nn 6 * W N (ginx来做。

还是F Z - I M @ D & M用上次部署的源生k8s,先将ingress controller的部署文件搞到,在github的仓库里有

git clone httT X D c ps://github.com/kubernetes/ingress-nginx.git

我git的是kubernetes提供的ingress-nginx,全下载大约有个100兆多点。其实还有nginx提供的,不过那个没咋用过。
我的K8s之路(2)-ingress实现k8s服务访问
在老版本中,是分成多个yL G ! S c V raml文件,由mandatory.yaml统一执行,新版本(2.1.0)合成一个yaml,除了对应k8s部署外,还有对公有云的。
另外,老版本中要自行添加? e J I D /节点选择器,新版本中已经配了选择条件

ingress-ready=true
所以在执行之前,要先给一个节点配上label
kubectl label nodes kN f d e ! 18s-node01 ingress-ready=true
执行部署:

我的K8s之路(2)-ingress实现k8s服务访问
会自动创建namespace,名为ingress-nginx。在X p J ~ | n这个ns内创建角色、控制器、服务l O 8 I $ o K 1等等等等。。。。。。

创建好之后查看执行结果
我的K8s之路(2)-ingress实现k8s服务访问
现在开始测试,首先创建服务,再将其暴露出来,这个用命令或者yaml都可以,本次测试主2 o ; 8 ] Y L E O要针对ingress,所以其它的就简单实现了

kubectl run --image=nginx test01
kubeci R x Y Rtl run --image=nginx test02
先用命令创建两个服务,查看创建结果
我的K8s之路(2)-ingress实现k8s服务访问
再将两个服务暴露出来
kubectl expose pod test01 --port=80 --target-port=80
kubectl expose pod test02 --port=80 --target-port=80
我的K8s之路(2)-ingress实现k8s服务访问
用curl命令验证上图中两个clusterIP能否访问,访问正常的情况下,我将test01与test02内nginx的index.html更换内容以便于区分,以test01为例:
root@k8s-master:~# kubectl exec -it test01 bash
root@test01:~# cd /usr/M ; ] p j share/7 C 1 ) 1 D Snginx/
echo "test01-curl" > inde- + i j Vx.html
测试访问
我的K8s之路(2)-ingress实现k8s服务访问
好,接下来部署ingress,制定访问规则,编写yaml之前先查看ingess的API 版本
kubectl explain ingress
我的K8s之路(2)-ingress实现k8s服务访问
编写ingress的YAML
apiVersion: e= x c E -xtensions/v1beta1
kind: Ingress
metadata:
name: ingress-example
annotations:
nginx.ingrB * Q b h z | 8ess.kubernetes.io/rewrite-target: /
spec:
rules:

  • host: test.redflag.com
    http:
    paths:
    • path: /red
      bacW | & = h Zkend:
      serviceName/ ? # 1 b H: test01
      servicePort: 80
    • path: /flagq T 5 ^ J @ u 3
      backend:
      serviceName: test02
      servicePort: 80

(也许是编辑器原因,记得将o都换成-)
其中,inM m 8 S C b Cgress的API是用的刚查到T b X 4 ( { h F的版本,访问域名为test.redflag.com,4 ~ / D l 6 L刚创建的两个服务与端口分别对应/red与/flag两路径访问,查看部署结果。
我的K8s之路(2)-ingress实现k8s服务访问
查看详细信息

kubecta r M t c Y Kl describe ingress ingress-exampD c kle
我的K8s之路(2)-ingress实现k8s服务访问
其中访问路径对应的IP地址,是cailico网络插件的地址,这是上回部署环境时装的网络插件。再查看service服务的后端IP,看是否一致。
kubectl get ene = o L 4 Y u Edpoints
我的K8s之路(2)-ingress实现k8s服务访问
好,现在开始验证部署结果,看是否能访3 7 h ] N V s n问,简单实现我不配外部DNS解析了,就用本地解析,修改master节点的/etc/hosts文件,在节点1或节点2后边配本地解析都可以。
我的K8s之路(2)-ingress实现k8s服务访问
在master节点测试访问
我的K8s之路(2)-ingress实现k8s服务访问
到这里还没完,再看看ingress-controller的实现方式,进入ingress-controller的pod
kX 8 ; Z rubectl -n ingress-ngc [ L ~ |inx ey 3 T z # i Vxec -it ingress-nginx-controller-cc8dd9868-lr5xf bash
查看nginx.conf文件
cat /etc/ngi@ e l X o h f lnx/nginx.conf
找到下图这段
我的K8s之路(2)-ingress实现k8s服务访问
这段就是访问test.redflag.com的配置部分的开始。
下边分别是/red与/flag的访F l d } o d {问配置
我的K8s之路(2)-ingress实现k8s服务访问
我的K8s之路(2)-ingress实现k8s服务访问


根据以: _ 3 f b L上配置,nginx的ingress-controller的配置访问,是由7 a : nginx访问代理来实现的,当ingress创建后,ingres! ^ % o D .s-controller通过监控与ingress API交互,根据ingress定义的访问规则,自动配置ng* O ? p 9inx访问代理,不只是一个域名两个路径,多个域I @ ^ #名多路径也可以实现。