Kubernetes1.10 Cluster内DNSの挙動確認

首先

Kubernetesの公式ページに、多くのチュートリアルが掲載されています。
Kubernetesの勉強の一環で、チュートリアルを消化していきます。
今回は Kubernetesクラスタ内部で使用するDNSを勉強していきます。

通常のServiceの名前解決

Kubernetesクラスタのすべてのサービスは、DNS名が割り当てられています。KubernetesがPodを作成した時に、Pod内部の /etc/resolv.conf に、ネームスペースとデフォルトドメインが含まれた search list が自動的に設定されます。

同一ネームスペース内で名前解決(PodtoService)

Service名が foo1 で Namespaceが bar のものを作成して、動作を確認します。

首先,创建一个名为”命名空间栏”的条目。

[root@sugi-kubernetes110-master01 ~(default kubernetes-admin)]# kubectl create namespace bar
namespace "bar" created

kubensコマンドを使用して、bar ネームスペースへ切り替えます

[root@sugi-kubernetes110-master01 ~(default kubernetes-admin)]# kubens bar
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "bar".
[root@sugi-kubernetes110-master01 ~(bar kubernetes-admin)]# 

为了创建CentOS的Pod,生成以下清单文件。

cat <<'EOF' > /root/kube_yaml/dns/centos_pod.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: centos
spec:
  selector:
    matchLabels:
      app: centos
  replicas: 2
  template:
    metadata:
      labels:
        app: centos
    spec:
      containers:
      - name: centos
        image: centos
        command: [ "sleep", "3600" ]
EOF

创建CentOS的Pod

kubectl create -f /root/kube_yaml/dns/centos_pod.yaml

我查看一下Pod清单。

[root@sugi-kubernetes110-master01 ~(bar kubernetes-admin)]# kubectl get pod -o wide 
NAME                     READY     STATUS        RESTARTS   AGE       IP            NODE
centos-749b5dff6-hhhnr   1/1       Running       0          32s       10.244.1.26   sugi-kubernetes110-node01.localdomain
centos-749b5dff6-xwdfw   1/1       Running       0          32s       10.244.2.24   sugi-kubernetes110-node02.localdomain

次に Service foo1 を作成します

cat <<'EOF' > /root/kube_yaml/dns/foo1_service.yaml
apiVersion: v1
kind: Service
metadata:
  name: foo1
  labels:
    app: foo1
spec:
  ports:
  - protocol: TCP
    name: foo1portname
    port: 6379
    targetPort: 6380
  selector:
    app: foo1
EOF

Serviceを作成します

kubectl create -f /root/kube_yaml/dns/foo1_service.yaml

我会查看服务列表。

[root@sugi-kubernetes110-master01 ~(bar kubernetes-admin)]# kubectl get svc -o wide --all-namespaces
NAMESPACE     NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE       SELECTOR
bar           foo1         ClusterIP   10.109.77.128   <none>        6379/TCP        3m        app=foo1
default       kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP         3d        <none>
kube-system   kube-dns     ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP   3d        k8s-app=kube-dns

确认服务的详细信息

[root@sugi-kubernetes110-master01 ~(bar kubernetes-admin)]# kubectl describe svc foo1 
Name:              foo1
Namespace:         bar
Labels:            app=foo1
Annotations:       <none>
Selector:          app=foo1
Type:              ClusterIP
IP:                10.109.77.128
Port:              foo1portname  6379/TCP
TargetPort:        6380/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

CentOSのshellへログインします

kubectl exec -it centos-749b5dff6-hhhnr bash

nslookup及びdigをインストールします

yum install bind-utils

我们会检查 resolv.conf 文件
kube-dns 服务的 ClusterIP 被用作 nameserver。
此外,search 也以 namespace 名称.svc.默认域名 的形式定义。

[root@centos-749b5dff6-hhhnr /]# cat /etc/resolv.conf 
nameserver 10.96.0.10
search bar.svc.cluster.local svc.cluster.local cluster.local localdomain
options ndots:5

