kubernetes--Init Container

本文介绍了Kubernetes中InitContainer的概念及其应用场景,并提供了一个具体的部署示例,展示如何利用InitContainer进行准备工作,确保主容器顺利运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下文基于kubernetes 1.5.2版本编写

概念

Init Container就是做初始化工作的容器。可以有一个或多个,如果有多个,这些 Init Container 按照定义的顺序依次执行,只有所有的InitContainer 执行完后,主容器才启动。由于一个Pod里的存储卷是共享的,所以 Init Container 里产生的数据可以被主容器使用到。

Init Container可以在多种K8S资源里被使用到如Deployment、DaemonSet, PetSet/StatefulSet、Job等,但归根结底都是在Pod启动时,在主容器启动前执行,做初始化工作。

应用场景

等待其它模块Ready

比如使用apache部署web服务,需要做一些准备工作(例如从git服务器上拉取代码、检查运行环境是否到位等),可以在运行Web服务的Pod里使用一个InitContainer,去执行准备工作,完成后Init Container结束退出,然后启动正在的apache容器。

做初始化配置

比如集群里检测所有已经存在的成员节点,为主容器准备好集群的配置信息,这样主容器起来后就能用这个配置信息加入集群。

例子

cat << EOF >lykops-deploy-init-container.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: lykops-deploy-init-container
 labels:
   project: lykops
   app: init-container
   version: v1        
 annotations:
   pod.beta.kubernetes.io/init-containers:
    -name: apache-web,
     image: web:apache,
     command: ["sh", "httpd -t"]
spec:
 replicas: 1
 minReadySeconds: 30
 selector:
   matchLabels:
     name: lykops-deploy-init-container
     project: lykops
     app: init-container
     version: v1
 template:
    metadata:
     labels:
       name: lykops-deploy-init-container
       project: lykops
       app: init-container
       version: v1
   spec:
     containers:
     - name: webapache
       image: web:apache
       command: [ "sh", "/etc/run.sh" ]
       ports:
       - containerPort: 80
         name: http
         protocol: TCP
EOF
kubectl create -f lykops-deploy-init-container.yaml


