Kubernetes `kube dns`使用flannel获取错误的端点地址导致POD dns服务失败

Kubernetes `kube dns`使用flannel获取错误的端点地址导致POD dns服务失败,kubernetes,kube-dns,Kubernetes,Kube Dns,我在Ubuntu 16.04上设置了一个3节点的kubernetes(v1.9.3)集群 在安装之前,我清除了iptables规则,并使用以下命令遵循k8s documents for flannel初始化集群: # kubeadm init --apiserver-advertise-address 192.168.56.20 --pod-network-cidr=10.244.0.0/16 --kubernetes-version 1.9.3 # kubectl apply -f https

我在Ubuntu 16.04上设置了一个3节点的kubernetes(
v1.9.3
)集群

在安装之前,我清除了iptables规则,并使用以下命令遵循k8s documents for flannel初始化集群:

# kubeadm init --apiserver-advertise-address 192.168.56.20 --pod-network-cidr=10.244.0.0/16 --kubernetes-version 1.9.3
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
上一个命令似乎成功:

# kubectl -n kube-system -n kube-system get pods
NAME                             READY     STATUS    RESTARTS   AGE
etcd-master                      1/1       Running   0          3m
kube-apiserver-master            1/1       Running   0          2m
kube-controller-manager-master   1/1       Running   0          2m
kube-dns-6f4fd4bdf-4c76v         3/3       Running   0          3m
kube-flannel-ds-wbx97            1/1       Running   0          1m
kube-proxy-x65lv                 1/1       Running   0          3m
kube-scheduler-master            1/1       Running   0          2m 
但问题是
kube dns
似乎分配了错误的服务端点地址,这可以通过以下命令看到:

# kubectl get ep kube-dns --namespace=kube-system            
NAME       ENDPOINTS                     AGE
kube-dns   172.17.0.2:53,172.17.0.2:53   3m
root@master:~# kubectl describe service kube-dns -n kube-system           
Name:              kube-dns
Namespace:         kube-system
Labels:            k8s-app=kube-dns
                   kubernetes.io/cluster-service=true
                   kubernetes.io/name=KubeDNS
Annotations:       <none>
Selector:          k8s-app=kube-dns
Type:              ClusterIP
IP:                10.96.0.10
Port:              dns  53/UDP
TargetPort:        53/UDP
Endpoints:         172.17.0.2:53
Port:              dns-tcp  53/TCP
TargetPort:        53/TCP
Endpoints:         172.17.0.2:53
Session Affinity:  None
Events:            <none>
#kubectl get ep kube dns--namespace=kube system
姓名端点年龄
kube dns 172.17.0.2:53172.17.0.2:53 3m
root@master:~#kubectl描述服务kube dns-n kube系统
名称:kube dns
名称空间:kube系统
标签:k8s app=kube dns
kubernetes.io/cluster service=true
kubernetes.io/name=KubeDNS
注释:
选择器:k8s app=kube dns
类型:集群
IP:10.96.0.10
端口:dns 53/UDP
目标端口:53/UDP
终点:172.17.0.2:53
端口:dns tcp 53/tcp
目标端口:53/TCP
终点:172.17.0.2:53
会话关联:无
活动:
172.17.0.2
是docker bridge(
docker0
)为
kube dns
容器分配的IP地址。在进行k8s网络设置时,
kube dns
应具有地址来自
podSubnet
10.244.0.0/16
)的端点

当前设置的效果是,当IP通信正常时,所有POD将不具有DNS功能

我试图删除
kube-dns
pod,以查看新的
kube-dns
容器可以从
podSubnet
拾取端点,但它们没有


从3
kube dns
容器的启动日志中,没有任何错误消息

我想我已经找到了根本原因。先前的
kubeadm重置
没有同时删除
cni
flannel.1
接口。因此,下一个
kubeadm init
makes
kube dns
相信在我应用法兰绒yaml之前,Kubernetes网络插件已经就位

当我在拆除kubernetes集群时检查并删除由flannel插件创建的任何虚拟NIC后,下一个
kubeadm init
可以成功,不再出现此问题


同样的情况也适用于需要运行
Weave reset
以移除剩余虚拟编织NIC的编织网

您能否运行
kubectl描述pod kube dns-n kube system
并向我们提供结果。您是否启用了到iptables的桥接通信?尝试
sysctl net.bridge.bridge nf call iptables
查看它是否已启用。是的,
description
正常。并且
sysctl
设置都是根据文档完成的。