当对 foo1 进行 nslookup 操作时,可以进行名称解析。
与 bar 命名空间中的 foo1 服务关联的 ClusterIP 可以进行名称解析。

[root@centos-749b5dff6-hhhnr /]# nslookup foo1
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   foo1.bar.svc.cluster.local
Address: 10.109.77.128

IPアドレスはわかりましたが、ClusterIPに紐づくポート番号が、上記では確認できません。
KubernetesのDNSでは、サービスのIPアドレスに紐づくポート番号を通知するため、SRV レコードを使用しています。

为了在Kubernetes中使用SRV记录,需要按照下面的方式指定Service的名称和协议字段。

略
spec:
  ports:
  - protocol: TCP
    name: foo1portname
    port: 6379
    targetPort: 6380
略

如果要使用nslookup获取SRV记录来对此进行操作,您可以按照以下命令以对话方式执行。

[root@centos-749b5dff6-hhhnr /]# nslookup 
> set type=SRV
> _foo1portname._tcp.foo1
Server:         10.96.0.10
Address:        10.96.0.10#53

_foo1portname._tcp.foo1.bar.svc.cluster.local   service = 10 100 6379 foo1.bar.svc.cluster.local.
> exit
[root@centos-749b5dff6-hhhnr /]# 

名前解決の結果を確認すると、「ervice = 10 100 6379 foo1.bar.svc.cluster.local.」となっています。
数字の意味は下記の内容となっています。

    • 10 : プライオリティ

 

    • 100 : ウェイト

 

    6379 : ポート番号 (Serviceのportで指定した番号)

整合起来,如果Pod中的应用程序想要访问另一个Pod,则可以考虑以下两种情况。

    • ServiceのIPアドレスを知りたい場合 : 「サービス名」を使用してKubernetesのDNSに問い合わせすることで、IPアドレスを正引きすることが出来ます。

 

    ServiceのIPアドレスと、ポート番号を知りたい場合 : 「サービス名」「ポート名」「プロトコル」を使用してKubernetesのDNSに問い合わせすることで、IPアドレスとポート番号を取得することが出来ます。

从另一个命名空间中进行名称解析

创建一个名为quux的命名空间。

[root@sugi-kubernetes110-master01 ~(bar kubernetes-admin)]# kubectl create namespace quux
namespace "quux" created

ネームスペースの切り替え

[root@sugi-kubernetes110-master01 ~(bar kubernetes-admin)]# kubens quux
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "quux".
[root@sugi-kubernetes110-master01 ~(quux kubernetes-admin)]# 

创建CentOS的Pod

cat <<'EOF' > /root/kube_yaml/dns/centos_pod.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: centos
spec:
  selector:
    matchLabels:
      app: centos
  replicas: 1
  template:
    metadata:
      labels:
        app: centos
    spec:
      containers:
      - name: centos
        image: centos
        command: [ "sleep", "3600" ]
EOF

创建部署

[root@sugi-kubernetes110-master01 ~(quux kubernetes-admin)]# kubectl create -f /root/kube_yaml/dns/centos_pod.yaml
deployment.apps "centos" created

确认

[root@sugi-kubernetes110-master01 ~(quux kubernetes-admin)]# kubectl get pods -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
centos-749b5dff6-plkc8   1/1       Running   0          24s       10.244.2.25   sugi-kubernetes110-node02.localdomain

登录到bash

[root@sugi-kubernetes110-master01 ~(quux kubernetes-admin)]# kubectl exec centos-749b5dff6-plkc8 -it bash
[root@centos-749b5dff6-plkc8 /]# 

安装bind-utils

yum install -y bind-utils

resolv.confを確認します
quux ネームスペースなので、search lust には quux が含まれています

