k8s Ingress service 内部网络初探
在k8s内部的网络流转还是比较有趣的,接下来我们来了解一下client 是如何通过ingress、service在到具体服务提供的pod。实验的deployment.yaml:kind: DeploymentapiVersion: apps/v1metadata:name: nginx-deploymentspec:replicas: 3selector:...
在k8s内部的网络流转还是比较有趣的,接下来我们来了解一下client 是如何通过ingress、service在到具体服务提供的pod。
实验的deployment.yaml:
kind: Deployment
apiVersion: apps/v1
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
run: nginx-deployment
template:
metadata:
creationTimestamp: null
labels:
run: nginx-deployment
spec:
containers:
- name: nginx-deployment
image: 'wangyanglinux/myapp:v1'
ports:
- containerPort: 80
protocol: TCP
restartPolicy: Always
service:
kind: Service
apiVersion: v1
metadata:
name: demo-client
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
selector:
run: nginx-deployment
type: ClusterIP
Service到pod
接下来我们测试一下是否可以访问:
可以看到我们的所有pod都被service 轮询访问到了:
接下来我们来看一下ipvsadm记录的路由信息:
这里可以看到我们访问service的ip被转到了标签为 run: nginx-deployment 的pod上
Ingress到pod
我们继续延续上面所使用的yaml 也就是 deployment 和 service 在此基础上创建ingress:
这里加上了iphash但是不影响我们进行观察跳转信息,如果不需要直接将annotations去掉即可:
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: cxa-mynginxe
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
spec:
rules:
- host: testmynginx.wellnessshop.cn
http:
paths:
- path: /
backend:
serviceName: demo-client
servicePort: 80
我们可以看到ingress是有一个ip地址的 那么这个ip地址到底指向了哪里我们稍后再去研究。
因为我安装ingress的方式为NodePort暴露所以我们新查看一下client到底是怎么进入集群的:
首先去查看安装ingress时候自动创建并以NodePort暴露出去的svc
因为外网想要进入集群必然是通过NodePort 随机生成的端口,我这里是 80:30470/TCP,443:32452/TCP,也就是30470代表80端口32452代表443端口接下来我们在看一下啊ipvs里面记录的路由信息:
master:
node1:
我们在回头去看一下我们创建的ingress,看到我们创建的ingress指向了 安装ingress自动创建svc的内网地址:
查看一下ipvs
也就是说通过NodePort暴露出去的服务ip地址以及ingress自动创建的svc全都指向了同一个地址: 10.244.2.44 那么这个地址是什么呢?答案就是nginx-ingress-controller 这个pod
那么这个pod到底是个什么东西?我们进入到pod内部查看一下,原来就是一个nginx 吗? 其实这个nginx跟我们正常使用的nginx还是有很大区别的,至少从配置文件去看,我是看的有点懵!因为这个里面还有lua语言的部分东西。我是不太了解。
不过官方还算良心提供了查看的插件自行下载安装:
cat nginx.conf
之后我们通过命令查看一下:
kubectl ingress-nginx backends -n ingress-nginx
[
{
"name": "default-demo-client-80",
"service": {
"metadata": {
"creationTimestamp": null
},
"spec": {
"ports": [
{
"name": "http",
"protocol": "TCP",
"port": 80,
"targetPort": 80
}
],
"selector": {
"run": "nginx-deployment"
},
"clusterIP": "10.96.120.103",
"type": "ClusterIP",
"sessionAffinity": "None"
},
"status": {
"loadBalancer": {}
}
},
"port": 80,
"sslPassthrough": false,
"endpoints": [
{
"address": "10.244.1.122",
"port": "80"
},
{
"address": "10.244.2.42",
"port": "80"
},
{
"address": "10.244.2.48",
"port": "80"
}
],
"sessionAffinityConfig": {
"name": "cookie",
"mode": "",
"cookieSessionAffinity": {
"name": "route",
"locations": {
"testmynginx.wellnessshop.cn": [
"/"
]
}
}
},
"upstreamHashByConfig": {
"upstream-hash-by-subset-size": 3
},
"noServer": false,
"trafficShapingPolicy": {
"weight": 0,
"header": "",
"headerValue": "",
"cookie": ""
}
},
{
"name": "upstream-default-backend",
"port": 0,
"sslPassthrough": false,
"endpoints": [
{
"address": "127.0.0.1",
"port": "8181"
}
],
"sessionAffinityConfig": {
"name": "",
"mode": "",
"cookieSessionAffinity": {
"name": ""
}
},
"upstreamHashByConfig": {},
"noServer": false,
"trafficShapingPolicy": {
"weight": 0,
"header": "",
"headerValue": "",
"cookie": ""
}
}
]
到这里差不多也接近尾声了:
通过配置我们可以看到
第一块是service 的配置
第二块是解析后的pod地址
第三块是iphash的部分
我的理解是ingress 监视着service 时刻根据service pod的改变来解析pod的地址并改变配置文件以达到负载均衡的目的。
此命令也可以达到查看配置的目的:
kubectl -n ingress-nginx exec nginx-ingress-controller-7f74f657bd-l5s4t -- /dbg backends all
更多推荐
所有评论(0)