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