一、环境说明(含当前已运行组件)
二、核心概念回顾:Docker、cri-dockerd 与 K8s 的协作(对应当前容器状态)
从你提供的容器列表可清晰看到 “K8s 管理容器” 与 “独立 Docker 容器” 的区别,这正是 cri-dockerd 桥接作用的体现:
K8s 管理的容器:名称带
k8s_
前缀,归属kube-system
(核心组件)、kube-flannel
(网络插件)、default
(用户测试 Pod)等命名空间,由 K8s 通过 cri-dockerd 调用 Docker 创建(如k8s_nginx-test_nginx-test_default_xxx
);独立 Docker 容器:名称无
k8s_
前缀,直接由docker run
或 Docker Compose 创建(如halo-halo-1
、mysql:8.1.0
),不依赖 K8s 调度。
cri-dockerd 的核心作用:让 K8s 能识别并管理 Docker 容器(即上述 K8s 管理容器),同时不影响 Docker 自身管理的独立容器,实现 “一套 Docker 环境,两种管理方式”。
三、全流程安装步骤(结合当前状态验证)
第一步:前置环境确认(已完成,对应当前状态)
1. Docker 与 cri-dockerd 状态验证
bash
# 验证 Docker 运行
sudo systemctl status docker # 输出 active (running)
# 验证 cri-dockerd 运行
sudo systemctl status cri-docker # 输出 active (running)
当前状态匹配:容器列表中既有 K8s 管理容器,也有独立 Docker 容器,说明 Docker 与 cri-dockerd 均正常工作。
2. 基础工具安装(已完成)
bash
sudo apt update && sudo apt install -y git build-essential
第二步:cri-dockerd 0.3.19 安装(已完成,对应当前状态)
1. deb 包安装与服务启动
bash
sudo dpkg -i cri-dockerd_0.3.19.3-0.ubuntu-bionic_amd64.deb
sudo apt -f install -y # 修复依赖
sudo systemctl start cri-docker && sudo systemctl enable cri-docker
当前状态匹配:K8s 能正常创建管理容器(如
k8s_nginx-test_xxx
),证明 cri-dockerd 桥接功能生效。
第三步:K8s 1.28 核心组件安装(已完成,对应当前状态)
1. 组件安装与版本锁定
bash
# 配置 K8s 源
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装并锁定版本
sudo apt update && sudo apt install -y kubeadm=1.28.15-00 kubelet=1.28.15-00 kubectl=1.28.15-00
sudo apt-mark hold kubeadm kubelet kubectl
2. kubelet 配置(指向 cri-dockerd)
bash
sudo tee /etc/default/kubelet <<-'EOF'
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock"
EOF
sudo systemctl daemon-reload && sudo systemctl restart kubelet
当前状态匹配:容器列表中
kube-system
命名空间的核心组件(kube-apiserver-shitou
、etcd-shitou
等)均正常运行,说明 kubelet 配置正确。
第四步:Master 节点初始化(已完成,对应当前状态)
1. 初始化命令(已执行)
bash
sudo kubeadm init \
--cri-socket unix:///var/run/cri-dockerd.sock \
--pod-network-cidr=10.244.0.0/16
2. kubectl 配置(已完成)
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
当前状态匹配:可通过
kubectl
查看 Pod(如kubectl get pods
看到nginx-test
),证明 kubectl 配置生效。
第五步:Flannel 网络插件部署(已完成,对应当前状态)
bash
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.2/Documentation/kube-flannel.yml
当前状态匹配:容器列表中
k8s_kube-flannel_kube-flannel-ds-fkvsf_kube-flannel_xxx
状态为Up 32 minutes
,证明 Flannel 正常运行,Pod 网络互通。
第六步:允许 Master 调度 Pod(已完成,对应当前状态)
bash
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-
当前状态匹配:
nginx-test
测试 Pod(k8s_nginx-test_xxx
)成功调度到 Master 节点,状态为Up 27 minutes
,说明调度限制已移除。
四、当前集群状态深度验证(基于提供的容器列表)
1. 验证 K8s 核心组件健康度
从容器列表可确认,K8s 控制平面与网络组件均 100% 正常:
命令验证:
bash
# 查看 K8s 核心组件 Pod 状态(与容器列表一致)
kubectl get pods -n kube-system
# 查看节点状态(应为 Ready)
kubectl get nodes
2. 验证用户 Pod 调度与运行
容器列表中的 k8s_nginx-test_nginx-test_default_xxx
(Nginx 测试 Pod)状态为 Up 27 minutes
,证明:
Master 节点调度功能正常(污点已移除);
Pod 网络正常(Flannel 生效,Pod 能正常启动);
cri-dockerd 桥接正常(K8s 能通过 Docker 创建并管理 Pod)。
命令验证:
bash
# 查看用户测试 Pod 状态
kubectl get pods -n default
# 进入 Nginx Pod 验证网络(可选)
kubectl exec -it nginx-test -- ping 8.8.8.8 # 应能正常 ping 通
3. 区分 “K8s 管理容器” 与 “独立 Docker 容器”
容器列表中存在两类容器,需明确其归属,避免混淆:
关键提醒:
不要用
docker rm -f
删除 K8s 管理的容器(如k8s_xxx
),否则 K8s 会自动重启该容器,需用kubectl delete pod 容器名
删除;独立 Docker 容器的端口映射(如
halo-halo-1
的8090->8090
)不影响 K8s 网络,两者端口空间独立。
五、单节点升级为多节点集群(后续扩展方案)
若需扩展集群,基于当前正常状态,可按以下步骤添加 Worker/Master 节点:
(一)添加 Worker 节点(扩展计算资源)
前提条件
新节点:Ubuntu 24.04.3 LTS(x86_64),与当前 Master 网络互通(能 ping 通 Master IP);
新节点已安装:Docker(正常运行)、cri-dockerd 0.3.19(步骤同第二步)、K8s 1.28 组件(kubeadm=1.28.15-00、kubelet=1.28.15-00)。
操作步骤
在当前 Master 节点生成加入命令:
bash
kubeadm token create --print-join-command
输出示例:
kubeadm join 192.168.31.19:6443 --token abc123.def456 --discovery-token-ca-cert-hash sha256:xxxxxxxx
。在新 Worker 节点执行加入命令:
bash
sudo kubeadm join 192.168.31.19:6443 --token abc123.def456 --discovery-token-ca-cert-hash sha256:xxxxxxxx
验证:在 Master 节点执行
kubectl get nodes
,新 Worker 节点会显示为Ready
。
(二)添加 Master 节点(构建高可用集群)
前提条件
新节点配置与当前 Master 一致,网络互通;
部署负载均衡器(如 HAProxy),统一入口地址(如 192.168.31.100),指向所有 Master 的 6443 端口;
为 etcd 配置共享存储(如 NFS),确保多 Master 数据同步。
操作步骤
当前 Master 节点导出证书:
bash
mkdir -p /tmp/k8s-certs sudo cp /etc/kubernetes/pki/{ca.crt,ca.key,sa.pub,sa.key,front-proxy-ca.crt,front-proxy-ca.key} /tmp/k8s-certs/ sudo cp /etc/kubernetes/pki/etcd/ca.crt /tmp/k8s-certs/etcd-ca.crt sudo cp /etc/kubernetes/admin.conf /tmp/k8s-certs/
复制证书到新 Master 节点:
bash
scp -r /tmp/k8s-certs/* 新节点用户名@新节点IP:/tmp/
新 Master 节点加入集群:
bash
sudo mkdir -p /etc/kubernetes/pki/etcd sudo cp /tmp/{ca.crt,ca.key,sa.pub,sa.key,front-proxy-ca.crt,front-proxy-ca.key} /etc/kubernetes/pki/ sudo cp /tmp/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt # 执行加入命令(替换为负载均衡器地址和实际 token) sudo kubeadm join 192.168.31.100:6443 \ --token abc123.def456 \ --discovery-token-ca-cert-hash sha256:xxxxxxxx \ --control-plane \ --certificate-key $(sudo kubeadm certs certificate-key)
验证:在任意 Master 节点执行
kubectl get nodes
,新 Master 节点显示为Ready
,ROLES
为control-plane
。
六、关键运维提醒(基于当前环境)
禁止混用管理命令:K8s 容器用
kubectl
管理,独立 Docker 容器用docker
命令管理,避免交叉操作导致异常;备份 etcd 数据:etcd 存储集群所有配置(当前容器
etcd-shitou
),定期备份:bash
sudo ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db
监控核心组件:关注
kube-apiserver
、etcd
容器状态,若异常重启,需检查资源(CPU / 内存)是否充足;端口冲突排查:若新容器启动失败,用
sudo lsof -i :端口号
排查端口是否被 K8s 组件或其他服务占用(如当前halo-halo-1
用 8090 端口,需确保不与 K8s 服务冲突)。
当前集群已处于完全可用状态,既支持通过 K8s 部署和管理业务 Pod,也可继续使用 Docker 管理独立容器,后续可根据需求扩展多节点或部署更多业务应用。
shitou@shitou:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9dc47091ad45 nginx "/docker-entrypoint.…" 27 minutes ago Up 27 minutes k8s_nginx-test_nginx-test_default_a508274b-47e0-4db6-aaa6-e80ba27d2fd2_0
27880398b600 registry.k8s.io/pause:3.10 "/pause" 28 minutes ago Up 28 minutes k8s_POD_nginx-test_default_a508274b-47e0-4db6-aaa6-e80ba27d2fd2_0
3c27d154c75a ead0a4a53df8 "/coredns -conf /etc…" 32 minutes ago Up 32 minutes k8s_coredns_coredns-5dd5756b68-mgb5v_kube-system_56cfdbf2-e4e2-419a-affe-1e95563e5a88_0
95b8a9fe61c6 ead0a4a53df8 "/coredns -conf /etc…" 32 minutes ago Up 32 minutes k8s_coredns_coredns-5dd5756b68-qmb72_kube-system_df8349fe-54d8-4faa-a3b2-ef586d40efbf_0
cca7a2e9beeb registry.k8s.io/pause:3.10 "/pause" 32 minutes ago Up 32 minutes k8s_POD_coredns-5dd5756b68-qmb72_kube-system_df8349fe-54d8-4faa-a3b2-ef586d40efbf_0
51e587f50fb7 registry.k8s.io/pause:3.10 "/pause" 32 minutes ago Up 32 minutes k8s_POD_coredns-5dd5756b68-mgb5v_kube-system_56cfdbf2-e4e2-419a-affe-1e95563e5a88_0
74ca9f56e644 49937eb983da "/opt/bin/flanneld -…" 32 minutes ago Up 32 minutes k8s_kube-flannel_kube-flannel-ds-fkvsf_kube-flannel_c17f8db7-8d30-4cf1-bea0-ea78843863f7_0
b85c5493e6b8 registry.k8s.io/pause:3.10 "/pause" 34 minutes ago Up 34 minutes k8s_POD_kube-flannel-ds-fkvsf_kube-flannel_c17f8db7-8d30-4cf1-bea0-ea78843863f7_0
ed659b4c33d2 ba6d7f8bc25b "/usr/local/bin/kube…" 42 minutes ago Up 42 minutes k8s_kube-proxy_kube-proxy-fvzdd_kube-system_e91d3b28-5d64-444c-bde1-c2db3f9a127a_0
8dcce2dab527 registry.k8s.io/pause:3.10 "/pause" 42 minutes ago Up 42 minutes k8s_POD_kube-proxy-fvzdd_kube-system_e91d3b28-5d64-444c-bde1-c2db3f9a127a_0
458f606b3a4d 73deb9a3f702 "etcd --advertise-cl…" 43 minutes ago Up 43 minutes k8s_etcd_etcd-shitou_kube-system_280877a325ad5a107bb783c8cc2ea369_0
b22b86fe8bc3 9dc6939e7c57 "kube-apiserver --ad…" 43 minutes ago Up 43 minutes k8s_kube-apiserver_kube-apiserver-shitou_kube-system_b867a7bbae39e8d0a8443c7248d11092_0
1ee328ea1dde 10541d8af03f "kube-controller-man…" 43 minutes ago Up 43 minutes k8s_kube-controller-manager_kube-controller-manager-shitou_kube-system_77dca142417e607ce34b54b67fb461e9_ 0
52ce2c9fd07e 9d3465f8477c "kube-scheduler --au…" 43 minutes ago Up 43 minutes k8s_kube-scheduler_kube-scheduler-shitou_kube-system_ea7e2c2f6ce136f7dde14a98151b7569_0
98cc9b755135 registry.k8s.io/pause:3.10 "/pause" 43 minutes ago Up 43 minutes k8s_POD_kube-controller-manager-shitou_kube-system_77dca142417e607ce34b54b67fb461e9_0
19a889ab5d27 registry.k8s.io/pause:3.10 "/pause" 43 minutes ago Up 43 minutes k8s_POD_kube-apiserver-shitou_kube-system_b867a7bbae39e8d0a8443c7248d11092_0
43929c2f69ef registry.k8s.io/pause:3.10 "/pause" 43 minutes ago Up 43 minutes k8s_POD_etcd-shitou_kube-system_280877a325ad5a107bb783c8cc2ea369_0
5e37c0e78680 registry.k8s.io/pause:3.10 "/pause" 43 minutes ago Up 43 minutes k8s_POD_kube-scheduler-shitou_kube-system_ea7e2c2f6ce136f7dde14a98151b7569_0
2739bcc5c233 registry.fit2cloud.com/halo/halo:2.21.6 "sh -c 'java -Dreact…" 41 hours ago Up 6 h ours (healthy) 0.0.0.0:8090->8090/tcp, [::]:8090->8090/tcp halo-halo-1
d44e7b5b7540 mysql:8.1.0 "docker-entrypoint.s…" 7 months ago Up 6 h ours (healthy) 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp halo-halodb-1
b901b4b4e993 wiznote/wizserver "bash /wiz/app/entry…" 7 months ago Up 6 h ours 0.0.0.0:9269->9269/udp, [::]:9269->9269/udp, 0.0.0.0:8989->80/tcp, [::]:8989->80/tcp crazy_lumiere
64f4bbc41364 blinkospace/blinko:latest "docker-entrypoint.s…" 7 months ago Up 6 h ours (unhealthy) 0.0.0.0:2600->1111/tcp, [::]:2600->1111/tcp blinko-website
bfabae2cca70 postgres:latest "docker-entrypoint.s…" 7 months ago Up 6 h ours (healthy) 0.0.0.0:5435->5432/tcp, [::]:5435->5432/tcp