安装kubernetes踩过的坑
出于需要自己开始学习搭建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"]
}