<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何管理 Docker 容器和 Kubernetes Pod 的 DNS

          共 26423字,需瀏覽 53分鐘

           ·

          2023-08-11 23:41


          DNS簡(jiǎn)介

          DNS服務(wù)是域名系統(tǒng)的縮寫, 英文全稱:Domain Name System,將域名和IP地址相互映射。在容器環(huán)境中,DNS至關(guān)重要,例如在Kubernetes集群中,通常一組Pod由一個(gè)Service負(fù)載,但是Service的IP地址有可能需要變動(dòng),那么就可以讓Pod通過域名的方式去訪問Service,Pod無(wú)需理會(huì)IP地址的變化。

          Docker DNS

          Docker link

          Docker link是一個(gè)遺留的特性,在新版本的Docker中,一般不推薦使用。簡(jiǎn)單來說Docker link就是把兩個(gè)容器連接起來,容器可以使用容器名進(jìn)行通信,而不需要依賴ip地址(其實(shí)就是在容器的/etc/hosts文件添加了host記錄,原本容器之間的IP就是通的,只是我們?cè)黾恿薶ost記錄,可以不用IP去訪問)

          創(chuàng)建容器centos-1:

          [root@host1 ~]# docker run -itd --name centos-1  registry.cn-shanghai.aliyuncs.com/public-namespace/cr7-centos7-tool:v2

          創(chuàng)建容器centos-2,使用--link name:alias,name就是要訪問的目標(biāo)機(jī)器,alias就是自定義的別名。

          [root@host1 ~]# docker run -itd --name centos-2  --link centos-1:centos-1-alias  registry.cn-shanghai.aliyuncs.com/public-namespace/cr7-centos7-tool:v2

          查看容器centos-2的/etc/hosts文件:

          [root@host1 ~]# docker exec centos-2 cat /etc/hosts
          127.0.0.1       localhost
          ::1     localhost ip6-localhost ip6-loopback
          fe00::0 ip6-localnet
          ff00::0 ip6-mcastprefix
          ff02::1 ip6-allnodes
          ff02::2 ip6-allrouters
          172.18.0.2      centos-1-alias 9dde6339057a centos-1  #容器centos-1的host記錄
          172.18.0.3      f1a7e5fa3d96  #容器centos-2自身的host記錄

          意味著centos-2可以用centos-1-alias,9dde6339057a,centos-1來訪問原先創(chuàng)建的容器。centos-1是不可以通過hostname訪問centos-2的。

          [root@host1 ~]# docker exec centos-2 ping centos-1-alias
          PING centos-1-alias (172.18.0.2) 56(84) bytes of data.
          64 bytes from centos-1-alias (172.18.0.2): icmp_seq=1 ttl=64 time=0.174 ms
          ^C
          [root@host1 ~]# docker exec centos-2 ping centos-1
          PING centos-1-alias (172.18.0.2) 56(84) bytes of data.
          64 bytes from centos-1-alias (172.18.0.2): icmp_seq=1 ttl=64 time=1.37 ms
          64 bytes from centos-1-alias (172.18.0.2): icmp_seq=2 ttl=64 time=0.523 ms
          ^C
          [root@host1 ~]# docker exec centos-2 ping 9dde6339057a
          PING centos-1-alias (172.18.0.2) 56(84) bytes of data.
          64 bytes from centos-1-alias (172.18.0.2): icmp_seq=1 ttl=64 time=2.59 ms
          64 bytes from centos-1-alias (172.18.0.2): icmp_seq=2 ttl=64 time=3.75 ms

          Embedded DNS

          從Docker 1.10開始,Docker提供了一個(gè)內(nèi)置的DNS服務(wù)器,當(dāng)創(chuàng)建的容器屬于自定義網(wǎng)絡(luò)時(shí),容器的/etc/resolv.conf會(huì)使用內(nèi)置的DNS服務(wù)器(地址永遠(yuǎn)是127.0.0.11)來解析相同自定義網(wǎng)絡(luò)內(nèi)的其他容器。

          為了向后兼容,default bridge網(wǎng)絡(luò)的DNS配置沒有改變,默認(rèn)的docker網(wǎng)絡(luò)使用的是宿主機(jī)的/etc/resolv.conf的配置。

          創(chuàng)建一個(gè)自定義網(wǎng)絡(luò):

          [root@host1 ~]# docker network create my-network

          #bridge,host,none為docker默認(rèn)創(chuàng)建的網(wǎng)絡(luò)
          [root@host1 ~]# docker network ls
          NETWORK ID          NAME                DRIVER              SCOPE
          2115f17cd9d0        bridge              bridge              local
          19accfa096cf        host                host                local
          a23c8b371c7f        my-network          bridge              local
          0a33edc20fae        none                null                local

          分別創(chuàng)建兩個(gè)容器屬于自定義網(wǎng)絡(luò)my-network中:

          [root@host1 ~]# docker run -itd --name centos-3 --net my-network  registry.cn-shanghai.aliyuncs.com/public-namespace/cr7-centos7-tool:v2 
          [root@host1 ~]# docker run -itd --name centos-4 --net my-network  registry.cn-shanghai.aliyuncs.com/public-namespace/cr7-centos7-tool:v2  

          查看容器centos-4的/etc/hosts和/etc/resolv.conf,可以看到nameserver添加的IP為127.0.0.11的Embedded DNS:

          #/etc/hosts中沒有配置對(duì)方的host記錄
          [root@host1 ~]# docker exec centos-4 cat /etc/hosts
          127.0.0.1       localhost
          ::1     localhost ip6-localhost ip6-loopback
          fe00::0 ip6-localnet
          ff00::0 ip6-mcastprefix
          ff02::1 ip6-allnodes
          ff02::2 ip6-allrouters
          172.19.0.3      555281f37ea3

          #/etc/resolv.conf配置了dns服務(wù)器127.0.0.11
          [root@host1 ~]# docker exec centos-4 cat /etc/resolv.conf
          nameserver 127.0.0.11
          options ndots:0

          此時(shí)centos-3和centos-4可以互相解析:

          [root@host1 ~]# docker exec centos-4 ping centos-3
          PING centos-3 (172.19.0.2) 56(84) bytes of data.
          64 bytes from centos-3.my-network (172.19.0.2): icmp_seq=1 ttl=64 time=0.128 ms
          64 bytes from centos-3.my-network (172.19.0.2): icmp_seq=2 ttl=64 time=0.078 ms
          64 bytes from centos-3.my-network (172.19.0.2): icmp_seq=3 ttl=64 time=0.103 ms
          ^C

          [root@host1 ~]# docker exec centos-3 ping centos-4
          PING centos-4 (172.19.0.3) 56(84) bytes of data.
          64 bytes from centos-4.my-network (172.19.0.3): icmp_seq=1 ttl=64 time=0.087 ms
          64 bytes from centos-4.my-network (172.19.0.3): icmp_seq=2 ttl=64 time=0.101 ms
          64 bytes from centos-4.my-network (172.19.0.3): icmp_seq=3 ttl=64 time=0.076 ms
          ^C

          Docker DNS配置

          方式一:docker run (針對(duì)單個(gè)容器)

          Flag Description
          --dns 指定DNS服務(wù)器地址,如果容器不能訪問指定的所有ip地址,則會(huì)使用8.8.8.8作為DNS服務(wù)器地址(Docker默認(rèn)定義的)
          --dns-search 當(dāng)容器訪問一個(gè)不包括完全域名的主機(jī)名時(shí),在該主機(jī)名后面添加dns-search指定的域名后綴,例如容器訪問centos-1,dns-search配置的是example.com,則會(huì)解析成centos-1.example.com
          --dns-opt options ndots:5的含義是當(dāng)查詢的域名字符串內(nèi)的點(diǎn)字符數(shù)量大于等于ndots值(5)時(shí),則認(rèn)為是完整域名,直接解析,不會(huì)走 search 域
          --hostname 指定容器hostname

          方式二:daemon.json

          nameserver只針對(duì)docker默認(rèn)網(wǎng)絡(luò)所有容器,dns-search和dns-opts針對(duì)所有網(wǎng)絡(luò)容器。

          {
               "dns": ["114.114.114.114","223.5.5.5"],
               "dns-opts":["ndots:5"],
               "dns-search":["example.com"]

          Kubernetes DNS

          在kubernetes中,有以下4中DNS策略,可以通過dnsPolicy指定:

          • Default: Pod從運(yùn)行所在的節(jié)點(diǎn)繼承名稱解析配置,就是該 Pod 的 DNS 配置會(huì)跟宿主機(jī)完全一致。。Default 不是默認(rèn)的 DNS 策略。如果未明確指定dnsPolicy,則使用 ClusterFirst。
          • ClusterFirst: 它會(huì)預(yù)先把 kube-dns(或 CoreDNS)的信息當(dāng)作預(yù)設(shè)參數(shù)寫入到該 Pod 內(nèi)的 DNS 配置。不過ClusterFirst 還有一個(gè)沖突,如果你的 Pod 設(shè)置了 HostNetwork=true,則 ClusterFirst 就會(huì)被強(qiáng)制轉(zhuǎn)換成 Default。
          • ClusterFirstWithHostNet: 對(duì)于與 hostNetwork(網(wǎng)絡(luò)接口使用的是宿主機(jī)的) 一起運(yùn)行的 Pod,應(yīng)顯式設(shè)置其DNS策略 ClusterFirstWithHostNet,他將同時(shí)解決default和ClusterFirst的DNS解析。如果不加上dnsPolicy: ClusterFirstWithHostNet ,Pod默認(rèn)使用所在宿主主機(jī)使用的DNS,這樣也會(huì)導(dǎo)致容器內(nèi)不能通過service name 訪問k8s集群中其他Pod。
          • None: 表示會(huì)清除 Pod 預(yù)設(shè)的 DNS 配置,當(dāng) dnsPolicy 設(shè)置成這個(gè)值之后,Kubernetes 不會(huì)為 Pod 預(yù)先載入任何自身邏輯判斷得到的 DNS 配置。因此若要將 dnsPolicy 的值設(shè)為 None,為了避免 Pod 里面沒有配置任何 DNS參數(shù),至少需要在dnsConfig中設(shè)置nameservers的參數(shù)。

          在 Kubernetes 1.11 及其以后版本中,推薦使用 CoreDNS, kubeadm 默認(rèn)會(huì)安裝 CoreDNS。當(dāng)Pod向CoreDNS發(fā)起DNS解析請(qǐng)求時(shí),CoreDNS先會(huì)自己嘗試解析,如果無(wú)法解析該域名,會(huì)將DNS請(qǐng)求交給CoreDNS的Pod所在的宿主機(jī),讓宿主機(jī)嘗試解析。

          本次實(shí)驗(yàn)kubernetes集群中coredns service的地址是10.247.3.10。

          ? kubectl get svc -n kube-system
          NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
          coredns ClusterIP 10.247.3.10 <none> 53/UDP,53/TCP,8080/TCP 13d

          宿主機(jī)的/etc/resolv.conf文件如下:

          [root@cr7-k8s-85091-ydy99 ~]# cat /etc/resolv.conf
          # Generated by NetworkManager
          search openstacklocal
          nameserver 100.125.1.250
          nameserver 100.125.64.250
          options single-request-reopen

          CluterFirst

          CluterFirst是kubernetes集群中默認(rèn)的DNS策略,這里是一個(gè)普通的Pod yaml文件,沒有指定dnsPolicy。

          apiVersion: v1
          kind: Pod
          metadata:
            name: busybox
            namespace: default
          spec:
            containers:
            - image: busybox:1.28
              command:
                - sleep
                - "3600"
              imagePullPolicy: IfNotPresent
              name: busybox
            restartPolicy: Always

          創(chuàng)建Pod后,進(jìn)入該P(yáng)od查看/etc/resolv.conf配置,可以看到nameserver為CoreDNS的service的地址。

          # cat /etc/resolv.conf
          nameserver 10.247.3.10
          search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal
          options single-request-reopen timeout:2 ndots:5

          如果在Pod的yaml文件中指定了DNS參數(shù),會(huì)和默認(rèn)的ClusterFirst的配置疊加:

          apiVersion: v1
          kind: Pod
          metadata:
            name: busybox
            namespace: default
          spec:
            containers:
            - image: busybox:1.28
              command:
                - sleep
                - "3600"
              imagePullPolicy: IfNotPresent
              name: busybox
            restartPolicy: Always
            dnsConfig:
              nameservers:
                - 1.2.3.4
              searches:
                - ns1.svc.cluster-domain.example
                - my.dns.search.suffix
              options:
                - name: ndots
                  value: "2"
                - name: edns0
          # cat /etc/resolv.conf
          nameserver 10.247.3.10
          nameserver 1.2.3.4
          search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal ns1.svc.cluster-domain.example my.dns.search.suffix
          options timeout:2 ndots:2 edns0 single-request-reopen

          Default

          dnsPolicy為Default模式時(shí),Pod使用的是宿主機(jī)的DNS配置:

          apiVersion: v1
          kind: Pod
          metadata:
            name: busybox
            namespace: default
          spec:
            containers:
            - image: busybox:1.28
              command:
                - sleep
                - "3600"
              imagePullPolicy: IfNotPresent
              name: busybox
            restartPolicy: Always
            dnsPolicy: Default
          # cat /etc/resolv.conf
          nameserver 100.125.1.250
          nameserver 100.125.64.250
          search openstacklocal
          options single-request-reopen timeout:2

          ClusterFirstWithHostNet

          當(dāng)Pod使用了hostNetwork模式時(shí),Pod使用的是宿主機(jī)的網(wǎng)卡:

          #進(jìn)入pod后查看
          # ifconfig
          ......
          eth0      Link encap:Ethernet  HWaddr FA:16:3E:6D:14:9B
                    inet addr:192.168.0.8  Bcast:192.168.0.255  Mask:255.255.255.0
                    inet6 addr: fe80::f816:3eff:fe6d:149b/64 Scope:Link
                    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                    RX packets:44239432 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:47841007 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:1000
                    RX bytes:19884749467 (18.5 GiB)  TX bytes:34713001649 (32.3 GiB)
          ......   

          當(dāng)Pod使用hostNetwork模式,并且未指定dnsPolicy為ClusterFirstWithHostNet時(shí),Pod會(huì)使用的宿主機(jī)的DNS:

          apiVersion: v1
          kind: Pod
          metadata:
            name: busybox
            namespace: default
          spec:
            containers:
            - image: busybox:1.28
              command:
                - sleep
                - "3600"
              imagePullPolicy: IfNotPresent
              name: busybox
            restartPolicy: Always
            hostNetwork: true

          此時(shí)Pod無(wú)法通過域名訪問Kubernetes集群內(nèi)部:

          #hostNetwork模式如果不指定dnsPolicy則使用default模式,使用的宿主機(jī)的DNS
          # cat /etc/resolv.conf
          nameserver 100.125.1.250
          nameserver 100.125.64.250
          search openstacklocal
          options single-request-reopen timeout:2

          #pod可以通過域名訪問外網(wǎng),但是無(wú)法通過域名訪問kubernetes集群內(nèi)部
          # ping baidu.com
          PING baidu.com (39.156.69.79): 56 data bytes
          64 bytes from 39.156.69.79: seq=0 ttl=49 time=29.193 ms
          64 bytes from 39.156.69.79: seq=1 ttl=49 time=29.104 ms
          ^C
          --- baidu.com ping statistics ---
          2 packets transmitted, 2 packets received, 0% packet loss
          round-trip min/avg/max = 29.104/29.148/29.193 ms
          # ping nginx
          ping: bad address 'nginx'

          如果Pod在hostNetwork模式下要通過域名的方式訪問kubernetes集群內(nèi)的服務(wù),需要指定dnsPolicy為ClusterFirstWithHostNet:

          apiVersion: v1
          kind: Pod
          metadata:
            name: busybox
            namespace: default
          spec:
            containers:
            - image: busybox:1.28
              command:
                - sleep
                - "3600"
              imagePullPolicy: IfNotPresent
              name: busybox
            restartPolicy: Always
            hostNetwork: true
            dnsPolicy: ClusterFirstWithHostNet 

          此時(shí)查看Pod的DNS配置,可以看到nameserver使用的是CoreDNS:

          #ClusterFirstWithHostNet模式DNS使用的是coredns的地址,
          # cat /etc/resolv.conf
          nameserver 10.247.3.10
          search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal
          options single-request-reopen timeout:2 ndots:5

          #可以通過域名訪問外網(wǎng),也通過域名訪問集群內(nèi)部
          # nslookup baidu.com
          Server:    10.247.3.10
          Address 1: 10.247.3.10 coredns.kube-system.svc.cluster.local

          Name:      baidu.com
          Address 1: 39.156.69.79
          Address 2: 220.181.38.148
          #
          # nslookup nginx
          Server:    10.247.3.10
          Address 1: 10.247.3.10 coredns.kube-system.svc.cluster.local

          Name:      nginx
          Address 1: 10.247.60.222 nginx.default.svc.cluster.local
          #

          None

          當(dāng)設(shè)置dnsPolicy為None時(shí),不會(huì)使用Kubernetes集群和宿主機(jī)的 DNS 策略,但是必須自己配置dnsConfig。

          apiVersion: v1
          kind: Pod
          metadata:
            name: busybox
            namespace: default
          spec:
            containers:
            - image: busybox:1.28
              command:
                - sleep
                - "3600"
              imagePullPolicy: IfNotPresent
              name: busybox
            restartPolicy: Always
            dnsPolicy: None
            dnsConfig:
              nameservers:
                - 1.2.3.4
          / # cat /etc/resolv.conf
          nameserver 1.2.3.4
          options single-request-reopen timeout:2

          StatefulSet 和 Service

          • StatefulSet Pod 具有唯一的標(biāo)識(shí),該標(biāo)識(shí)包括順序標(biāo)識(shí)、穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)和穩(wěn)定的存儲(chǔ)。該標(biāo)識(shí)和 Pod 是綁定的,不管它被調(diào)度在哪個(gè)節(jié)點(diǎn)上。
          • StatefulSet 中的每個(gè) Pod 根據(jù) StatefulSet 的名稱和 Pod 的序號(hào)派生出它的主機(jī)名。組合主機(jī)名的格式為$(StatefulSet 名稱)-$(序號(hào))。下例將會(huì)創(chuàng)建三個(gè)名稱分別為 web-0、web-1、web-2 的 Pod。StatefulSet 可以使用 Headless Service(無(wú)頭服務(wù))控制它的 Pod 的網(wǎng)絡(luò)域。管理域的這個(gè)服務(wù)的格式為: $(服務(wù)名稱).$(命名空間).svc.cluster.local,其中 cluster.local 是集群域。一旦每個(gè) Pod 創(chuàng)建成功,就會(huì)得到一個(gè)匹配的 DNS 子域,格式為:$(pod 名稱).$(所屬服務(wù)的 DNS 域名),其中所屬服務(wù)由 StatefulSet 的 serviceName 域來設(shè)定。
          • 通過域名去訪問Headless Service負(fù)載的Pod是不走iptables的,通過域名去訪問ClusterIP負(fù)載的Pod要走Iptables。
          • 下面給出一些選擇集群域、服務(wù)名、StatefulSet 名、及其怎樣影響 StatefulSet 的 Pod 上的 DNS 名稱的示例:
          Cluster Domain Service (ns/name) StatefulSet (ns/name) StatefulSet Domain Pod DNS Pod Hostname
          cluster.local default/nginx default/web nginx.default.svc.cluster.local web-{0..N-1}.nginx.default.svc.cluster.local web-{0..N-1}
          cluster.local foo/nginx foo/web nginx.foo.svc.cluster.local web-{0..N-1}.nginx.foo.svc.cluster.local web-{0..N-1}
          kube.local foo/nginx foo/web nginx.foo.svc.kube.local web-{0..N-1}.nginx.foo.svc.kube.local web-{0..N-1}

          Headless Service

          首先我們將StatefulSet和Headless Service結(jié)合使用,(通常情況下是這么做的):

          apiVersion: v1
          kind: Service
          metadata:
            name: headless-nginx
            labels:
              app: nginx
          spec:
            ports:
            - port: 80
              name: web
            clusterIP: None
            selector:
              app: nginx
          ---
          apiVersion: apps/v1
          kind: StatefulSet
          metadata:
            name: web
          spec:
            selector:
              matchLabels:
                app: nginx 
            serviceName: headless-nginx
            replicas: 3 
            template:
              metadata:
                labels:
                  app: nginx 
              spec:
                containers:
                - name: nginx
                  image: nginx:1.7.9
                  ports:
                  - containerPort: 80
                    name: web

          查看創(chuàng)建的StatefulSet的Pod,命名是有規(guī)律的按照0,1,2的順序遞增。

          root@master01:~/yaml/service# kubectl get pod -o wide
          NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE       NOMINATED NODE   READINESS GATES
          web-0                    1/1     Running   0          6s      192.168.5.59     worker01   <none>           <none>
          web-1                    1/1     Running   0          5s      192.168.30.117   worker02   <none>           <none>
          web-2                    1/1     Running   0          3s      192.168.5.58     worker01   <none>           <none>

          查看創(chuàng)建的Headless Service,可以看到ClusterIP為None:

          root@master01:~/yaml/service# kubectl get svc
          NAME              TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)   AGE
          headless-nginx    ClusterIP      None             <none>          80/TCP    15m

          找一個(gè)相同namespace的Pod來解析該Headless Service:

          root@master01:~/yaml/service# kubectl exec busybox1 -- nslookup headless-nginx
          Server:    10.96.0.10
          Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

          #
          解析出來的ip地址為3個(gè)StatefulSet的pod的ip
          Name:      headless-nginx
          Address 1: 192.168.30.117 web-1.headless-nginx.default.svc.cluster.local
          Address 2: 192.168.5.59 web-0.headless-nginx.default.svc.cluster.local
          Address 3: 192.168.5.58 web-2.headless-nginx.default.svc.cluster.local

          查看default命名空間下的Pod的/etc/resolv.conf配置:

          root@master01:~/yaml/service# kubectl exec busybox1 -- cat /etc/resolv.conf           
          nameserver 10.96.0.10
          search default.svc.cluster.local svc.cluster.local cluster.local
          options ndots:5

          在不同的 namespace 下的 Pod 通過 Service 訪問的時(shí)候,需要在 Service name 后面加上 .<namespace名字>。

          root@master01:~/yaml/service# kubectl exec busybox2 -n kube-system  -- nslookup  headless-nginx.default  
          Server:    10.96.0.10
          Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

          Name:      headless-nginx.default.svc.cluster.local
          Address 1: 192.168.5.58 web-2.headless-nginx.default.svc.cluster.local
          Address 2: 192.168.5.59 web-0.headless-nginx.default.svc.cluster.local
          Address 3: 192.168.30.117 web-1.headless-nginx.default.svc.cluster.local

          查看kube-system命名空間下的Pod的/etc/resolv.conf配置:

          root@master01:~/yaml/service# kubectl exec busybox2 -n kube-system  -- cat /etc/resolv.conf             nameserver 10.96.0.10
          search kube-system.svc.cluster.local svc.cluster.local cluster.local 
          options ndots:5

          ClusterIP Service

          現(xiàn)在我們將StatefulSet和ClusterIP Service結(jié)合使用:

          apiVersion: v1
          kind: Service
          metadata:
            name: clusterip-nginx
            labels:
              app: nginx
          #ClusterIP不為None則表示該Service有ClusterIP    
          spec:
            ports:
            - port: 80
              name: web
            selector:
              app: nginx

          查看創(chuàng)建的Service:

          root@master01:~/yaml/service# kubectl get svc
          NAME              TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)   AGE
          clusterip-nginx   ClusterIP      10.110.176.201   <none>          80/TCP    13s

          此時(shí)用Pod解析域名只能得到ClusterIP地址,無(wú)法得到Pod的IP地址:

          root@master01:~/yaml/service# kubectl exec busybox1 -- nslookup clusterip-nginx
          Server:    10.96.0.10
          Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

          Name:      clusterip-nginx
          Address 1: 10.110.176.201 clusterip-nginx.default.svc.cluster.local

          Pod 的 hostname 與 subdomain

          在 Kubernetes 中,如果不指定 Pod 的 hostname,其默認(rèn)為 pod.metadata.name,通過 spec.hostname 字段可以自定義;另外還可以給 Pod 設(shè)置 subdomain,通過 spec.subdomain 字段。比如下面這個(gè)例子:

          創(chuàng)建一個(gè)Nginx Pod,指定Pod的hostname和subdomain:

          apiVersion: v1
          kind: Pod
          metadata:
            name: nginx
            labels:
              name: nginx
          spec:
            hostname: domain-test
            subdomain: subdomain-test
            containers:
            - image: nginx
              name: nginx
          ---
          apiVersion: v1
          kind: Service
          metadata:
            name: subdomain-test
          spec:
            selector:
              name: nginx
            ports:
            - port: 80
              targetPort: 80
              protocol: TCP

          可以查看這個(gè) Pod 的 hostname 和 hosts 文件:

          [root@localhost ~]# kubectl get po -o wide
          NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
          busybox-5bbb5d7ff7-dh68j 1/1 Running 0 112m 10.244.1.246 172-16-105-2 <none> <none>
          nginx 1/1 Running 0 2m 10.244.1.253 172-16-105-2 <none> <none>
          [root@localhost ~]# kubectl exec -it nginx bash
          root@domain-test:/# cat /etc/hosts
          # Kubernetes-managed hosts file.
          127.0.0.1 localhost
          ::1 localhost ip6-localhost ip6-loopback
          fe00::0 ip6-localnet
          fe00::0 ip6-mcastprefix
          fe00::1 ip6-allnodes
          fe00::2 ip6-allrouters
          10.244.1.253 domain-test.subdomain-test.default.svc.cluster.local domain-test
          root@domain-test:/#

          在 busybox 容器中通過域名訪問這個(gè)Pod:

          [root@localhost ~]# kubectl exec -it busybox-5bbb5d7ff7-dh68j sh
          / # wget domain-test.subdomain-test
          Connecting to domain-test.subdomain-test (10.244.1.253:80)
          saving to 'index.html'
          index.html 100% |*****************************************************| 612 0:00:00 ETA
          'index.html' saved


          本文轉(zhuǎn)載自:「Se7en的架構(gòu)筆記」,原文:https://url.hi-linux.com/UdvyQ,版權(quán)歸原作者所有。



          最近很多小伙伴找我要一些程序員必備資料,于是我翻出了壓箱底的寶藏,免費(fèi)分享給大家!


          掃描海報(bào)二維碼免費(fèi)獲取。


          瀏覽 369
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费 无码 国产在线怀 | 丰满人妻一区二区三区 | 免费v在线观看 | 日本色图15p | 天天添夜夜添免费视频 |