Kubernetes node节点无法访问ClusterIP

  • 问题出现在安装flannel网络插件的时候
  • 问题表现为:
    Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-amd64-xdqqq': Get https://10.96.0.1:443/api/v1/namespaces/kube-system/pods/kube-flannel-ds-amd64-xdqqq: dial tcp 10.96.0.1:443: i/o timeout
  • 一般猜想是因为:如果使用kubeadm工具安装,初始化配置文件指定podSubnet(非10.244.0.0/16)网段,需要在flannel的configmap里面指定Pod Network。因为flannel的configmap里面默认"Network": "10.244.0.0/16"。但是通过kubectl -n kube-system get cm kubeadm-config -oyaml,可以看到配置里面已经执行podSubnet否定。
  • Using Calico with these instructions: https://docs.projectcalico.org/v3.9/getting-started/kubernetes/installation/migration-from-flannel,迁移flannel到calico 也能解决问题
  • kube-flannel.yaml, I added --iface=ens33,在flannel yaml启动flannel参数中添加虚拟网卡的指定,可以解决多网卡问题
  • 修改controller manager的yaml配置,但是我的配置里面本身就有
    try the blow,may be useful
    edit /etc/kubernetes/manifests/kube-controller-manager.yaml
    at command ,add
    --allocate-node-cidrs=true
    --cluster-cidr=10.244.0.0/16
    then,reload kubelet
  • 最后通过tcpdump抓包发现访问10.96.0.1:443的包,源ip为10.96.0.1,所以添加

    iptables -t nat -A POSTROUTING -s 10.96.0.1/32 -j SNAT --to-source 192.168.111.20
    k8s-flannel.png

kubeadm join问题

一切正式运行后,由于负载的增加,需要额外添加一台k8s node,使用k8s init日志里面的join命令,报出如下错误:

33639 token.go:202] [discovery] Failed to connect to API Server "192.168.111.10:6443": token id "abcdef" is invalid for this cluster or it has expired. Use "kubeadm token create" on the control-plane node to create a new valid toke

kubeadm join -v=6 加上v=6可以看到详细信息
观察日志,发现能连上api server,但是token过期了。解决方法:kubeadm token create,生成的token替换掉原来的token,再次执行既可以加入。
注意,这一步会检查validating whether swap is enabled or not, 一定要注意关闭swap,或者使用参数忽略。

关闭selinux swapoff -a && sed -i '/ swap / s/^(.)$/#1/g' /etc/fstab关闭交换内存,并将fstab文件中swap相关的注释掉。k8s安装的时候会检测交换区是否关闭,因为这样会影响性能。setenforce 0 && sed -i 's/^SELINUX=./SELINUX=disabled/' /etc/selinux/config

文章目录