当前位置: 首页 > news >正文

k8s中docker cri


一、Kubernetes 架构总览

Kubernetes 采用 分层架构,核心是 控制平面 (Control Plane)工作节点 (Worker Nodes),通过 API 进行通信。

┌─────────────────────────────────────────────────────────────────────┐
│                        Kubernetes 集群                               │
├─────────────────────────────────────────────────────────────────────┤
│  控制平面 (Control Plane)              │  工作节点 (Worker Nodes)     │
│  ┌─────────────────────────────────┐  │  ┌─────────────────────────┐  │
│  │  API Server (kube-apiserver)    │  │  │  kubelet               │  │
│  │  - 集群的"大脑"和唯一入口       │  │  │  - 节点代理            │  │
│  │  - 处理 REST API 请求           │  │  │  - 与 CRI 交互         │  │
│  │  - 更新 etcd 状态               │  │  └─────────────────────────┘  │
│  └─────────────────────────────────┘  │  ┌─────────────────────────┐  │
│  ┌─────────────────────────────────┐  │  │  kube-proxy            │  │
│  │  etcd (分布式键值存储)          │  │  │  - 网络代理            │  │
│  │  - 存储集群所有状态             │  │  │  - 实现 Service 网络   │  │
│  │  - 强一致性、高可用             │  │  └─────────────────────────┘  │
│  └─────────────────────────────────┘  │  ┌─────────────────────────┐  │
│  ┌─────────────────────────────────┐  │  │  容器运行时 (CRI)       │  │
│  │  Scheduler (调度器)             │  │  │  - containerd / CRI-O  │  │
│  │  - 为 Pod 选择最优节点          │  │  │  - 管理容器生命周期    │  │
│  └─────────────────────────────────┘  │  └─────────────────────────┘  │
│  ┌─────────────────────────────────┐  │  ┌─────────────────────────┐  │
│  │  Controller Manager             │  │  │  CNI 插件 (网络)        │  │
│  │  - 维护集群期望状态             │  │  │  - Calico / Flannel    │  │
│  └─────────────────────────────────┘  │  └─────────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘

二、核心组件详解(含 CRI)

1. 控制平面组件

API Server (kube-apiserver)

  • 作用:集群的唯一入口,所有操作的网关
  • 关键功能
    • 认证、授权、准入控制
    • 验证资源定义(YAML)
    • 更新 etcd 中的集群状态
    • 与其他组件通信(通过 watch 机制)
  • 通信协议:HTTPS (默认端口 6443)

etcd

  • 作用:集群的"数据库",存储所有对象状态
  • 部署方式
    • 静态 Pod:由 kubelet 管理(kubeadm 默认)
    • 外部集群:独立部署,更可靠
  • 备份:定期使用 etcdctl 备份

Scheduler

  • 作用:Pod 调度决策
  • 调度流程
    1. 监听未调度的 Pod
    2. 过滤节点(资源、亲和性、污点等)
    3. 打分节点(优先级、负载等)
    4. 绑定 Pod 到节点

Controller Manager

  • 作用:维护集群的"期望状态"
  • 核心控制器
    • Node Controller:节点健康检查
    • Replication Controller:维护副本数
    • Endpoint Controller:Service 端点管理
    • Service Account Controller:服务账户管理
    • Cloud Controller:云厂商集成

2. 工作节点组件(重点:CRI)

kubelet

  • 作用:节点代理,管理 Pod 生命周期
  • 关键职责
    1. 向 API Server 注册节点
    2. 监听 PodSpec(通过 API Server)
    3. 调用 CRI 接口创建容器
    4. 挂载存储卷
    5. 执行健康检查(liveness/readiness)
    6. 报告节点和 Pod 状态

kube-proxy

  • 作用:实现 Service 网络模型
  • 工作模式
    • iptables 模式(默认):使用 iptables 规则
    • ipvs 模式:性能更好,需要内核支持
    • userspace 模式(已弃用)

容器运行时 (CRI) - 重点详解

CRI (Container Runtime Interface) 是 Kubernetes 与容器运行时之间的标准接口。Kubernetes 通过 gRPC 与 CRI 通信,不直接调用 Docker。

