今天我把Ingress资源的来龙去脉整的七七八八,总结一句:K8S总能给我带来一些新花样。
Ingress流程图
- 流量先从nodePort进入K8S集群,分发到由DaemonSet控制的Ingress资源(Pod)。
- 这里需要注意的是Ingress不会把请求发送到sevice而是直接发送到后端Pod。
- 后端Pod收到请求,把所需资源提供给客户。
那问题来了,大家都知道Pod是有生命周期的,Pod的地址是会变化的Ingress是怎么获取最新Pod的地址的呢?
从图中可以看到后端Pod是有service的,但这个service不提供流量转发功能只为Ingress提供最新Pod的状态信息,Ingress再通过这些回调信息动态更改Ingress中的容器配置信息(nginx等..)
实验流程(无TLS):
第一步:
我们先把后端的Pod先建立起来。
apiVersion: apps/v1
kind: Deployment
mentadata:
name: nginx-backend
namespace: default
spec:
replicas: 3
selector:
matchlables:
app: nginx
version: v1.21
template:
mentadata:
labels:
app: nginx
version: v1.21
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1.21
ports:
name: nginx
containersPort: 80
第二步:
把后端Pod建完后,我们开始建负载管理后端Pod的service。
apiVersion: v1
kind: service
metadata:
name: nginx-svc
namespace: default
spec:
selector:
app: nginx
version: v1.21
ports:
port: 80
targetPort: 80
第三步:
配置Ingress的前提需要先去把https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/mandatory.yaml下载并启动,启动完就可以编写Ingress了。
apiVersion:extensions/v1beta1
kind: Ingress
metadata:
name: nginx-Ingress
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: www.wl.com
http:
paths:
- path:
backend:
serviceName: nginx-svc
servicePort: 80
第四步:
创建nodePort。
下载启动https://github.com/kubernetes/ingress-nginx/blob/master/deploy/baremetal/service-nodeport.yaml即可。
需要注意的这个yaml中没指定节点的端口会随机分配需要手动查看(hostPort手动指定)。
这就是创建最简单的Ingress的过程。
实验流程(TLS)
第一步:
和无TLS差不多先创建Pod。
apiVersion: apps/v1
kind: Deployment
mentadata:
name: tomcat-de
namespace: default
spec:
selector:
matchlables:
app: tomcat-de
version: v1.1
template:
metadata:
labels:
app: nginx
version: v1.1
containers:
- name: tomcat
image: tomcat
ports:
- name: tomcat
containersPort: 8080
第二步:
创建service。
apiVersion: apps/v1
kind: service
mentadata:
name: tomcat-svc
namespace: default
spec:
selector:
app: tomcat
version: v1.1
ports:
- name: tomcat
targetPort: 8080
protr: 8080
第三步:
创建TLS的key&secret。
openssl ganrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=www.zyr.com
kubectl create secret tls tomcat-tls --cert=tls.crt --key=tls.key
#创建名为tomcat-tls的secret ;--cert=tls.crt --key=tls.key指定tls文件
第四步:
创建Ingress。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tomcat-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- host:
- www.zyr.com
secretName: tomcat-tls
ruls:
- host: www.zyr.com
http:
paths:
- path:
backend:
serviceName: tomcat-svc
servicePort: 8080
第五步
创建nodePort,其内容和第一个实验里的一样。