天天看點

在 Kubernetes 叢集中通過 dns-admission-controller 來調整 Pod dns 配置

上文介紹了 Kubernetes 叢集 DNS 服務發現原理

但在某些場景下,我們希望能夠更靈活調整 Pod 預設的 dns 配置,如:

  1. 調小 ndots 的值以減少備援的域名查詢請求,以提高查詢效率。
  2. 叢集部署了 local-dns ,調整 Pod 的 nameserver 接入 local-dns。

通常,你需要重配置叢集 kubelet 的啟動參數,或者給應用 YAML 配置 dnsConfig 來達到目的,但是侵入性較強。

本文會介紹 dns-admission-controller 元件,通過 mutating webhook 機制能夠在叢集級别自動調整 pod 的 dns 配置,靈活性強、侵入性低。

手動部署 dns-admission-controller

參數确定

設定叢集的 kube-dns 服務 IP 為 172.21.0.10,叢集主域名字尾為 cluster.local。首先,需要确定需要調整的 dns 配置。

參數 說明
nameserver dns 服務的 IP。如果不希望調整,則需要為叢集 kube-dns 服務 IP
clusterDomain 叢集主域名字尾
ndots ndots 值,預設為 3

部署

  1. 以調小 ndots 值到 2 為目的示範部署流程,通過下載下傳 helm chart 應用來一鍵部署應用。
export clusterDomain=cluster.local
export nameserver=172.21.0.10
export ndots=2

curl https://node-local-dns.oss-cn-hangzhou.aliyuncs.com/install_dns-admission-controller.sh -o install_dns-admission-controller.sh;chmod 744 install_dns-admission-controller.sh;bash install_dns-admission-controller.sh $clusterDomain $nameserver $ndots           
  1. 檢視是否安裝成功:
$ helm list -n kube-system
NAME                            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                                             APP VERSION
dns-admission-controller        kube-system     1               2020-11-29 22:39:56.833004 +0800 CST    deployed        ack-node-local-dns-admission-controller-0.0.1                
$ kubectl get deployment dns-admission-controller -n kube-system
NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
dns-admission-controller   1/1     1            1           109s           

接入

  1. 給需要接入的命名空間打标(以 default 為例)
kubectl label namespace default node-local-dns-injection=enabled           
注:admission-controller 會忽略 kube-system 和 kube-public 命名空間下的應用。
  1. 在叢集的 default 命名空間下部署以下測試應用
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: ubuntu
  labels:
    app: ubuntu
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ubuntu
  template:
    metadata:
      labels:
        app: ubuntu
    spec:
      containers:
      - name: ubuntu
        image: ubuntu
        command: ["sh", "-c"]
        args: ["sleep 100000"]           
$ kubectl apply -f ubuntu-deployment.yaml
deployment.apps/ubuntu created

$ kubectl get deployment ubuntu
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
ubuntu   2/2     2            2           7s           
  1. 檢視 dnsConfig 是否注入成功
$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
ubuntu-766448f68c-mj8qk   1/1     Running   0          4m39s
ubuntu-766448f68c-wf5hw   1/1     Running   0          4m39s           
$ kubectl get pod ubuntu-766448f68c-mj8qk -o=jsonpath='{.spec.dnsConfig}'
map[nameservers:[172.21.0.10] options:[map[name:ndots value:2]] searches:[default.svc.cluster.local svc.cluster.local cluster.local]]