[root@centos-749b5dff6-plkc8 /]# cat /etc/resolv.conf 
nameserver 10.96.0.10
search quux.svc.cluster.local svc.cluster.local cluster.local localdomain
options ndots:5

如果省略了后缀,无法解析 bar 命名空间中的 foo1。

[root@centos-749b5dff6-plkc8 /]# nslookup foo1   
Server:         10.96.0.10
Address:        10.96.0.10#53

** server can't find foo1: NXDOMAIN

通过使用foo1.bar,可以进行名称解析。

[root@centos-749b5dff6-plkc8 /]# nslookup foo1.bar
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   foo1.bar.svc.cluster.local
Address: 10.109.77.128

同样,您也可以获取SRV记录。

[root@centos-749b5dff6-plkc8 /]# nslookup 
> set type=SRV
> _foo1portname._tcp.foo1.bar
Server:         10.96.0.10
Address:        10.96.0.10#53

_foo1portname._tcp.foo1.bar.svc.cluster.local   service = 10 100 6379 foo1.bar.svc.cluster.local.

能否访问具有不同命名空间的服务取决于不同的设置。
如果网络插件通过NetworkPolicy进行隔离,那么它们将无法通信。
请注意,我正在使用Flannel进行验证。由于目前尚未实现NetworkPolicy,所以即使在不同的命名空间之间也可以进行连接。

无头服务的名称解析

Headlessサービスとは、Serviceを利用したLoadbalanceが不要な時に使用します。Serviceを作成するときに、spec.clusterIP を none にすると作成することが出来ます。
Headlessサービスを使用すると、KuberenetesのLoadbalanceサービスを使用せずに、独自に実装した方法でサービスディスカバリーを行う事が出来ます。

在无头服务中,kube-proxy没有任何作用,同时负载均衡和代理也不工作。
这时DNS的分配取决于Service的选择器定义。

选择器存在

将Service的selector设置为 “有” 时,当从Pod解析Service的名称时,将采用解析属于该Service的所有Pod的IP地址的方式。
通常的Service,如前面的测试中验证的那样,会解析与Service关联的ClusterIP。
Headless是一种特殊的方式,通常不会使用。

考虑什么时候使用可能有以下模式。

    • ClusterIPサービスのロードバランスに偏りがあり、クライアント側で任意にロードバランスしたい

 

    Kubernetesのポリシーには違反するが、複数あるPodのうち1個のみ使用してアクセスしたい

在使用selectors中创建无头服务时,endpoints控制器将创建Endpoint对象并更改DNS记录。

为了检查是否启用了Headless选择器,我们将创建以下的部署和服务。

cat <<'EOF' > /root/kube_yaml/dns/nginx-deployment.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80
EOF

创建一个Deployment。

kubectl apply -f /root/kube_yaml/dns/nginx-deployment.yaml

为了创建Service,我们需要在下面创建一个清单文件。

cat <<'EOF' > /root/kube_yaml/dns/nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  ports:
  - protocol: TCP
    name: nginx-service-portname
    port: 15315
    targetPort: 80
  clusterIP: None
  selector:
    app: nginx
EOF

我会创建一个服务。

kubectl apply -f /root/kube_yaml/dns/nginx-service.yaml

我会查看列表。

[root@sugi-kubernetes110-master01 dns(bar kubernetes-admin)]# kubectl get svc -o wide
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE       SELECTOR
nginx-service   ClusterIP   None         <none>        15315/TCP   7s        app=nginx

我会仔细核实。 (Wǒ huì .)

[root@sugi-kubernetes110-master01 dns(bar kubernetes-admin)]# kubectl describe svc nginx-service 
Name:              nginx-service
Namespace:         bar
Labels:            app=nginx
Annotations:       kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-service","namespace":"bar"},"spec":{"clusterIP"...
Selector:          app=nginx
Type:              ClusterIP
IP:                None
Port:              nginx-service-portname  15315/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.27:80,10.244.2.26:80
Session Affinity:  None
Events:            <none>

