操作环境
k8s-master
k8s-node1
k8s-node2
下载coredns
cd /opt/k8s/coredns
git clone https://github.com/coredns/deployment.git
mv deployment coredns
配置coredns
cd /opt/k8s/coredns/coredns/kubernetes
./deploy.sh 10.0.0.0/24 cluster.local
这里,10.0.0.0/24是你的service网段, cluster.local是域名后缀。该命令输出的内容保存为文件generatedCoredns.yaml.
启动coredns
kubectl create -f generatedCoredns.yaml
如果报错:Get "https://10.0.0.1:443/api/v1/endpoints?limit=500&resourceVersion=0": x509: certificate is valid for 127.0.0.1, 172.x.x.x, not 10.0.0.1,那么Coredns是默认kubernetes的API-Server是10.0.0.1:443,需要修改上面的generatedCoredns.yaml文件。添加如下的KUBERNETES_SERVICE_HOST、KUBERNETES_SERVICE_PORT和KUBERNETES_SERVICE_PORT_HTTPS三个coredns容器的环境变量,使之指向你的apiserver IP和端口。
containers:
- name: coredns
image: coredns/coredns:1.7.0
imagePullPolicy: IfNotPresent
env:
- name: KUBERNETES_SERVICE_HOST
value: "172.171.19.210"
- name: KUBERNETES_SERVICE_PORT
value: "6443"
- name: KUBERNETES_SERVICE_PORT_HTTPS
value: "6443"
查看创建结果类似如下:
# kubectl get all -n kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
pod/coredns-76ff9d9d89-2lzml 1/1 Running 0 3h47m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kube-dns ClusterIP 10.0.0.2 <none> 53/UDP,53/TCP,9153/TCP 3h47m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/coredns 1/1 1 1 3h47m
NAME DESIRED CURRENT READY AGE
replicaset.apps/coredns-76ff9d9d89 1 1 1 3h47m
显示所有的容器都是Running并且READY的个数都是“1/1”,如果不是这样需要查看log并根据具体情况进行修复。
验证
本coredns要能解析本机上所有的service的域名,也就是能解析kubernetes.default.svc.cluster.local和nginx-service.test.svc.nginx-service
kubectl get svc -o wide --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
default kubernetes ClusterIP 10.0.0.1
test nginx-service ClusterIP 10.0.0.100
在两个计算节点上去nslookup kubernetes.default.svc.cluster.local 可以得到预期的结果,解析出了地址10.0.0.1,如果不支持nslookup可以直接ping改域名.
如果想在pod里面能解析域名,需要修改kubelet的配置文件,加上一句--cluster-dns=10.0.0.2 --cluster-domain=cluster.local :
--cluster-dns=10.0.0.2 --cluster-domain=cluster.local \
--network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d \
然后重启kubelet.尝试在pod中ping 这几个service的域名可以通。
参考文档
- https://coredns.io/2017/03/01/coredns-for-kubernetes-service-discovery-take-2/
- https://www.cnblogs.com/gaofeng-henu/archive/2020/03/29/12594651.html