• K8s: 集群内Pod通信机制之DNS


    集群内Pod通信机制之DNS

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

    1 ) DNS 概述

    • 可以使用附加组件 为 Kubernetes 集群设置 DNS 服务
    • 支持群集的 DNS 服务器(例如 CoreDNS)监视 Kubernetes API 中的新服务,并为每个服务创建一组DNS 记录
    • 如果在整个群集中都启用了 DNS,则所有 Pod 都应该能够通过其 DNS 名称自动解析服务
    • 例如,如果在 Kubernetes 命名空间 “my-ns” 中有一个名为 “my-service” 的服务
    • 则控制节点和DNS服务共同为 “my-service.my-ns” 创建 DNS 记录
    • “my-ns” 命名空间中的 Pod 应该能够通过简单地对 my-service 进行名称查找来找到它 (“my-service.my-ns” 也可以)
    • 其他命名空间中的Pod必须将名称限定为 my-service.my-ns
    • 这些名称将解析为为服务分配的群集 IP

    2 )DNS 实践

    • Kubernetes DNS 在群集上调度 DNS Pod 和 服务

    • 并配置 kubelet 以告知各个容器使用 DNS 服务的 IP来解析 DNS 名称

    • 其原理是通过这个DNS记录为每个pod提供一个单一的这个域名

    • 然后让集群的DNS服务都能够把这个pod IP给它解析出来

    • 我们不推荐进入这个pod的IP 地址,有一些特殊的pod,比如说静态的 pod

    • 它的IP实际上是不变的,在这种方式下,会需要一个域名来给它固定一下

    • 因为我们不会记这个IP地址,我们会记这个域名解析的地址

    • 当 K8s 需要给一个pod提供个固定的域名的时候,就会涉及到创建DNS记录的这个方式

    • A/AAAA 记录

      • “普通” 服务会以 my-svc.my-namespace.svc.cluster-domain.example
      • 这种名字的形式被分配一个DNS A 或 AAAA 记录,取决于服务的 IP 协议族
      • 该名称会解析成对应服务的集群 IP
    • Pods A/AAAA 记录

      • 经由 Deployment 或者 DaemonSet 所创建的所有 Pods 都会有如下 DNS 解析项与之对应:
        pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example.
        
        • 1
      • 就是我的 pod 创建之后,它会有一个pod IP地址, 然后 deployment 的名称再加上namespace
      • 再加上 svc.cluster-domain.example 这么一个路径来提供这个pod的一个访问路径
    • 然后,Pod本身提供 的 hostnamesubdomain 字段

      • 比如,创建 Pod 时其主机名取自 Pod 的 metadata.name 值
    • hostname,就是我的主机名, 这个pod我可以认为它是一个最小的主机,这个主机已经有个名字了,比如说叫 busybox1

    • 然后,它的子域名的名称就叫 default-subdomain ,或者叫 subdomain 也行

    • 然后域名就是你的公司名称,集群的名称,可以是你公司的域名,比如 x.com

    • 有了这样的参数之后,我们创建的pod,它就会自带 DNS这个域名,它的hostname 就会变成一个 full qualified 这么一个域名

    • 通过这个域名,能够让别人通过这个DNS服务来找到我

    • DNS服务,比如说我访问一个网站,x.com, 在公网上域名解析,会有 x.com 对应IP地址的解析记录

    • 所以, 通过访问这个域名,然后会拿到这个IP地址,之后,通过HTTP协议连到这个服务器上

    • 然后进行握手认证, 以及后续可能的cookie的校验, session的校验等来给我返回这个数据,这就是网络服务提供的一个过程

    • 创建 dns-pod.yaml

      apiVersion: v1
      kind: Service
      metadata:
        name: default-subdomain
      spec:
        selector:
          app: busybox
        clusterIP: None
        ports:
        - port: 1234 
          targetPort: 1234
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: busybox1
        labels:
          app: busybox
      spec:
        hostname: busybox-1
        subdomain: aaa
        containers:
        - name: busybox
          image: busybox
          command:
          - sleep
          - "3600"
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: busybox2
        labels:
          app: busybox
      spec:
        hostname: busybox-2
        subdomain: bbb
        containers: 
        - name: busybox
          image: busybox
          command:
          - sleep
          - "3600"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
    • $ kubectl create -f dns-pod.yaml 创建Service和2组pod

      service/default-subdomain created
      pod/busybox1 created
      pod/busybox2 created
      
      • 1
      • 2
      • 3
    • $ get po -w | grep busybox 查看pod的创建状态

      busybox1                        1/1     Running            0                 108s
      busybox2                        1/1     Running            0                 108s
      
      • 1
      • 2
    • $ kubectl exec -it busybox2 -- sh 登录一台pod

    • $ hostname busybox-2 这个是简短的

    • $ hostname -f busybox-2.bbb.default.svc.cluster.local 这个是全的,是dns上注册的地址

    • 有了上面全的域名地址,就可以访问到它这个pod了,通过这种方式,K8s提供了pod的dns注册机制

    • DNS 会为此名字提供一个 A 记录或 AAAA 记录,指向该 Pod 的 IP

    • “busybox1” 和 “busybox2” 这两个 Pod 分别具有它们自己的 A 或 AAAA 记录

  • 相关阅读:
    百度沙翔宇:百度云原生混部大规模落地实践之路
    JavaWeb——HTML(前端基础)
    一位平凡毕业生的大学四年
    Socks5代理IP在网络安全与跨境电商中的应用
    如何使用Vcluster实现Kubernetes中的多租户
    服务治理:几种开源限流算法库/应用软件介绍和使用
    Linux常用shell操作指令
    【java】3-获取线程引用与线程的属性
    LeetCode 67. 二进制求和
    React Hooks学习笔记
  • 原文地址:https://blog.csdn.net/Tyro_java/article/details/138041449