我将查看以下端点的列表。它与服务进行协作,自动创建。

[root@sugi-kubernetes110-master01 dns(bar kubernetes-admin)]# kubectl get endpoints 
NAME            ENDPOINTS                       AGE
nginx-service   10.244.1.27:80,10.244.2.26:80   1m

使用在端点上的IP地址是自动分配给Pod的IP地址

[root@sugi-kubernetes110-master01 dns(bar kubernetes-admin)]# kubectl get pods -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
nginx-5c9845d857-5tvlt   1/1       Running   0          9m        10.244.1.27   sugi-kubernetes110-node01.localdomain
nginx-5c9845d857-vlgl2   1/1       Running   0          9m        10.244.2.26   sugi-kubernetes110-node02.localdomain

nslookupを実行するために、CentOSのPodを作成し、bashにログインします

kubectl create -f /root/kube_yaml/dns/centos_pod.yaml
kubectl exec centos-749b5dff6-bpcrb -it bash

nslookupをインストールします

yum install -y bind-utils

nslookupでHeadlessServiceの名前解決を実施すると全てのPodのIPアドレスがreturnされていることを確認できます。

[root@centos-749b5dff6-bpcrb /]# nslookup nginx-service
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   nginx-service.bar.svc.cluster.local
Address: 10.244.1.27
Name:   nginx-service.bar.svc.cluster.local
Address: 10.244.2.26

没有选择器(ServiceType: ExternalName的别名)

在没有选择器的情况下创建无头服务时,无法创建端点对象。作为DNS的CNAME,服务的外部名称将被注册。

为了确认操作,将创建以下清单文件。

cat <<'EOF' > /root/kube_yaml/dns/nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-headless-noselector
  labels:
    app: nginx
spec:
  type: ExternalName
  externalName: 10.132.253.39
EOF

服务的创建

kubectl apply -f /root/kube_yaml/dns/nginx-service.yaml

Serviceの一覧確認

[root@sugi-kubernetes110-master01 ~(bar kubernetes-admin)]# kubectl get svc
NAME                        TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)     AGE
nginx-headless-noselector   ExternalName   <none>       10.132.253.39   <none>      5s
nginx-service               ClusterIP      None         <none>          15315/TCP   53m

查看细节

[root@sugi-kubernetes110-master01 ~(bar kubernetes-admin)]# kubectl describe svc nginx-headless-noselector 
Name:              nginx-headless-noselector
Namespace:         bar
Labels:            app=nginx
Annotations:       kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-headless-noselector","namespace":"bar"},"spec":...
Selector:          <none>
Type:              ExternalName
IP:                
External Name:     10.132.253.39
Session Affinity:  None
Events:            <none>

当在Pod中执行Service的名称解析时,可以解析上述的ExternalIP。
如果指定IP地址,则会返回A记录。

[root@centos-749b5dff6-bpcrb /]# nslookup nginx-headless-noselector 
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   nginx-headless-noselector.bar.svc.cluster.local
Address: 10.132.253.39

用主机名代替IP地址来选择另一种模式。

cat <<'EOF' > /root/kube_yaml/dns/nginx-service-name.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-headless-noselector
  labels:
    app: nginx
spec:
  type: ExternalName
  externalName: www.google.co.jp
EOF

申请

kubectl apply -f /root/kube_yaml/dns/nginx-service-name.yaml

当进行nslookup时,会返回”www.google.co.jp”作为CNAME记录,并对其进行名称解析。

[root@centos-749b5dff6-bpcrb /]# nslookup nginx-headless-noselector 
Server:         10.96.0.10
Address:        10.96.0.10#53

Non-authoritative answer:
nginx-headless-noselector.bar.svc.cluster.local canonical name = www.google.co.jp.
Name:   www.google.co.jp
Address: 172.217.27.67

挖掘结果

