修改 k8s 集群 CorenDNS 服务地址
使用场景
TKE 中的 Coredns 服务 IP 目前没有办法在创建集群的时候指定,默认是从客户配置的 Service CIDR 网段中分配一个随机的 IP,下面将介绍如何自定义修改 Coredns 服务 IP。
前提条件
- 在配置的 service CIDR 网段中选择一个目前集群中没有被使用的 IP
- 集群中存量的 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 更新新配置。