CRI 架构
┌─────────────────────────────────────────────────────────────┐
│                    kubelet (节点代理)                        │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  CRI 插件接口 (gRPC)                                  │  │
│  │  - RuntimeService: 容器生命周期管理                   │  │
│  │  - ImageService: 镜像管理                             │  │
│  └───────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ▼                                  │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  容器运行时 (CRI 实现)                                 │  │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  │  │
│  │  │  containerd │  │   CRI-O     │  │  Docker     │  │  │
│  │  │  (推荐)     │  │  (K8s原生)  │  │  (已弃用)   │  │  │
│  │  └─────────────┘  └─────────────┘  └─────────────┘  │  │
│  └───────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘
CRI 核心接口

RuntimeService - 容器生命周期管理:

  • RunPodSandbox: 创建 Pod 沙箱(网络命名空间)
  • CreateContainer: 创建容器
  • StartContainer: 启动容器
  • StopContainer: 停止容器
  • RemoveContainer: 删除容器
  • ListContainers: 列出容器
  • ContainerStatus: 获取容器状态

ImageService - 镜像管理:

  • ListImages: 列出镜像
  • PullImage: 拉取镜像
  • RemoveImage: 删除镜像
  • ImageStatus: 获取镜像状态
CRI 实现对比
运行时 特点 适用场景 配置位置
containerd 轻量级、CNCF 毕业项目、Kubernetes 默认 生产环境、云原生 /etc/containerd/config.toml
CRI-O Kubernetes 原生、OCI 标准 Red Hat 生态、OpenShift /etc/crio/crio.conf
Docker 已弃用(K8s 1.24+) 旧版本、开发测试 不推荐使用
containerd 配置详解
# /etc/containerd/config.toml
version = 2[plugins."io.containerd.grpc.v1.cri"]# Pod 沙箱镜像 - 你之前打标签的 pause 镜像sandbox_image = "docker.swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.6-linuxarm64"[plugins."io.containerd.grpc.v1.cri".containerd]# 存储驱动snapshotter = "overlayfs"# 默认运行时default_runtime_name = "runc"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]runtime_type = "io.containerd.runc.v2"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true[plugins."io.containerd.grpc.v1.cri".registry]# 镜像仓库配置[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["https://docker.io"][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.swr.cn-north-4.myhuaweicloud.com"]endpoint = ["https://docker.swr.cn-north-4.myhuaweicloud.com"]

关键配置说明

  • sandbox_image: Pod 沙箱镜像(你之前打标签的 pause 镜像)
  • snapshotter: 存储驱动(overlayfs 是最常用的)
  • default_runtime_name: 默认运行时(runc)
  • registry.mirrors: 镜像仓库镜像(加速拉取)
CRI 工作流程
  1. 用户提交 Pod → API Server → etcd
  2. Scheduler 调度 → 绑定到节点
  3. kubelet 监听 → 获取 PodSpec
  4. kubelet 调用 CRI
    • RunPodSandbox:创建网络命名空间
    • CreateContainer:创建容器
    • StartContainer:启动容器
  5. CRI 调用底层运行时
    • containerd → runc → 创建容器
  6. kubelet 报告状态 → API Server

3. 网络插件 (CNI)

CNI (Container Network Interface)

  • 作用:容器网络标准接口
  • 工作流程
    1. kubelet 创建 Pod 时调用 CNI 插件
    2. CNI 插件配置网络(IP、路由、防火墙)
    3. 返回网络信息给 kubelet

常见 CNI 插件

插件 特点 适用场景
Calico 基于 BGP,支持网络策略 生产环境,需要网络隔离
Flannel Overlay 网络,简单易用 测试环境,简单部署
Cilium 基于 eBPF,性能优秀 高性能、安全要求高的场景

4. Ingress 控制器

Ingress 作用

  • Layer 7 负载均衡:基于路径、主机名路由
  • TLS 终止:管理 HTTPS 证书
  • 流量管理:重写、重定向等

三、部署方式总结

1. 安装工具对比

工具 适用场景 优点 缺点
kubeadm 生产环境,官方推荐 简单、灵活、社区支持 需要手动配置高可用
k3s 边缘计算、IoT 轻量级、单二进制文件 功能简化
Rancher 多集群管理 图形界面、易用 资源占用较大
Minikube 本地开发测试 简单快速 仅限单节点

