大家好,欢迎来到IT知识分享网。
在使用kubeadm init初始化k8s集群中的master主节点时,总是出错。这个地方卡了我很长时间,遇到了好几个不一样的错误,有的问题在网上也没有找到什么有效的解决方案,所以特此记录一下。以下错误均是在使用kubeadm init
语句初始化k8s集群过程中出现的问题。
第一次初始化集群时,我的初始化master节点kubeadm init语句为:
kubeadm init --kubernetes-version=v1.10.0 \
--apiserver-advertise-address=50.50.50.50 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
错误一
this version of kubeadm only supports deploying clusters with the control plane version >= 1.17.0. Current version: v1.10.0
错误原因:因为刚开始安装kubelet kubeadm kubectl的时候,我使用的命令是yum install -y kubelet kubeadm kubectl
,这个命令确实能安装kubernetes的这3个组件。但是这个安装下载命令有一个问题,就是没有指定kubelet kubeadm kubectl的版本,所以该命令一般会默认下载最新高版本的组件。与之类似的还有docker的安装命令yum install docker-ce -y
,这条命令会默认安装最新版的docker。
因为有的时候我们要考虑各组件之间的版本兼容性,比如安装k8s的这3个组件的时候就要考虑k8s组件的版本是否与docker,Centos的版本相匹配。
出现上述错误的原因是我的kubeadm是1.17版本的,而本地的docker仓库中的相关镜像是1.10版本的,所以安装的时候安装命令中的kubernetes-version=v1.10.0
会导致错误,镜像版本与kubeadm组件要求的版本不匹配,故报错。
这个时候,大家可能会有疑问,kubernetes-version=v1.10.0
不放在在kubeadm init初始化集群命令中可不可以?首先,我先这样说,可以,但是可以的前提是你要科学上网(因为本地docker仓库中没有镜像的话就会从google的官网下载)或者说你的本地docker仓库中刚好有符合kubeadm组件要求的镜像。但是,我的建议是放上这一句,那为什么呢,我给大家举个例子。
怎样查看kubeadm组件要求的镜像的版本呢?(说明:下图是我成功部署的k8s集群中的信息,我所使用的kubeadm的版本是kubeadm-1.14.2
)使用如下的命令,可以看到kubeadm-1.14.2
组件所要求的镜像。
kubeadm config images list
我没有科学上网,所以我借助阿里的镜像源下载了相关的镜像,使用docker images
查看如下:
因为我当时没有使用kubeadm config images list
查看kubeadm-1.14.2
所要求的镜像,所以我觉得使用registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.2
等1.14.2的版本肯定可以,因为这和已安装的kubeadm版本一致。然后我是用了kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
执行k8s集群的初始化,假如我不指定kubernetes-version=v1.14.2
,那么我觉得会从官网下载kubeadm config images list
中所列出的1.14.0相关版本的镜像,因为我没有科学上网,所以就会报错。所以我建议大家还是加上这句,保持和自己docker仓库中镜像的版本一致。
解决方案:
首先指定k8s的组件kubelet kubeadm kubectl的下载版本,其实在这之前要在/etc/yum.repos.d/kubernetes.repo
文件中设置阿里镜像源,该文件若不存在则创建,存在则更改,编辑内容为:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
然后使用:wq!保存编辑并退出,这样就可以使用阿里源的仓库下载k8s的组件了。比如我指定下载1.4.2版本的k8s组件,可以使用命令:
yum install -y kubelet-1.14.2
yum install -y kubeadm-1.14.2
yum install -y kubectl-1.14.2
如果说有人之前下载了高版本的k8s组件,现在想卸载应该怎么办呢?我以卸载k8s的kubelet组件为例,使用rpm -qa | egrep kubelet
列出kubelet组件安装包的全名,然后使用yum remove kubelet-1.18.6-0.x86_64
卸载安装包即可。
其次,k8s的组件安装好之后,根据kubeadm config images list
所要求的镜像信息,通过docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.2
即可从阿里镜像源拉取kube-proxy:v1.14.2
镜像,依次将kubeadm config images list
中的所有镜像拉取下来,当然也可以写个sh脚本,使用for循环一次拉取即可,此处不再赘述。所要求的镜像全部拉取成功后,使用docker images
查看docker仓库中的镜像,这时大家会发现所有的镜像都是以registry.aliyuncs.com/google_containers/
开头,这与kubeadm config images list中要求的镜像名称不一样。我们要修改镜像名称,即对镜像重新打个tag,比如docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2
即docker tag + 旧的镜像名称:版本号 新的镜像名称:版本号,其他几个镜像依次执行修改镜像名称
操作;接着删除旧的镜像(其实不删除应该也可以),执行docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.14.2
;最终我们使用docker images
查看本地docker仓库的镜像信息如下:
本过程执行的操作主要是拉取镜像、修改镜像名称、删除旧的镜像
。
最后,执行kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
实现了集群的初始化,如果说大家之前设置了kubeadm
使用本地docker仓库中的镜像的话(即修改过了docker服务文件),那么初始化应该就能成功了。
错误二
[ERROR ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/kube-apiserver:v1.14.2: output: Error response from daemon: Get https://registry.aliyuncs.com/v2/:…error: exit status 1.
在讲这个错误之前,我想先讲一下另一个错误,[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.14.2: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while await
, error: exit status 1这显然是从官网上下载镜像资源没有下载下来,这是因为没有配置阿里云镜像源。有关配置的方法,在错误一
中有提及。
我们回过头再来看上面的这个错误,Error response from daemon: Get https://registry.aliyuncs.com/v2/,有的朋友可能会有有这样的疑问:明明在/etc/yum.repos.d/kubernetes.repo
文件中配置了阿里的镜像源为什么还会报错呢?报“从阿里源下载镜像失败”的错误?
错误原因:没有修改docker服务文件。因为修改这个文件可以使docker下载或者加载镜像的时候有所选择,比如我之前(错误一中)提到的kubeadm init
初始化k8s集群,那么kubeadm怎么就知道从本地docker仓库中加载镜像呢?没错,就是通过/usr/lib/systemd/system/docker.service
这个docker的服务文件。
解决方案:
修改docker服务文件——/usr/lib/systemd/system/docker.service
(该文件的位置也有可能是/etc/systemd/system/docker.service.d
),只需添加一行代码,代码一定要放在正确的位置
。
将代码Environment="NO_PROXY=127.0.0.1/8,127.0.0.1/16"
一定要放在[Service] Type=notify的后面,因为我之前将Environment="NO_PROXY=127.0.0.1/8,127.0.0.1/16"
添加在了Type=notify的前面,仍然报错proxyconnect tcp: dial tcp: lookup www.ik8s.io on [::1]:53: read udp [::1]:44527->[::1]:53: read: connection refused.,所以一定要把这行代码放在正确的位置。使用:wq!保存编辑并退出。
接下来要执行docker服务文件的刷新,使之生效。
systemctl daemon-reload //刷新配置
systemctl restart docker //重启docekr服务
systemctl show --property=Environment docker //查看docker配置的代理信息
如果说本地docker仓库中已经有了错误一中提及的镜像,那么再次执行k8s集群容器的初始化应该就可以成功了。
错误三
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory “/etc/kubernetes/manifests”. This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
Unfortunately, an error has occurred:
timed out waiting for the condition
This error is likely caused by:
– The kubelet is not running
– The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)
对,就是这个问题,耗费了我很长时间,这个问题让我头疼了好久,在网上也没找到合适的解决方案。我来说一下我的解决方法,其实这个问题的解决方案就是先根据错误一中的相关步骤准备好镜像
,再根据错误二中的相关步骤修改docker服务文件
,简单地说就是:准备好镜像 + 修改docker服务文件
。
最后kubeadm init
初始化k8s集群时我所使用的命令是:
kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
(该命令就是kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
)
该命令中与本文最开始的kubeadm init初始化集群命令有所不同,本文最开始的命令是kubeadm init --kubernetes-version=v1.10.0 \ --apiserver-advertise-address=50.50.50.50 \ --image-repository registry.aliyuncs.com/google_containers \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16
,该初始化命令不包含--apiserver-advertise-address
和--image-repository registry.aliyuncs.com/google_containers \
这两部分信息。因为,我执行该命令后初始化集群成功了,而不是,不是,不是本文最开始的kubeadm init初始化集群命令,所以我不确定该命令中没添加的参数是不是促成了初始化k8s集群的成功,建议大家使用该命令,因为我自己已经初始化集群成功了。
然后,我解释一下该命令中没有使用的两个参数。第一个参数–apiserver-advertise-address在该命令中没有使用,因为我觉得在master节点上使用执行初始化操作,该参数的值就默认为master节点的ip地址了,故无需再设置;第二个参数image-repository是镜像源,其默认值是k8s.gcr.io,可将其指定为阿里云镜像地址,因为我是用的本地docker仓库中的镜像,所以这个参数我也没有使用。
总的来说,这个问题的解决方案就是执行3个步骤:
1、根据错误一中的相关步骤准备好镜像
2、根据错误二中的相关步骤修改docker服务文件
3、kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
参考我这个格式去执行kubeadm init
初始化的操作。
不出意外的话,也应该没有意外了,大家会看到k8s集群初始化成功的界面:
除了以上3个错误之外,我还想跟大家讲一个比较容易忽略的地方:
如果说某次执行kubeadm init
初始化k8s集群失败了,在下一次执行kubeadm init
初始化语句之前,先执行kubeadm reset
命令。这个命令的作用是重置节点,大家可以把这个命令理解为:上一次kubeadm init
初始化集群操作失败了,该命令清理了之前的失败环境。
kubeadm reset
kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
每次执行kubeadm init
初始化k8s集群之前,先执行kubeadm reset
指令,如若不执行,会出现额外的错误比如xxx already exists和Port xxx is in use,所以大家一定要先执行kubeadm reset
指令。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10746.html