一、环境说明(含当前已运行组件)

类别

组件 / 版本

状态与说明

基础环境

Ubuntu 24.04.3 LTS (x86_64)

集群运行基础,apt 包管理正常

容器运行时

Docker Engine(已运行)+ cri-dockerd 0.3.19

Docker 提供容器基础能力,cri-dockerd 作为 K8s 与 Docker 的桥接组件,均正常运行

Kubernetes 核心组件

kubeadm=1.28.15-00、kubelet=1.28.15-00、kubectl=1.28.15-00

控制平面(apiserver、controller-manager、scheduler、etcd)及 kube-proxy 均运行

网络插件

Flannel v0.22.2

以 DaemonSet 形式运行,确保 Pod 网络互通

已运行容器

K8s 管理容器(Nginx 测试 Pod、coredns 等)+ 独立 Docker 容器(halo、mysql 等)

K8s 容器通过 cri-dockerd 调度,独立容器直接由 Docker 管理,互不干扰

二、核心概念回顾:Docker、cri-dockerd 与 K8s 的协作(对应当前容器状态)

从你提供的容器列表可清晰看到 “K8s 管理容器” 与 “独立 Docker 容器” 的区别,这正是 cri-dockerd 桥接作用的体现:

  1. K8s 管理的容器:名称带 k8s_ 前缀,归属 kube-system(核心组件)、kube-flannel(网络插件)、default(用户测试 Pod)等命名空间,由 K8s 通过 cri-dockerd 调用 Docker 创建(如 k8s_nginx-test_nginx-test_default_xxx);

  2. 独立 Docker 容器:名称无 k8s_ 前缀,直接由 docker run 或 Docker Compose 创建(如 halo-halo-1mysql: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-shitouetcd-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% 正常

组件

容器标识

状态

说明

kube-apiserver

k8s_kube-apiserver_kube-apiserver-shitou

Up 43m

K8s 核心入口,所有请求必经组件,正常运行

kube-controller-manager

k8s_kube-controller-manager_kube-controller-manager-shitou

Up 43m

集群资源管理核心,正常运行

kube-scheduler

k8s_kube-scheduler_kube-scheduler-shitou

Up 43m

Pod 调度决策组件,正常运行

etcd

k8s_etcd_etcd-shitou

Up 43m

集群数据存储(键值数据库),正常运行

kube-proxy

k8s_kube-proxy_kube-proxy-fvzdd

Up 42m

节点网络代理,实现 Service 功能,正常运行

Flannel

k8s_kube-flannel_kube-flannel-ds-fkvsf

Up 32m

网络插件,确保 Pod 互通,正常运行

coredns

k8s_coredns_coredns-5dd5756b68-xxx

Up 32m

集群 DNS 服务,解析 Pod/Service 域名,正常运行

命令验证:

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 容器”

容器列表中存在两类容器,需明确其归属,避免混淆:

类别

容器示例

管理方式

依赖组件

K8s 管理容器

k8s_nginx-test_xxxk8s_coredns_xxx

K8s (kubectl)

依赖 cri-dockerd、kubelet、Flannel 等,删除需用 kubectl delete

独立 Docker 容器

halo-halo-1mysql:8.1.0wiznote/wizserver

Docker (docker cmd)

直接由 Docker 管理,与 K8s 无关,删除需用 docker rm -f

关键提醒:

  • 不要用 docker rm -f 删除 K8s 管理的容器(如 k8s_xxx),否则 K8s 会自动重启该容器,需用 kubectl delete pod 容器名 删除;

  • 独立 Docker 容器的端口映射(如 halo-halo-1 的 8090->8090)不影响 K8s 网络,两者端口空间独立。

五、单节点升级为多节点集群(后续扩展方案)

若需扩展集群,基于当前正常状态,可按以下步骤添加 Worker/Master 节点:

(一)添加 Worker 节点(扩展计算资源)

前提条件

  1. 新节点:Ubuntu 24.04.3 LTS(x86_64),与当前 Master 网络互通(能 ping 通 Master IP);

  2. 新节点已安装:Docker(正常运行)、cri-dockerd 0.3.19(步骤同第二步)、K8s 1.28 组件(kubeadm=1.28.15-00、kubelet=1.28.15-00)。

操作步骤

  1. 在当前 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

  2. 在新 Worker 节点执行加入命令

    bash

    sudo kubeadm join 192.168.31.19:6443 --token abc123.def456 --discovery-token-ca-cert-hash sha256:xxxxxxxx
    

  3. 验证:在 Master 节点执行 kubectl get nodes,新 Worker 节点会显示为 Ready

(二)添加 Master 节点(构建高可用集群)

前提条件

  1. 新节点配置与当前 Master 一致,网络互通;

  2. 部署负载均衡器(如 HAProxy),统一入口地址(如 192.168.31.100),指向所有 Master 的 6443 端口;

  3. 为 etcd 配置共享存储(如 NFS),确保多 Master 数据同步。

操作步骤

  1. 当前 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/
    

  2. 复制证书到新 Master 节点

    bash

    scp -r /tmp/k8s-certs/* 新节点用户名@新节点IP:/tmp/
    

  3. 新 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)
    

  4. 验证:在任意 Master 节点执行 kubectl get nodes,新 Master 节点显示为 ReadyROLES 为 control-plane

六、关键运维提醒(基于当前环境)

  1. 禁止混用管理命令:K8s 容器用 kubectl 管理,独立 Docker 容器用 docker 命令管理,避免交叉操作导致异常;

  2. 备份 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
    

  3. 监控核心组件:关注 kube-apiserveretcd 容器状态,若异常重启,需检查资源(CPU / 内存)是否充足;

  4. 端口冲突排查:若新容器启动失败,用 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