2. 高可用部署架构

┌─────────────────────────────────────────────────────────────┐
│                    负载均衡器 (LB)                           │
│                  (如 HAProxy, Keepalived)                   │
└─────────────────────────────────────────────────────────────┘│┌───────────────────┼───────────────────┐▼                   ▼                   ▼
┌───────────────┐   ┌───────────────┐   ┌───────────────┐
│  Master 节点 1 │   │  Master 节点 2 │   │  Master 节点 3 │
│  (Control     │   │  (Control     │   │  (Control     │
│   Plane)      │   │   Plane)      │   │   Plane)      │
│  - API Server │   │  - API Server │   │  - API Server │
│  - etcd       │   │  - etcd       │   │  - etcd       │
│  - Scheduler  │   │  - Scheduler  │   │  - Scheduler  │
│  - Controller │   │  - Controller │   │  - Controller │
└───────────────┘   └───────────────┘   └───────────────┘│                   │                   │└───────────────────┼───────────────────┘▼┌───────────────┐│  Worker 节点  ││  (多个)       ││  - kubelet    ││  - kube-proxy ││  - CNI 插件   │└───────────────┘

四、关键配置文件总结

1. kubeadm 配置文件

# kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.0
controlPlaneEndpoint: "k8s-master:6443"
networking:podSubnet: "10.244.0.0/16"serviceSubnet: "10.96.0.0/12"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:criSocket: "unix:///var/run/containerd/containerd.sock"

2. CRI 配置(containerd)

