本地用vagrant和ansible搭建k8s集群踩的坑

源代码请访问:https://github.com/davenkin/local-k8s-cluster

  • 国内无法下载k8s,解决办法:采用阿里的源解决:
- name: add Kubernetes apt-key
  apt_key:
    url: https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
    state: present

- name: Add Kubernetes' APT repository
  apt_repository:
    repo: deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    state: present
  • vagrant为每台机器都配置了NAT对应的IP地址,所有机器都为10.0.2.15,并且是k8默认识别的IP,导致很多k8s的服务都绑定到了这个地址,这也是很多问题的源头。
  • sudo kubeadm init --pod-network-cidr=10.244.0.0/16时,没有加--apiserver-advertise-address=非10.0.2.15的IP地址参数,导致api server监听了该默认的10.0.2.15地址,而该地址只有本地才能访问,因此其他woker在kubadm join时无法成功。解决方法:加上apiserver-advertise-address参数,比如:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.28.128.228
  • 所有Node的INTERNAL-IP均为默认的10.0.2.15,导致集群无法工作。通过kubectl get nodes -o wide可以查看。解决办法:修改所有机器上的kubelet配置:
sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

添加:

Environment="KUBELET_EXTRA_ARGS=--node-ip=[ip from above, e.g. 172.28.128.228]"

到:

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
Environment="KUBELET_EXTRA_ARGS=--node-ip=[ip from above, e.g. 172.28.128.228]"

然后重启kubelet:

sudo systemctl daemon-reload
sudo systemctl restart kubelet

更多相关信息,参考这里

  • Flannel默认情况只能使用10.244.0.0/16网段,使用网段将报错。解决办法:在创建集群时只能使用:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.28.128.228
  • Flannel默认情况也使用了10.0.2.15,导致跨node之间通信不成功,解决办法:

在master节点上,先删除掉之前的Flannel:

kube delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

然后下载Flannel配置文件:

curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

添加iface=enp0s8kube-flannel.yml文件中,如下:

  containers:
  - name: kube-flannel
    image: quay.io/coreos/flannel:v0.10.0-amd64
    command:
    - /opt/bin/flanneld
    args:
    - --ip-masq
    - --kube-subnet-mgr
    - --iface=enp0s8

这里的enp0s8为你要使用的IP地址所对应的网卡名称,通过ifconfig -a可以查看。

另外,安装cluster之前需要做的:

  • 所有node禁用SELinux
setenforce 0
  • 禁用swap分区
swapoff -a

或者直接编辑/etc/fstab文件,永久删除swap行。

  • 禁用防火墙
    对于centos:
systemctl disable firewalld
systemctl stop firewalld

对于ubuntu:

sudo ufw disable
  • 更新Iptables
    对于centos:
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system