出于需要自己开始学习搭建kubernetes集群,期间遇到了无数个大坑,哼哧哼哧1周多总算能正常使用了,现将安装部署过程中遇到的相关问题记录如下:

添加Kubernetes签名密钥:

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add

apt install kubeadm kubelet kubectl kubernetes-cni

由于国内安装k8s被墙,首先需要获取所需镜像以及它们的版本

kubeadm config images list

然后从国内的镜像站获取,运行如下脚本

images=(  # 下面的镜像应该去除"k8s.gcr.io/"的前缀,版本换成上面获取到的版本
kube-apiserver:v1.22.1
kube-controller-manager:v1.22.1
kube-scheduler:v1.22.1
kube-proxy:v1.22.1
pause:3.5
etcd:3.5.0-0
coredns/coredns:v1.8.4
)

for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName    #coredns镜像站上使用"docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.4"这个命令拉取,注意不要加"coredns/"还有版本号前面不加v,否则会提示拉取不到该镜像
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

使用kubeadm init初始化时,如果报如下错误

[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused.

进入/etc/systemd/system/kubelet.service.d,查看是否存在10-kubeadm.conf,在文件末尾添加

Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --fail-swap-on=false"

执行如下命令重新加载配置

systemctl daemon-reload
systemctl restart kubelet.service

再次初始化时如果报错

[ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists

是因为第一次初始化失败后有垃圾数据没有清理,执行 kubeadm reset重置

如果再次初始化又报如下错误

failed to run Kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
systemd
cgroupfs

原因是kubelet的cgroup配置与docker的cgroup不一致,分别修改docker与控制平台的kubelet的cgroup,官方推荐systemd

首先修改或创建/etc/docker/daemon.json,添加如下配置

{ "exec-opts": ["native.cgroupdriver=systemd"] }

重启docker,检查是否变更成功

docker info|grep "Cgroup Driver"
Cgroup Driver: systemd

变更kubelet的cgroup

vi /var/lib/kubelet/config.yaml
cgroupDriver: systemd

如果提示如下信息需要先加载环境变量

The connection to the server localhost:8080 was refused - did you specify the right host or port?

export KUBECONFIG=/etc/kubernetes/admin.conf  #加载环境变量

如果忘记了节点加入命令,使用如下命令重新生成

kubeadm token create --print-join-command

如果master节点始终处于notReady状态,通过journalctl -xeu kubelet命令查看日志发现如下所示

"Unable to update cni config"

原因是网络插件未安装,下载 kube-flannel.yml或者calico.yaml文件,并执行kubectl apply -f calico.yaml或者执行kubectl apply -f kube-flannel.yml

如果kube-flannel-ds一直处于CrashLoopBackOff状态,查看日志如下所示

Error registering network: failed to acquire lease: node "master-node" pod cidr not assigned

如果slave节点始终处于notReady状态,通过journalctl -xeu kubelet命令查看日志发现如下所示

Unable to update cni config: no valid networks found in /etc/cni

提示从节点上cni目录下找不到配置文件,只需要把master节点该目录下的内容拷贝一份

如果kubectl get pods --all-namespaces 检查发现kube-flannel-ds-XXX一直处于CrashLoopBackOff状态,原因是init的时候没有指定 --pod-network-cidr=10.10.0.0/16参数,导致与kube-flannel.yml配置文件中network不一致,手动设置为一致即可

下面是kube-flannel.yml配置文件中network的相关配置

  net-conf.json: |
    {
 "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

另外如果从节点拉取不到镜像,设置国内镜像源

编辑从节点/etc/docker/daemon.json文件,配置如下:

{ 
"registry-mirrors": ["https://u7j1ycc1.mirror.aliyuncs.com"]
}

发表评论

邮箱地址不会被公开。 必填项已用*标注