[root@centos-749b5dff6-bpcrb /]# dig nginx-headless-noselector.bar.svc.cluster.local

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> nginx-headless-noselector.bar.svc.cluster.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53443
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nginx-headless-noselector.bar.svc.cluster.local. IN A

;; ANSWER SECTION:
nginx-headless-noselector.bar.svc.cluster.local. 20 IN CNAME www.google.co.jp.
www.google.co.jp.       20      IN      A       172.217.27.67

;; Query time: 1 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Wed May 02 15:01:32 UTC 2018
;; MSG SIZE  rcvd: 122

Pod的名称解析

自动注册A记录

Pod的DNS A记录是自动配置的,具体格式如下:

pod-ip-address.my-namespace.pod.cluster.local

如果在bar命名空间中存在以下3种类型的Pod,

[root@sugi-kubernetes110-master01 ~(bar kubernetes-admin)]# kubectl get pods -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
centos-749b5dff6-bpcrb   1/1       Running   0          57m       10.244.1.28   sugi-kubernetes110-node01.localdomain
nginx-5c9845d857-5tvlt   1/1       Running   0          1h        10.244.1.27   sugi-kubernetes110-node01.localdomain
nginx-5c9845d857-vlgl2   1/1       Running   0          1h        10.244.2.26   sugi-kubernetes110-node02.localdomain

你可以通过「10-244-1-28.bar.pod.cluster.local.」来进行名称解析(请注意,它不包含在搜索列表中的后缀)。

[root@centos-749b5dff6-bpcrb /]# nslookup 10-244-1-28.bar.pod.cluster.local.
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   10-244-1-28.bar.pod.cluster.local
Address: 10.244.1.28

Pod的DNS策略

Pod的DNS策略可以在Pod级别进行设置。当前,在Kubernetes中可选择以下策略。
您可以在清单文件中使用dnsPolicy字段进行指定。

    • default (※) : kube-dnsで解決出来ない名前解決の場合、Podが稼働しているNodeに設定している、DNSサーバ(upstream nameserverと表現されている)を使用して名前解決を行います。次の「ClusterFirst」では、stub-domainやupstreamDNSサーバを個別に指定することが出来ますが、defaultポリシーでは設定をすることが出来ません。

 

    • ClusterFirst : kube-dnsで解決出来ない名前解決の場合、Podが稼働しているNodeに設定している、DNSサーバ(upstream nameserverと表現されている)を使用して名前解決を行います。Cluster管理者は、stub-domainやupstreamDNSサーバを個別に指定することができます。https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#impacts-on-pods

 

    • ClusterFirstWithHostNet : hostNetworkで稼働しているPodは、「ClusterFirstWithHostNet」をDNSポリシーとして指定する必要があります。

 

    None : Kubernetes version 1.9 で追加された機能です。KubernetesのDNS自動設定を無視することが出来ます dnsConfig による設定のみ行う事が出来ます。https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods-dns-config

※ 默认值并非默认DNS策略。若未指定DNS策略,则选择“ClusterFirst”。

以下是指定 DNS 策略为 “ClusterFirstWithHostNet” 的下一个清单文件。同时将 spec.hostNetwork 设置为 true。

cat <<'EOF' > /root/kube_yaml/dns/busybox-hostnw.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet
EOF

创作

kubectl apply -f /root/kube_yaml/dns/busybox-hostnw.yaml

我会确认一下。busybox的IP已经变成了node的IP。

[root@sugi-kubernetes110-master01 dns(bar kubernetes-admin)]# kubectl get pods -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP                NODE
busybox                  1/1       Running   0          10s       192.168.120.223   sugi-kubernetes110-node01.localdomain
centos-749b5dff6-bpcrb   1/1       Running   2          2h        10.244.1.28       sugi-kubernetes110-node01.localdomain
nginx-5c9845d857-5tvlt   1/1       Running   0          2h        10.244.1.27       sugi-kubernetes110-node01.localdomain
nginx-5c9845d857-vlgl2   1/1       Running   0          2h        10.244.2.26       sugi-kubernetes110-node02.localdomain

