在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

https://kubernetes.github.io/ingress-nginx/kubectl-plugin/

之后我们通过命令查看一下:

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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