# /etc/containerd/config.toml
version = 2[plugins."io.containerd.grpc.v1.cri"]sandbox_image = "docker.swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.6-linuxarm64"[plugins."io.containerd.grpc.v1.cri".containerd]snapshotter = "overlayfs"default_runtime_name = "runc"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]runtime_type = "io.containerd.runc.v2"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true[plugins."io.containerd.grpc.v1.cri".registry][plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["https://docker.io"][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.swr.cn-north-4.myhuaweicloud.com"]endpoint = ["https://docker.swr.cn-north-4.myhuaweicloud.com"]

3. kubelet 配置

# /etc/kubernetes/kubelet.conf
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
containerRuntimeEndpoint: "unix:///var/run/containerd/containerd.sock"

五、部署后验证清单

1. 集群状态检查

# 检查所有节点状态
kubectl get nodes -o wide# 检查所有 Pod 状态
kubectl get pods -A -o wide# 检查系统组件
kubectl get pods -n kube-system

2. CRI 验证

# 检查 containerd 状态
systemctl status containerd# 检查 containerd 配置
cat /etc/containerd/config.toml | grep sandbox_image# 检查 CRI 接口
crictl info  # 需要安装 crictl# 检查容器运行时
crictl ps -a

3. 网络连通性测试

# 测试 DNS 解析
kubectl run -it --rm --image=busybox:1.28 test-pod -- nslookup kubernetes.default# 测试 Service 连通性
kubectl run -it --rm --image=busybox:1.28 test-pod -- ping 10.96.0.1

4. 存储验证

# 检查存储类
kubectl get storageclass# 测试动态存储
kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi
EOF

六、常见问题排查

1. 节点 NotReady 状态

# 检查 kubelet 日志
journalctl -u kubelet -f# 检查容器运行时
systemctl status containerd# 检查 CRI 配置
crictl info

2. Pod 无法创建

# 查看 Pod 事件
kubectl describe pod <pod-name># 检查 CRI 日志
journalctl -u containerd -f# 检查镜像拉取
crictl images

3. 网络问题

# 检查 CNI 插件
kubectl get pods -n kube-system | grep calico# 检查 kube-proxy 模式
kubectl get configmap -n kube-system kube-proxy -o yaml | grep mode

4. CRI 相关问题

# 检查 CRI 套接字
ls -l /var/run/containerd/containerd.sock# 测试 CRI 接口
crictl version# 检查 Pod 沙箱镜像
crictl images | grep pause

七、最佳实践建议

1. 集群配置

  • etcd 高可用:至少 3 节点,奇数个节点
  • CRI 选择:生产环境推荐 containerd
  • 网络插件:生产环境推荐 Calico 或 Cilium
  • 存储:使用动态存储类(StorageClass)

2. CRI 最佳实践

  • 使用 containerd:轻量级、性能好
  • 配置镜像加速:设置国内镜像仓库
  • 配置 pause 镜像:使用国内镜像源
  • 定期清理:使用 crictl rmi 清理无用镜像

3. 安全配置

  • RBAC:启用并配置适当的权限
  • 网络策略:使用 NetworkPolicy 限制 Pod 通信
  • Secrets 管理:使用外部 Secret 存储(如 Vault)

4. 监控告警

  • Prometheus + Grafana:监控集群状态
  • EFK/ELK:日志收集
  • Alertmanager:告警通知

八、下一步学习建议

  1. 深入学习
    • CRI 工作原理和调试
    • 容器网络模型(CNI)
    • 存储卷和持久化
  2. 实践项目
    • 部署有状态应用(数据库)
    • 配置 Ingress 和 TLS
    • 实现 CI/CD 流水线
  3. 高级主题
    • Service Mesh(Istio/Linkerd)
    • GitOps(ArgoCD/Flux)
    • 多集群管理

总结

你已经完成了 Kubernetes 的基础部署,现在可以:

  1. 验证集群健康状态
  2. 部署第一个应用
  3. 配置网络和存储
  4. 设置监控和日志

Kubernetes 是一个不断发展的生态系统,建议持续关注官方文档和社区动态。祝你 Kubernetes 之旅顺利!

恭喜你!你的 3 节点 Kubernetes 集群(1 个 Master + 2 个 Worker)已经成功恢复并运行在 v1.23.17 版本,且使用 Docker 作为容器运行时。

以下是基于你本次操作的完整本地安装步骤总结,你可以将其作为以后重装或搭建新环境的参考手册。


本地安装 Kubernetes 集群(3节点 + Docker)完整步骤

0. 环境准备(所有节点:Master & Workers)

在所有节点上执行以下基础配置:

  1. 关闭防火墙 & Swap & SELinux

    systemctl stop firewalld && systemctl disable firewalld
    swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/config/selinux
    
  2. 配置 Hosts 解析 (参考你刚才的配置)

    cat >> /etc/hosts << EOF
    172.16.1.131 k8s-master k8s131.oldboyedu.com
    172.16.1.132 k8s-node1 k8s132.oldboyedu.com
    172.16.1.133 k8s-node2 k8s133.oldboyedu.com
    EOF
    
  3. 配置内核参数

    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    sysctl --system
    
  4. 安装基础工具

    yum install -y yum-utils device-mapper-persistent-data lvm2
    

1. 安装 Docker 容器运行时(所有节点)

Kubernetes 1.23+ 使用 Docker 需要通过 cri-dockerd 桥接,且必须配置 systemd cgroup 驱动。

  1. 安装 Docker

    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum install -y docker-ce docker-ce-cli containerd.io
    systemctl start docker && systemctl enable docker
    
  2. 配置 Docker Daemon

    cat > /etc/docker/daemon.json << EOF
    {"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": { "max-size": "100m" },"storage-driver": "overlay2"
    }
    EOF
    systemctl daemon-reload
    systemctl restart docker
    
  3. 安装 cri-dockerd (Docker 的 CRI 接口)

    • 下载二进制文件:

      wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz
      tar -zxvf cri-dockerd-0.3.4.amd64.tgz
      mv cri-dockerd/cri-dockerd /usr/local/bin/
      
    • 配置 systemd 服务:

      cat > /etc/systemd/system/cri-dockerd.service << EOF
      [Unit]
      Description=CRI Docker Daemon
      After=network.target
      [Service]
      ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint unix:///var/run/cri-dockerd.sock --network-plugin=cni
      Restart=always
      [Install]
      WantedBy=multi-user.target
      EOF
      
    • 启动服务:

      systemctl daemon-reload
      systemctl enable cri-dockerd
      systemctl start cri-dockerd

2. 安装 Kubernetes 组件(所有节点)

  1. 配置 Kubernetes YUM 源

    cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpghttps://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOF
  2. 安装 kubeadm, kubelet, kubectl

    yum install -y kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17
    systemctl enable kubelet
    # 注意:此时不要启动 kubelet,等待初始化

3. 初始化 Master 节点(仅在 Master 执行)

  1. 拉取镜像 (使用国内源加速,避免卡顿)

    kubeadm config images pull \--kubernetes-version=v1.23.17 \--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
  2. 初始化集群

    kubeadm init \--pod-network-cidr=10.244.0.0/16 \--kubernetes-version=v1.23.17 \--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
  3. 配置 kubectl
    初始化成功后,复制输出的最后三行命令:

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  4. 安装网络插件 (Flannel)

    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

4. 加入 Worker 节点(仅在 Workers 执行)

在 Master 节点生成加入命令:

kubeadm token create --print-join-command

在 Worker 节点(k8s132, k8s133)执行生成的命令:

# 示例命令
kubeadm join 172.16.1.131:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

5. 验证集群

在 Master 节点执行:

kubectl get nodes
# 预期输出:所有节点 STATUS 为 Ready

关键点总结(避坑指南)

  1. cgroup 驱动:Docker 和 Kubelet 必须都使用 systemd 驱动(/etc/docker/daemon.jsonkubeadm init 参数)。
  2. cri-dockerd:K8s 1.23+ 不再内置 DockerShim,必须安装 cri-dockerd 服务。
  3. 镜像源:国内环境务必使用 --image-repository 指定阿里云或其它国内源,否则初始化会卡死。
  4. 清理环境:重装时务必执行 kubeadm reset -f 并清理 iptables 和 /etc/cni/net.d
  5. Hosts 解析:确保节点间可以通过主机名互相 ping 通。

这套步骤完全复刻了你刚才的成功操作,适用于 CentOS 7/8 或 Rocky Linux 环境。

http://www.jsqmd.com/news/545813/

相关文章:

  • 终极指南:如何为ente/auth开发自定义插件扩展功能
  • ai赋能设计:基于快马探索solidworks装配体的智能布局与优化思路
  • 老旧电脑焕新生:OpenClaw远程调用Qwen3-32B-Chat提升低配设备能力
  • Lobe Theme:重构Stable Diffusion WebUI体验的现代化主题
  • 从零到精通的嵌入式Linux与单片机学习路线对比
  • 如何快速实现Redux-Saga与Next.js集成:终极服务端渲染异步状态管理指南
  • python-flask-djangol框架的高校毕业生就业信息实习管理系统
  • python基于微信小程序的旅游攻略分享平台
  • 24周Web开发入门指南:微软官方完整课程助你从零开始
  • GME-Qwen2-VL-2B-Instruct部署案例:信创环境(麒麟/UOS)下本地运行实录
  • 分享一套锋哥原创的的AI大模型-基于LangChain的RAG健康知识智能问答系统(Flask+Vue3+Ollama+Chroma)
  • ente/auth日志系统解析:监控与调试技巧
  • 巨有科技:银发文旅风口来了!康养旅游这样做才赚
  • 电商用户评价分析实战:用Python+SnowNLP打造情感分析工具(附代码)
  • 虚拟化管理工具实战指南:如何通过virt-manager实现高效虚拟机管理
  • QT窗口特效实战:从透明到异形控件的全方位实现指南
  • # 发散创新:边缘容器中的轻量级服务部署实战与优化策略在云计算向边缘计算演进的浪潮中,**边缘容器技术**正成
  • Java高频面试题:ShardingSphere的核心模块有哪些?他们是如何工作的?
  • HP-Socket代码重构工作量估算准确性分析:偏差与改进
  • RPA-Python与pytest-buildah集成:Buildah测试自动化
  • 利玛窦的记忆宫殿 - liyan
  • Obsidian Local Images Plus 终极指南:如何一键解决所有本地图片管理难题
  • Zotero插件Ethereal Style:打造高效文献管理新体验
  • PVE 部署 iStoreOS 软路由完整教程(避坑版)
  • COMSOL仿真技术在变压器电磁场模型研究中的应用:探究磁密分布与电路状态结果
  • OpenClaw学习助手:GLM-4.7-Flash实现的错题本自动整理
  • 3步突破分子构象采样瓶颈:从理论到药物研发落地
  • SQL Server数据同步不求人:手把手教你用Linked Server实现跨库查询(2024最新版)
  • VAP:腾讯开源的高性能动画播放引擎,如何让你的应用动起来更流畅?
  • ente/auth缓存机制详解:提高系统响应速度