启动sh并登录

kubectl exec busybox -it sh

在容器中,可以看到主机端的网络。

/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
    link/ether 00:50:56:98:70:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.120.223/24 brd 192.168.120.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::f59f:2d01:78d0:bcb9/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::98a0:413d:6b71:8fbd/64 scope link tentative flags 08 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue 
    link/ether 02:42:3e:8b:64:af brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue 
    link/ether 62:c4:05:0d:c1:d3 brd ff:ff:ff:ff:ff:ff
    inet 10.244.1.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::60c4:5ff:fe0d:c1d3/64 scope link 
       valid_lft forever preferred_lft forever
5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue qlen 1000
    link/ether 0a:58:0a:f4:01:01 brd ff:ff:ff:ff:ff:ff
    inet 10.244.1.1/24 scope global cni0
       valid_lft forever preferred_lft forever
    inet6 fe80::9ca5:24ff:fe55:9672/64 scope link 
       valid_lft forever preferred_lft forever
31: vetha1c264dc@docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 
    link/ether 1e:a2:df:06:57:ba brd ff:ff:ff:ff:ff:ff
    inet6 fe80::1ca2:dfff:fe06:57ba/64 scope link 
       valid_lft forever preferred_lft forever
32: veth224aaf36@docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 
    link/ether a2:17:d4:7c:55:ea brd ff:ff:ff:ff:ff:ff
    inet6 fe80::a017:d4ff:fe7c:55ea/64 scope link 
       valid_lft forever preferred_lft forever

查看resolv.conf文件

/ # cat /etc/resolv.conf 
nameserver 10.96.0.10
search bar.svc.cluster.local svc.cluster.local cluster.local localdomain
options ndots:5

nslookup看起来与普通的Pod一样。

/ # nslookup foo1
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      foo1
Address 1: 10.107.131.250 foo1.bar.svc.cluster.local

Pod的DNS配置

从 Kubernetes v1.9 开始,您可以控制 Pod 的 DNS 设置。尽管 Kubernetes 1.10 默认启用了该功能,但在 v1.9 中,您需要通过设置 kubelete 的参数 –feature-gates=CustomPodDNS=true,…来启动该进程。

创建部署清单文件。

cat <<'EOF' > /root/kube_yaml/dns/dnsconfig_centos_pod.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: dnsconfig-centos
spec:
  selector:
    matchLabels:
      app: dnsconfig-centos
  replicas: 1
  template:
    metadata:
      labels:
        app: dnsconfig-centos
    spec:
      containers:
      - name: dnsconfig-centos
        image: centos
        command: [ "sleep", "3600" ]
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
          - 1.2.3.4
        searches:
          - ns1.svc.cluster.local
          - my.dns.search.suffix
        options:
          - name: ndots
            value: "2"
          - name: edns0
EOF

创建部署 (Chuangjian bushu)

kubectl apply -f /root/kube_yaml/dns/dnsconfig_centos_pod.yaml

启动bash

kubectl exec dnsconfig-centos-d9c4f576f-k9kj8 -it bash

以下是Pod的resolv.config设置
当然,下面的设置无法解决集群内部的名称解析问题,也无法解决外部的名称解析问题。

[root@dnsconfig-centos-d9c4f576f-k9kj8 /]# cat /etc/resolv.conf 
nameserver 1.2.3.4
search ns1.svc.cluster.local my.dns.search.suffix
options ndots:2 edns0

请提供一个参考网址。

关于Kubernetes “服务”概述的自学笔记
https://qiita.com/MahoTakara/items/d18d8f9b36416353066c

Kubernetes Blog
https://kubernetes.io/blog/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes

存根域,上游DNS。请参考 https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#impacts-on-pods。

DNS配置
https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods-dns-config

广告
将在 10 秒后关闭
bannerAds