K8s init初始化中遇到的问题及解决方案

本文介绍如何解决Kubernetes部署中的镜像拉取问题,通过关闭swap分区,过滤并替换镜像源为国内阿里云源,实现快速高效地拉取所需镜像版本,包括kube-apiserver、kube-controller-manager等核心组件。

从error中信息提示可以获知,需要关闭swap分区,命令为:

swapoff –a

将提示信息保存到一个文件中(名字随意,本文取得是K8sDebug.txt),使用awk、grep、cut等命令过滤出需要的镜像版本,命令如下:

awk -F" " '{print $7}' K8sDebug.txt | grep -v "^$" | grep -v "connection" |grep -v "fatal"| cut -d ":" -f 1,2

获取结果如下:

图中标亮的为需要的镜像版本,需要依据镜像版本替换成国内的源,将上述高亮的版本信息存放到另一个文件中(K8sDebug2.sh),批量替换源地址,将k8s.gcr.io替换成registry.aliyuncs.com/google_containers命令如下:

sed -i 's/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g'  K8sDebug2.sh

结果如下:

依据已经替换的结果拉取对应的镜像,命令如下:

for i in `cat K8sDebug2.sh`;do docker pull $i;done

查看镜像:

对拉取的镜像重新打tag,变成k8s.gcr.io/格式,脚本为K8sDebug3.sh,如下所示:

#!/bin/bash
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.15.3 k8s.gcr.io/kube-apiserver:v1.15.3
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.15.3 k8s.gcr.io/kube-controller-manager:v1.15.3
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.15.3 k8s.gcr.io/kube-scheduler:v1.15.3
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.15.3 k8s.gcr.io/kube-proxy:v1.15.3
docker tag registry.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.aliyuncs.com/google_containers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag registry.aliyuncs.com/google_containers/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

 并删除registry.aliyuncs.com/google_containers/*系列镜像,命令如下:

for i in `cat K8sDebug2.sh`;do docker rmi $i;done

 

 重新执行命令:

 kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU

 

### Kubernetes 安装初始化失败的解决方案(端口被占用) Kubernetes 初始化失败可能由多种原因引起,其中端口被占用是一个常见的问题。在执行 `kubeadm init` 命令时,如果某些关键端口(如 6443、10250、10251 和 10252)被其他进程占用,则会导致初始化失败[^5]。以下提供详细的解决方案: #### 1. 检查被占用的端口 首先需要确认哪些端口被占用以及占用这些端口的进程。可以使用以下命令检查端口占用情况: ```bash sudo lsof -i :<port> ``` 例如,检查端口 6443 是否被占用: ```bash sudo lsof -i :6443 ``` 如果返回结果中包含进程信息,则说明该端口已被占用。 #### 2. 终止占用端口的进程 如果确认是无关进程占用了 Kubernetes 所需的端口,可以通过以下命令终止该进程: ```bash sudo kill -9 <PID> ``` 例如,如果端口 6443 被 PID 为 1234 的进程占用,则执行: ```bash sudo kill -9 1234 ``` #### 3. 修改 Kubernetes 配置以使用其他端口 如果无法终止占用端口的进程,或者希望避免冲突,可以通过修改 Kubernetes 的配置文件来更改默认端口。例如,在执行 `kubeadm init` 命令时,可以指定自定义的 API Server 端口: ```bash kubeadm init --apiserver-advertise-address=<IP> --control-plane-endpoint="<IP>:<CUSTOM_PORT>" ``` 例如,将 API Server 的端口更改为 6444: ```bash kubeadm init --apiserver-advertise-address=192.168.1.17 --control-plane-endpoint="192.168.1.17:6444" ``` #### 4. 忽略预检错误(不推荐) 如果明确知道某些端口被占用不会影响集群运行,可以通过 `--ignore-preflight-errors` 参数忽略这些错误。但这种方法可能会导致潜在问题,因此不推荐作为首选方案: ```bash kubeadm init --ignore-preflight-errors=Port-6443,Port-10250,Port-10251,Port-10252 ``` #### 5. 清理遗留文件 有时,即使端口未被占用,也可能因为之前的安装留下了某些文件而导致初始化失败。可以删除以下文件并重新尝试初始化: ```bash sudo rm -rf /etc/kubernetes/manifests/* ``` #### 示例代码:检查并释放端口 以下是一个完整的脚本,用于检查和释放被占用的端口: ```bash #!/bin/bash PORTS=(6443 10250 10251 10252) for PORT in "${PORTS[@]}"; do echo "Checking port $PORT..." PROCESS=$(sudo lsof -t -i :$PORT) if [ -n "$PROCESS" ]; then echo "Port $PORT is occupied by process $PROCESS. Terminating..." sudo kill -9 $PROCESS else echo "Port $PORT is free." fi done echo "All ports are now available. Proceeding with kubeadm init..." kubeadm init --apiserver-advertise-address=192.168.1.17 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.5 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 ``` ### 注意事项 - 在终止进程前,请确保该进程不是系统关键服务。 - 如果修改了默认端口,需确保所有节点和客户端配置一致。 - 使用 `--ignore-preflight-errors` 参数时需谨慎,以免引入其他问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值