修改 k8s 集群 CorenDNS 服务地址

使用场景

TKE 中的 Coredns 服务 IP 目前没有办法在创建集群的时候指定,默认是从客户配置的 Service CIDR 网段中分配一个随机的 IP,下面将介绍如何自定义修改 Coredns 服务 IP。

前提条件

  1. 在配置的 service CIDR 网段中选择一个目前集群中没有被使用的 IP
  2. 集群中存量的 Pods 可以接受被重建。

操作步骤

1.修改 kubelet 启动参数 先到存量节点上修改 kubelet 配置文件中 --cluster-dns 参数为新的 Cluster IP 并重启 kubelet,操作命令如下:

1DNS_CLUSTER_IP=xxx.xxx.xxx.xxx
2sed -i "/CLUSTER_DNS/c\CLUSTER_DNS=\"--cluster-dns=${DNS_CLUSTER_IP}\"" /etc/kubernetes/kubelet
3systemctl restart kubelet

2.重建指定了新 ClusterIP 的 Coredns 的 Service 资源

由于.spec.clusterIP 字段是不可修改的,所以必须先删除原来的Service 资源:

1kubectl delete svc kube-dns -n kube-system

然后再重新创建 Service kube-dns,可以根据需求适当修改和应用如下 YAML重建:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  annotations:
 5    prometheus.io/port: "9153"
 6    prometheus.io/scrape: "true"
 7  labels:
 8    addonmanager.kubernetes.io/mode: Reconcile
 9    kubernetes.io/cluster-service: "true"
10    kubernetes.io/name: CoreDNS
11  name: kube-dns
12  namespace: kube-system
13spec:
14  clusterIP: xxx.xxx.xxx.xxx  # 你要指定的服务 IP
15  ports:
16  - name: dns-tcp
17    port: 53
18    protocol: TCP
19    targetPort: 53
20  - name: dns
21    port: 53
22    protocol: UDP
23    targetPort: 53
24  selector:
25    k8s-app: kube-dns
26  sessionAffinity: None
27  type: ClusterIP

3.重建集群中存量已有所有 Pods

由于kubelet 使用 --cluster-dns=<DNS 服务 IP> 标志将 DNS 解析器的信息传递给每个容器,所以存量 Pods 需要重建下更新到新的 Cluster IP,使用正常删除命令即可:

1 kubectl delete pod --all --all-namespaces 

4.新建节点时指定 kubelet 参数

新建节点时可以通过自定义参数的功能指定kubelet 配置文件中--cluster-dns参数,但目前需要联系售后同学开白名单后可在控制台配置使用。

温馨提示:由于 Coredns Pods 比较特殊,在 Coredns 创建时容器中 /etc/resolv.conf 默认是继承当前节点相同路径中的Dnsservers 配置,不会使用 kubelet 参数中的配置,并且后续也不会 watch 和同步节点 /etc/resolv.conf 中的内容改动,所以节点上配置修改后需要重建 coredns Pods 更新新配置。

相关系列文章