K8s: 集群内Pod通信机制之环境变量

集群内Pod通信机制之环境变量

  • Kubernetes 支持两种基本的服务发现模式 ------ 环境变量和 DNS

1 ) 环境变量概述

  • 在Service里面通过label selector选择器去匹配到对应的pod

  • 然后把流量导给对应的pod进行这个service的一个服务提供

  • 也就是说你只要访问service的IP地址,就能获取后端pod提供的内容

  • 不用关心Pod到底在哪?它的ip是什么?,所以可以理解为它是一个固定的虚拟地址

  • 现在,我们更关心集群内部怎么进行通信的

  • 在集群内部,前端怎么访问这个后端,比如说我前端的APP要访问后端的微服务的这个容器

  • 写了service的地址之后,是怎么跟后端的service进行通信的

  • 也就是底层的实现环节,怎么找到它的地址

  • k8s 其实上涉及到服务发现的这个模式,就说我这个Service定义好了之后

  • 其他服务的Pod怎么知道这个service已经好了,然后去知道它的IP地址

  • 举一个例子

    • 一个名称为 "my-nginx" 的 Service 暴露了 TCP 端口 80

    • 同时给它分配了 Cluster IP 地址 10.1.180.155,这个 Service 生成了如下环境变量:

      conf 复制代码
      MY_NGINX_PORT_80_TCP_PORT=80
      MY_NGINX_PORT_80_TCP_PROTO=tcp
      MY_NGINX_PORT_80_TCP_ADDR=10.1.180.155
  • 在环境变量这种模式里面,nginx会通过这种service环境变量注入的方式注入到pod容器里面

  • 这样的话容器在访问其他service的时候,就是通过service的名称

  • 它有一个规则的转化,然后访问对应的一个地址,上面只是一个说明下面进行实践

2 )环境变量实践

  • 注意:基于环境变量时,service要比pod要先创建,才能把这个环境变量写容器里面去

2.1 这里我们先反过来,先创建 deployment 再创建 service

  • 借用之前的 development 先运行起来

    yaml 复制代码
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-dep-nginx # 这个是 Deployment 对象的名称
    spec:
      selector:
        matchLabels: # 匹配标签
          run: my-dep-nginx # 运行匹配的 my-nginx 容器
      replicas: 2 # 2个副本,会创建 2个 pod
      template: # 定义模板
        metadata:
          labels:
            run: my-dep-nginx
        spec: # 模板说明
          containers:
          - name: my-dep-nginx
            image: nginx
            resources:
              limits:
                memory: "32Mi"
                cpu: "100m"
            ports:
            - containerPort: 80
  • $ kubectl apply -f dep-my-nginx.yaml 创建pod

    conf 复制代码
    deployment.apps/my-dep-nginx created
  • $ kubectl get po -w | grep my-dep 查看pod运行状态

    conf 复制代码
    my-dep-nginx-7776c5d85c-gfzxd   1/1     Running            0               37s
    my-dep-nginx-7776c5d85c-w8bqq   1/1     Running            0               37s

2.2 再创建 service:svc-my-nginx.yaml

  • 创建 svc-my-nginx.yaml

    yaml 复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: my-svc-nginx
      labels:
        run: my-dep-nginx
    spec:
      ports:
      - port: 80
        protocol: TCP
      selector:
        run: my-dep-nginx
  • $ kubectl get svc 查看服务

    conf 复制代码
    NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
    kubernetes     ClusterIP   10.1.0.1       <none>        443/TCP   4d1h
    my-svc-nginx   ClusterIP   10.1.237.190   <none>        80/TCP    23m
  • 好现在服务已经运行起来了, 现在进入pod容器中

  • $ kubectl exec -it my-dep-nginx-7776c5d85c-w8bqq -- sh

  • $ printenv | grep MY_SVC

    • 现在看到,先创建 development 的 pod集群是看不到服务相关的环境变量的
    • 也就是没有注入成功

2.3 调整顺序,这时候已经有 service 了,删除 development, 重新启动 development

  • $ kubectl delete -f dep-my-nginx.yaml 先删除 development

    conf 复制代码
    deployment.apps "my-dep-nginx" deleted
  • $ kubectl apply -f dep-my-nginx.yaml 在已有Service的情况下,重建 development

    conf 复制代码
    deployment.apps/my-dep-nginx created
  • $ kubectl get po -w | grep my-dep 等待容器启动完成

    conf 复制代码
    my-dep-nginx-7776c5d85c-fx9pt   1/1     Running            0                 115s
    my-dep-nginx-7776c5d85c-hktm2   1/1     Running            0                 115s
  • $ kubectl exec -it my-dep-nginx-7776c5d85c-fx9pt -- sh 进入其中之一

  • $ printenv | grep MY_SVC

    conf 复制代码
    MY_SVC_NGINX_SERVICE_HOST=10.1.237.190
    MY_SVC_NGINX_SERVICE_PORT=80
    MY_SVC_NGINX_PORT=tcp://10.1.237.190:80
    MY_SVC_NGINX_PORT_80_TCP_ADDR=10.1.237.190
    MY_SVC_NGINX_PORT_80_TCP_PORT=80
    MY_SVC_NGINX_PORT_80_TCP_PROTO=tcp
    MY_SVC_NGINX_PORT_80_TCP=tcp://10.1.237.190:80
  • 现在已经注入成功了

相关推荐
Dongwoo Jeong43 分钟前
微服务架构(MSA)是如何诞生的?
微服务·云原生·架构
半旧夜夏1 小时前
【保姆级】微服务组件环境搭建(Docker Compose版)
java·linux·spring cloud·微服务·云原生·容器
阿里云云原生1 小时前
实战解析:如何用自然语言驱动混沌工程?Blade AI Agent 实现故障演练全链路自动化
云原生
张忠琳2 小时前
【kubernetes v1.21】(kubelet 1)Kubelet 核心架构与启动流程
云原生·架构·kubernetes·kubelet
宇明一不急3 小时前
k8s HPA storageclass configmap
云原生·容器·kubernetes
ZzzZZzzzZZZzzzz…5 小时前
Docker + K8s集群搭建实战:1 Master+2 Node,含Harbor私有仓库与软路由
docker·云原生·容器·kubernetes·容器编排·集群部署·cri-dockerd
xier_ran6 小时前
【infra之路】模块三:Kubernetes (下) — 阶段一毕业项目:在集群里跑 PyTorch 训练
pytorch·容器·kubernetes
Waay6 小时前
K8s新手实操|emptyDir卷超详细实战(附完整命令+核心理解)
云原生·容器·kubernetes
liux35287 小时前
K8s 核心接口:CNI、CSI、CRI、LB 一篇讲透
云原生·容器·kubernetes
香气袭人知骤暖7 小时前
人大金仓(KingbaseES)Docker 容器自动备份方案
运维·docker·容器