<think>我们正在解决在CentOS7上重新安装kubeadm时出现的preflight错误,包括文件已存在和端口被占用的问题(特别是10250端口)。以下步骤将指导你如何彻底清除旧安装并重新安装,同时解决这些preflight错误。###步骤1:彻底卸载现有Kubernetes组件首先,我们需要完全移除所有Kubernetes组件,包括kubeadm、kubelet、kubectl以及相关的配置文件和数据。```bash#停止kubelet服务sudosystemctlstopkubelet#卸载Kubernetes组件sudoyumremove-ykubeletkubeadmkubectl#移除Kubernetes配置文件和数据sudorm-rf/etc/kubernetes/sudorm-rf/var/lib/kubelet/sudorm-rf$HOME/.kube/#移除containerd或Docker(如果使用Docker)sudoyumremove-ydocker-cedocker-ce-clicontainerd.iosudorm-rf/var/lib/dockersudorm-rf/var/lib/containerd#清理CNI配置sudorm-rf/etc/cni/net.d```###步骤2:释放被占用的端口错误`Port10250isinuse`通常是由于kubelet未正确停止或残留进程占用端口。使用以下命令查找并终止占用端口的进程:```bash#查找占用10250端口的进程sudonetstat-tulnp|grep10250#如果找到进程,记录PID并终止sudokill-9<PID>#如果上述命令找不到进程,使用lsofsudolsof-i:10250sudokill-9<PID>```###步骤3:解决文件已存在错误preflight错误`FileAvailable`通常是由于残留文件导致。检查并删除以下文件:```bash#检查并删除/etc/kubernetes/目录下的残留文件sudorm-f/etc/kubernetes/manifests/*sudorm-f/etc/kubernetes/pki/*#删除kubelet服务配置文件sudorm-f/etc/systemd/system/kubelet.service.d/*sudorm-f/etc/systemd/system/kubelet.service#重新加载systemdsudosystemctldaemon-reload```###步骤4:重新安装Kubernetes现在我们可以重新安装Kubernetes组件。```bash#添加Kubernetes仓库(使用阿里云镜像)cat<<EOF|sudotee/etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0EOF#安装kubelet、kubeadm、kubectlsudoyuminstall-ykubeletkubeadmkubectl#启动kubelet并设置开机启动sudosystemctlenable--nowkubelet```###步骤5:初始化kubeadm在重新初始化kubeadm之前,确保所有残留文件已清除且端口未被占用。```bash#执行kubeadm初始化(替换为你的参数)sudokubeadminit--pod-network-cidr=10.244.0.0/16--apiserver-advertise-address=<your-ip>```如果初始化过程中仍然出现preflight错误,请根据错误信息进一步清理。###常见问题及解决方法1.**端口10250仍被占用**可能是由于旧kubelet进程未完全终止或其它进程占用。重启服务器可以彻底释放所有资源:```bashsudoreboot```2.**残留CNI配置导致网络问题**在重新初始化前,确保清除CNI配置:```bashsudorm-rf/etc/cni/net.d/*```3.**kubelet启动失败**检查kubelet日志:```bashsudojournalctl-ukubelet-n100--no-pager```4.**证书残留导致初始化失败**删除所有旧证书:```bashsudorm-rf/etc/kubernetes/pki/*```###验证安装初始化成功后,配置kubectl:```bashmkdir-p$HOME/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config```检查节点状态:```bashkubectlgetnodes```###相关问题1.如何解决kubeadm初始化时的证书过期问题?2.如何重置整个Kubernetes集群以便重新安装?3.如何解决kubelet无法启动的问题?4.如何配置kubeadm使用国内镜像源?5.如何排查kubelet日志中的常见错误?[^1]:检查Kubernetes服务状态的基本命令</think>### 解决 CentOS 7 上 kubeadm 重新安装的 preflight 错误 以下是解决文件已存在和端口占用问题的完整步骤: #### 1. 彻底清理旧安装残留 ```bash # 停止所有 Kubernetes 服务 sudo systemctl stop kubelet docker containerd # 卸载 Kubernetes 组件 sudo yum remove -y kubeadm kubectl kubelet kubernetes-cni # 删除残留文件和目录 sudo rm -rf /etc/kubernetes/ /var/lib/kubelet/ /var/lib/etcd/ sudo rm -rf /var/lib/cni/ /etc/cni/net.d/ sudo rm -f /etc/systemd/system/kubelet.service /etc/systemd/system/multi-user.target.wants/kubelet.service # 清理 Docker 相关资源 sudo docker rm -f $(sudo docker ps -aq) sudo docker system prune -af ``` #### 2. 解决端口占用问题(特别是 10250) ```bash # 检查端口占用情况 sudo netstat -tulnp | grep 10250 # 终止占用端口的进程 sudo kill -9 $(sudo lsof -t -i:10250) # 确认端口已释放 sudo lsof -i:10250 # 应无任何输出 # 如果仍有问题,检查防火墙规则 sudo firewall-cmd --list-ports sudo firewall-cmd --remove-port=10250/tcp --permanent sudo firewall-cmd --reload ``` #### 3. 解决文件已存在错误 ```bash # 清理残留配置文件 sudo rm -f /etc/containerd/config.toml sudo rm -f /etc/docker/daemon.json sudo rm -f /var/lib/kubelet/config.yaml # 重置 containerd 配置 sudo containerd config default | sudo tee /etc/containerd/config.toml sudo systemctl restart containerd # 重置 Docker 配置 echo '{}' | sudo tee /etc/docker/daemon.json sudo systemctl restart docker ``` #### 4. 重新安装前准备 ```bash # 确保系统干净 sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 设置内核参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sudo sysctl --system # 确保 SELinux 处于 permissive 模式 sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config ``` #### 5. 重新安装 kubeadm ```bash # 添加 Kubernetes 仓库 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 EOF # 安装组件 sudo yum install -y kubeadm-1.29.3 kubelet-1.29.3 kubectl-1.29.3 --disableexcludes=kubernetes # 启动服务 sudo systemctl enable --now kubelet ``` #### 6. 重新初始化集群 ```bash # 执行预检检查 sudo kubeadm reset -f sudo kubeadm init phase preflight # 如果预检通过,初始化集群 sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Port-10250 ``` #### 7. 验证安装 ```bash # 配置 kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 检查节点状态 kubectl get nodes ``` ### 常见错误解决方案 #### 错误 1: `Port 10250 is in use` ```bash # 永久解决方案:修改 kubelet 端口 sudo sed -i 's/--port=10250/--port=10255/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf sudo systemctl daemon-reload sudo systemctl restart kubelet ``` #### 错误 2: `FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml` ```bash # 强制重置残留文件 sudo rm -f /etc/kubernetes/manifests/* sudo kubeadm reset -f ``` #### 错误 3: `container runtime network not ready` ```bash # 重置 CNI 配置 sudo rm -rf /etc/cni/net.d/* sudo systemctl restart containerd docker ``` ### 相关问题 1. 如何解决 kubeadm init 过程中的 `cgroup driver` 配置冲突? 2. 如何在 CentOS 7 上彻底清理 Kubernetes 集群以便重新安装? 3. 如何诊断和解决 kubelet 服务启动失败的问题? 4. 当多个服务端口冲突时,如何修改 Kubernetes 默认端口? 5. 如何配置 kubeadm 忽略特定 preflight 错误继续安装? > **关键提示**:在执行 `kubeadm reset -f` 后,务必重启服务器确保所有残留进程被清理[^1]。对于生产环境,建议使用 `--ignore-preflight-errors` 参数时明确指定要忽略的错误类型,而不是使用 `all`[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值