k8s集群部署的方法原理

K8s集群部署方法原理与全流程部署指南

一、为什么需要K8s

1. 应用部署方式的演变

应用部署经历了三个主要阶段:

  1. 传统部署:应用直接部署在物理机上。这种方式简单直接,但无法定义资源边界,导致不同程序之间容易互相影响,资源利用率极低。
  2. 虚拟化部署:一台物理机上运行多个虚拟机,实现了环境隔离。但每个虚拟机都需要完整的操作系统,造成了大量的资源浪费。
  3. 容器化部署:容器共享宿主机的操作系统,实现了轻量级隔离。但随之带来了新的管理难题:当容器发生故障时,谁来自动替补?当并发量激增时,谁来负责横向扩展?

2. 容器编排工具的诞生

为了解决容器化带来的管理难题,容器编排工具应运而生。常见的工具包括:

  • Swarm:Docker 自带的容器编排工具
  • Mesos:Apache 的资源统一管控工具,需结合 Marathon 使用
  • Kubernetes:Google 开源的容器编排工具,目前最主流的方案

二、K8s是什么

1. K8s的核心概念

K8s来源于Google内部著名的Borg系统,集结了Borg多年的设计精华与经验教训。它的本质是一组服务器集群,通过在集群的每个节点上运行特定程序,来统一管理所有的容器。

2. K8s的核心能力

K8s为容器化应用提供了强大的自动化管理能力,主要包括:

  • 自我修复:当容器崩溃时,系统能在1秒内自动启动新容器进行替补。
  • 弹性伸缩:根据业务负载,自动调整容器的数量。
  • 服务发现与负载均衡:自动发现依赖的服务,并将多容器的请求自动分发。
  • 版本回退:当新版本出现问题时,可立即回退到稳定版本。
  • 存储编排:自动创建并挂载存储卷。

三、K8s架构设计

K8s的架构主要分为Master(控制平面/决策层)和Node(数据平面/执行层),整体呈现分层架构(生态层→接口层→治理层→应用层→核心层→底层插件支撑层)。

1. Master组件职责(决策层)

组件 通俗比喻 作用说明
API Server 前台接待员 资源操作的唯一入口,负责接收用户命令,提供认证、授权、API注册和发现功能
Scheduler 调度员 集群资源调度器,按照特定策略将Pod分配到最合适的Node上
Controller Manager 监工 集群状态的维护者,负责部署安排、故障检测、自动扩展以及滚动更新等
Etcd 记事本 分布式键值存储,是集群的唯一数据源,安全存储着所有资源对象的信息

2. Node组件职责(执行层)

组件 通俗比喻 作用说明
Kubelet 驻场代表 维护容器的生命周期,同时管理Volume(存储)和Network(网络)
Container Runtime 执行者 负责镜像的管理和容器的真正运行
Kube-Proxy 网络管家 为Service提供服务发现和负载均衡功能

3. 组件协作流程

一个典型的请求处理流程如下:

  1. 用户向 API Server 发送请求:"请帮我运行一个 Nginx 服务,需要 3 个副本"
  2. API Server 将请求写入 Etcd
  3. Controller Manager 发现期望状态(3个副本)与实际状态(0个副本)不符,创建 3 个 Pod 对象
  4. Scheduler 发现这 3 个 Pod 还没有分配节点,根据资源情况挑选 3 个合适的 Node,并将绑定信息写入 Etcd
  5. 目标 Node 上的 Kubelet 监听到 Pod 被分配到了自己这里,调用 Container Runtime 拉取 Nginx 镜像并启动容器
  6. Kubelet 持续监控并向 API Server 汇报容器状态,直到 3 个 Pod 全部运行正常

4. K8s的分层架构

层级 说明
生态层 OpenShift、Rancher、Prometheus、ELK 等周边生态
接口层 kubectl、客户端库、Dashboard 等用户交互工具
治理层 RBAC 权限控制、资源配额、网络策略、自动扩缩容等
应用层 Deployment、StatefulSet、DaemonSet、Service、Ingress 等工作负载
核心层 kube-apiserver、etcd、kube-scheduler、kube-controller-manager 等核心组件
底层插件支撑层 Container Runtime、Network Plugin、Volume Plugin、Image Registry 等基础插件

5. 常用核心概念

  • Pod:K8s中最小的控制单元,容器都是运行在Pod中的,一个Pod中可以有1个或更多容器。
  • Controller:控制器,通过它来实现对Pod的管理,比如启动、停止、伸缩Pod的数量等。
  • Service:Pod对外服务的统一入口,下面可以维护同一类的多个Pod。
  • Label(标签):用于对Pod进行分类,同一类Pod会拥有相同的标签。
  • NameSpace(命名空间):用来隔离Pod的运行环境,不同命名空间之间的资源互不影响。

6. 核心镜像说明

镜像 作用说明
pause Pod的"根容器",为Pod内所有容器提供共享的网络和PID命名空间,本身不做业务逻辑,仅占用极少资源
coredns 集群内部DNS服务,负责服务发现与域名解析,将Service名称解析为对应的ClusterIP
etcd 分布式键值存储,是K8s集群的唯一数据源,存储所有集群状态、配置和对象数据
kube-proxy 节点上的网络代理,维护节点的网络规则,实现Service的负载均衡和端口转发
kube-scheduler 调度器,根据资源需求、节点亲和性、污点容忍等策略为Pod选择最优运行节点
kube-controller-manager 控制器管理器,运行各种控制器以维护集群状态,确保集群始终符合期望状态
kube-apiserver K8s API网关,是集群的唯一入口,处理所有REST API请求,负责认证、授权、准入控制

四、K8s集群部署环境规划

1. 主机规划表

角色 主机名 IP 地址 配置 说明
Harbor harbor 172.25.254.250 CPU 1、内存 1G 私有镜像仓库
Master master-node 172.25.254.100 CPU 4、内存 >4G K8s 控制平面
Node1 node1 172.25.254.10 CPU 2、内存 2G K8s 工作节点
Node2 node2 172.25.254.20 CPU 2、内存 2G K8s 工作节点

2. 容器运行时选择说明

K8s 本身不直接管理容器,而是通过 CRI(容器运行时接口)与底层运行时通信。常见的选择有:

  • Docker:通过 cri-dockerd 桥接,K8s 1.24 版本后移除了内置 dockershim 支持,需借助 cri-dockerd
  • containerd:Docker 剥离出的核心运行时,轻量高效
  • cri-o:专为 K8s 设计的轻量级运行时

五、K8s集群部署全流程

第一步:部署Harbor镜像仓库

做什么:在Harbor节点上搭建私有镜像仓库,用于存放K8s所需的核心镜像。

为什么:生产环境通常无法直接访问外网。通过本地镜像仓库统一管理镜像,不仅能加速节点拉取镜像的速度,还能保障内网环境的安全与稳定。

1.1 部署Docker本地仓库

在 Harbor 节点上先搭建一个本地 Docker 镜像仓库,用于存放 K8s 所需镜像:

bash 复制代码
# 配置 Docker 的阿里云 Yum 源
cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0
EOF

# 安装 Apache HTTP 服务(用于提供本地 yum 源和镜像下载)
dnf install httpd createrepo -y

# 创建 Docker RPM 包存放目录
mkdir -p /var/www/html/docker/

# 配置 Apache 监听端口 4444,防止端口冲突
vim /etc/httpd/conf/httpd.conf
# 添加:Listen 4444

# 启动 Apache
systemctl enable --now httpd

# 下载 Docker RPM 包
dnf install docker-ce -downloadonly --destdir /mnt/ -y

# 将 RPM 包复制到 Apache 目录下
mv /mnt/*.rpm /var/www/html/docker/

# 创建本地 yum 仓库索引
createrepo -v /var/www/html/docker/

# 修改 Docker Yum 源指向本地仓库
cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = http://172.25.254.254:4444/docker
gpgcheck = 0
EOF

# 从本地仓库安装 Docker
dnf install docker-ce -y
1.2 安装Docker并配置

在所有节点安装 Docker 并配置内核参数:

bash 复制代码
# 安装 Docker
dnf install docker-ce -y

# 加载桥接模块
echo br_netfilter > /etc/modules-load.d/docker_mod.conf
modprobe -a br_netfilter

# 配置内核参数
vim /etc/sysctl.d/docker.conf
# 添加以下内容:
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

# 重启模块加载服务并生效
systemctl restart systemd-modules-load.service
sysctl --system

# 修改 Docker 启动参数
vim /lib/systemd/system/docker.service
# 确保 ExecStart 行包含:
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true

# 重载并启动 Docker
systemctl daemon-reload
systemctl enable --now docker
1.3 生成SSL证书

为 Harbor 生成自签名 SSL 证书,确保镜像传输安全:

bash 复制代码
# 创建证书目录
mkdir -p /data/certs

# 生成自签名证书
openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout /data/certs/timinglee.org.key \
-addext "subjectAltName = DNS:reg.timinglee.org" \
-x509 -days 365 -out /data/certs/timinglee.org.crt

# 按提示填写证书信息:
# Country Name (2 letter code) [XX]: CN
# State or Province Name (full name): Shannxi
# Locality Name (eg, city) [Default City]: Xi'an
# Organization Name (eg, company) [Default Company Ltd]: kubernetes
# Organizational Unit Name (eg, section): harbor
# Common Name (eg, your name or your server's hostname): reg.timinglee.org
# Email Address []: admin@timinglee.org
1.4 配置并启动Harbor
bash 复制代码
# 解压 Harbor 安装包
tar zxf harbor-offline-installer-v2.5.4.tgz -C /opt/
cd /opt/harbor/

# 复制配置文件模板
cp harbor.yml.tmpl harbor.yml

# 编辑 Harbor 配置文件
vim harbor.yml
# 修改以下内容:
 hostname: reg.timinglee.org
 certificate: /data/certs/timinglee.org.crt
private_key: /data/certs/timinglee.org.key
 harbor_admin_password: lee

# 执行安装(启用 Chart Museum)
./install.sh --with-chartmuseum
bash 复制代码
# 配置 Harbor 为 systemd 服务
vim /lib/systemd/system/harbor.service
# 添加以下内容:
 [Unit]
 Description=harbor with Docker Compose
 Documentation=https://reg.timinglee.com/compose/
 After=docker.service network-online.target
 Requires=docker.service
[Service]
 Type=oneshot
 WorkingDirectory=/opt/harbor
 ExecStart=/usr/bin/docker compose up -d
 ExecStop=/usr/bin/docker compose down
 RemainAfterExit=yes
 [Install]
 WantedBy=multi-user.target

# 启用并启动 Harbor 服务
systemctl enable --now harbor
1.5 验证Harbor
bash 复制代码
# 配置 Docker 信任 Harbor 的证书
mkdir -p /etc/docker/certs.d/reg.timinglee.org/
cp /data/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt

# 配置主机名解析
vim /etc/hosts
# 添加:172.25.254.250 harbor reg.timinglee.org

# 重启 Docker
systemctl restart docker

# 手动启动 Harbor
docker compose up -d

# 登录 Harbor 验证
docker login reg.timinglee.org -u admin
# 输入密码后显示 "Login Succeeded" 即表示成功

第二步:配置所有K8s节点

做什么:在所有节点(master、node1、node2)上完成基础环境配置,包括关闭Swap、安装Docker、配置Docker使用Harbor仓库、配置Docker加速器、配置主机解析、配置K8s安装源。

为什么:关闭安全限制和防火墙是为了避免网络通信被拦截;时间同步是保证集群日志和证书验证准确的前提;禁用Swap是为了防止节点内存不足时将数据交换到磁盘,导致K8s性能严重下降。

2.1 关闭Swap

K8s 要求关闭 Swap 以保证资源调度的准确性:

bash 复制代码
# 禁用 Swap
systemctl disable --now swap.target
systemctl mask swap.target

# 注释掉 /etc/fstab 中的 swap 挂载
sed '/swap/s/^/#/g' -i /etc/fstab

# 验证 Swap 已关闭(无输出表示成功)
swapon -s
2.2 安装Docker

在所有 K8s 节点(master、node1、node2)上安装 Docker:

bash 复制代码
# 从本地仓库安装 Docker
dnf install docker-ce -y
2.3 配置Docker使用Harbor仓库

配置 Docker 信任 Harbor 的自签名证书,并将证书分发到所有节点:

bash 复制代码
# 在 Harbor 节点上分发证书到所有 K8s 节点
for i in 100 10 20
do
  scp /data/certs/timinglee.org.crt root@172.25.250.$i:/etc/docker/certs.d/reg.timinglee.org/ca.crt
done

# 启用 Docker 服务
systemctl enable docker
systemctl restart docker
2.4 配置Docker加速器

提升公共镜像拉取速度:

bash 复制代码
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://reg.timinglee.org"]
}
EOF

# 重启 Docker 使配置生效
systemctl restart docker

# 验证加速器配置
docker info
# 应能看到:Registry Mirrors: https://reg.timinglee.org/
2.5 配置主机解析(/etc/hosts)

在所有节点配置主机名解析:

bash 复制代码
vim /etc/hosts
# 添加以下内容:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100     master
172.25.254.10      node1
172.25.254.20      node2
172.25.254.250     reg.timinglee.org
2.6 配置K8s安装源
bash 复制代码
vim /etc/yum.repos.d/kubernetes.repo
# 添加以下内容:
[kubernetes]
name = kubernetes
baseurl = https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/
gpgcheck = 0

# 验证 K8s 源配置
dnf list kubelet

第三步:安装cri-dockerd(所有节点)

做什么:在所有节点安装 cri-dockerd 桥接组件,使 K8s 能通过 CRI 接口使用 Docker 作为容器运行时。

为什么:自 K8s 1.24 版本起,官方移除了对Docker的直接支持(dockershim)。因此,如果继续使用Docker,需要通过cri-dockerd进行桥接;或者直接使用K8s默认推荐的containerd、CRI-O等符合CRI标准的运行时。

bash 复制代码
# 方式一:通过 RPM 包安装(版本较老)
rpm -ivh libcgroup-0.41-19.el8.x86_64.rpm cri-dockerd-0.3.14-3.el8.x86_64.rpm

# 修改 cri-dockerd 启动参数
vim /lib/systemd/system/cri-docker.service
# 修改 ExecStart 行:
# ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.10.1

# 方式二:通过二进制包安装(推荐,版本更新)
# 下载二进制包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.4/cri-dockerd-0.4.4.amd64.tgz

# 解压
tar zxf cri-dockerd-0.4.4.amd64.tgz
cd cri-dockerd/

# 安装到系统
install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd

# 复制 systemd 服务文件
cp cri-docker.s* /lib/systemd/system
chmod +x /lib/systemd/system/cri-docker.s*

# 修改启动文件
vim /lib/systemd/system/cri-docker.service
# 修改 ExecStart 行:
# ExecStart=/usr/local/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.10.1 --container-runtime-endpoint fd://

# 重载并启动
systemctl daemon-reload
systemctl enable --now cri-docker.service

# 验证服务状态
systemctl status cri-docker.service

# 检查 socket 文件
ll /var/run/cri-dockerd.sock

第四步:安装K8s软件

做什么:在所有节点安装 K8s 核心组件(kubelet、kubeadm、kubectl)。

为什么:kubelet 是每个节点上运行 Pod 的核心代理;kubeadm 是集群初始化和管理的命令行工具;kubectl 是与集群交互的命令行客户端。

bash 复制代码
# Master 节点:安装全套组件
dnf install kubelet kubeadm kubectl -y
systemctl enable --now kubelet.service

# Node 节点:只安装核心组件
dnf install kubelet kubeadm -y
systemctl enable --now kubelet.service

# Master 节点配置命令补齐
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "source <(kubeadm completion bash)" >> ~/.bashrc
source ~/.bashrc

第五步:下载K8s所需镜像

做什么:在 Master 节点拉取 K8s 所需的核心镜像(pause、coredns、etcd、kube-proxy、kube-scheduler、kube-controller-manager、kube-apiserver),并上传至私有仓库 Harbor。

为什么:生产环境通常无法直接访问外网。通过本地镜像仓库统一管理镜像,不仅能加速节点拉取镜像的速度,还能保障内网环境的安全与稳定。

bash 复制代码
# 查看所需镜像列表
kubeadm config images list
# 输出示例:
# registry.k8s.io/kube-apiserver:v1.35.7
# registry.k8s.io/kube-controller-manager:v1.35.7
# registry.k8s.io/kube-scheduler:v1.35.7
# registry.k8s.io/kube-proxy:v1.35.7
# registry.k8s.io/coredns/coredns:v1.13.1
# registry.k8s.io/pause:3.10.1
# registry.k8s.io/etcd:3.6.6-0

# 从阿里云镜像仓库拉取镜像
kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.35.7 \
--cri-socket=unix:///var/run/cri-dockerd.sock

# 登录 Harbor
docker login reg.timinglee.org -u admin

# 重新打标签推送到 Harbor
docker images --format "{{.Repository}}:{{.Tag}}" | awk -F "/" '/google/{system("docker tag "$0" reg.timinglee.org/k8s/"$3)}'

# 推送所有 Harbor 镜像
docker images --format "{{.Repository}}:{{.Tag}}" | awk -F "/" '/timinglee/{system("docker push "$0)}'

第六步:在Master节点初始化K8s集群

做什么:在 Master 节点执行 kubeadm init 命令,并配置好 Pod 网络 CIDR。

为什么:该命令会生成集群的根证书、创建 Etcd 集群、启动 Master 核心组件,并生成用于 Worker 节点加入集群的 Token 凭证。初始化后 Master 节点状态为 NotReady,因为还没有安装网络插件。

bash 复制代码
# 执行集群初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.timinglee.org/k8s \
--kubernetes-version v1.35.7 \
--cri-socket=unix:///var/run/cri-dockerd.sock

# 初始化成功后,会输出一行 kubeadm join 命令,务必保存!
# 如果忘记,可以重新生成:
kubeadm token create --print-join-command

# 配置 kubectl 环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" > ~/.bash_profile
source ~/.bash_profile

# 查看节点状态(此时为 NotReady,因为还没安装网络插件)
kubectl get nodes
# 预期输出:
# NAME     STATUS     ROLES           AGE    VERSION
# master   NotReady   control-plane   102s   v1.35.3

第七步:安装Flannel网络插件

做什么:应用 Flannel 等 CNI(容器网络接口)网络插件。

为什么:K8s 本身不提供默认的网络方案。必须安装网络插件来实现跨节点的 Pod 通信、Service 网络代理等底层网络功能。安装完成后,所有节点状态变为 Ready。

bash 复制代码
# 解压 Flannel 安装包
tar zxf kube-flannel-v0.28.9.tar.gz
cd flannel/

# 加载 Flannel 镜像到 Docker
docker load -i kube-flannel-v0.28.9.tar

# 重新打标签
docker tag ghcr.io/flannel-io/flannel-cni-plugin:v1.9.0-flannel3 reg.timinglee.org/k8s/flannel-cni-plugin:v1.9.0-flannel3
docker tag ghcr.io/flannel-io/flannel:v0.28.9 reg.timinglee.org/k8s/flannel:v0.28.9

# 应用 Flannel 网络插件
kubectl apply -f kube-flannel.yml

# 验证 Pod 状态
kubectl get pods -n kube-system

验证:

浏览器搜索172.25.254.250

第八步:添加Node节点到集群

做什么:在 Worker 节点执行 kubeadm join 命令,将 Worker 节点加入集群。

为什么:该命令利用初始化时生成的 Token,将当前节点安全地注册到 Master 的 API Server 中,使其正式成为集群的计算资源。

bash 复制代码
# 在 node1 和 node2 上执行(使用初始化时生成的 join 命令):
kubeadm join 172.25.254.100:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--cri-socket=unix:///var/run/cri-dockerd.sock

第九步:验证集群

在 Master 节点验证集群状态:

bash 复制代码
# 查看所有节点状态(应为 Ready)
kubectl get nodes
# 预期输出:
# NAME             STATUS   ROLES           AGE    VERSION
# master           Ready    control-plane   98m    v1.35.3
# node1            Ready    <none>          21m    v1.35.3
# node2            Ready    <none>          21m    v1.35.3

六、部署过程常见问题与排查

问题 排查方法
节点 NotReady 通常是网络插件(Flannel)未安装或镜像拉取失败。使用 kubectl describe node 查看具体事件
cri-dockerd 报错 检查 systemctl status cri-dockerd,确保 socket 路径与 kubeadm init/join 时指定的 --cri-socket 一致
镜像拉取失败 检查 /etc/docker/daemon.json 中的 insecure-registries 配置,以及 /etc/docker/certs.d/ 下的证书是否正确
Swap 未完全关闭 使用 free -m 确认 Swap 为 0,若不为 0,检查 /etc/fstab 中是否仍有 swap 挂载项
初始化失败 可以使用 kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock 重置集群后重新初始化
Join 命令失效 如果 join 命令的 token 过期,可以在 Master 节点执行 kubeadm token create --print-join-command 重新生成

附加:利用Ansible部署kubernetes运行环境

一.安装ansible

bash 复制代码
[root@harbor ~]# vim /etc/yum.repos.d/epel.repo
[epel]
name = epel
baseurl = https://mirrors.aliyun.com/epel/9/Everything/x86_64/
gpgcheck = 0

[root@harbor ~]# dnf install ansible-core.x86_64 ansible.noarch -y

二.配置所需用户

bash 复制代码
[root@harbor ~]# useradd  devops
[root@harbor ~]# echo lee | passwd --stdin devops
更改用户 devops 的密码 。
passwd:所有的身份验证令牌已经成功更新

[root@harbor ~]# su - devops
[devops@harbor ~]$ mkdir  ansible
[devops@harbor ~]$ cd ansible/
[devops@harbor ansible]$

三.生成ansible的临时配置文件并建立运行环境

bash 复制代码
[devops@harbor ansible]$ vim inventory
[servers]
172.25.254.100
172.25.254.20
172.25.254.10

[devops@harbor ansible]$ vim ansible.cfg
[defaults]
inventory = /home/devops/ansible/inventory
remote_user = root
ask_pass = false
host_key_checking = false
bash 复制代码
#建立用户
[devops@harbor ansible]$ ansible all -m user -a "name=devops state=present"
[devops@harbor ansible]$ ansible all -m shell -a 'echo "lee" | passwd --stdin devops'
[devops@harbor ansible]$ ansible all -m lineinfile -a 'path=/etc/sudoers line="devops    ALL=(ALL)    NOPASSWD: ALL" insertafter=EOF'

四.生成ansible的主配置文件并测试

bash 复制代码
[devops@harbor ansible]$ vim ansible.cfg
[defaults]
inventory = /home/devops/ansible/inventory
remote_user = devops
ask_pass = false
host_key_checking = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false

五.利用ansible剧本部署docker

bash 复制代码
[devops@harbor ansible]$ vim kubernetes-devops.yml
- name: devops k8s from ansible
  hosts: all
  tasks:
  - name: setup docker repo
    yum_repository:
      name: docker
      description: docker
      baseurl: http://172.25.254.254:4444/docker
      file: docker
      gpgcheck: no

  - name: install docker
    dnf:
      name: docker-ce
      state: present


  - name: setup docker.service
    replace:
      path: /lib/systemd/system/docker.service
      regexp: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock"
      replace: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock  --iptables=true"

- name: setup docker registry
    copy:
      content: |
        {
          "registry-mirrors":["https://reg.timinglee.org"]
        }
      dest: /etc/docker/daemon.json

  - name: setup docker certs
    file:
      path: /etc/docker/certs.d/reg.timinglee.org
      state: directory


  - name: cp certs file
    copy:
      src: "{{item.src}}"
      dest: "{{item.dest}}"
    loop:
      - src: /etc/docker/certs.d/reg.timinglee.org/ca.crt
        dest: /etc/docker/certs.d/reg.timinglee.org/ca.crt

      - src: /etc/docker/certs.d/reg.timinglee.org/ca.crt
        dest: /etc/pki/ca-trust/source/anchors/ca.crt
  
 - name: load module
    copy:
      dest: "{{item.dest}}"
      content: "{{item.value}}"
    loop:
      - dest: /etc/modules-load.d/docker_mod.conf
        value: br_netfilter
      - dest: /etc/sysctl.d/docker.conf
        value: |
          net.bridge.bridge-nf-call-iptables = 1
          net.bridge.bridge-nf-call-ip6tables = 1
          net.ipv4.ip_forward = 1

  - name: update ca cert
    shell: "update-ca-trust extract;sysctl --system"

  - name: start services
    service:
      name: "{{item}}"
      state: restarted
      enabled: yes
    loop:
      - docker
      - systemd-modules-load.service

[devops@harbor ansible]$ ansible-playbook kubernetes-devops.yml

六.利用ansible安装cri-dockerd

bash 复制代码
[devops@harbor ansible]$ tar zxf cri-dockerd-0.4.4.amd64.tgz
[devops@harbor ansible]$ ls
ansible.cfg  cri-dockerd  cri-dockerd-0.4.4.amd64.tgz  inventory  kubernetes-devops.yml
[devops@harbor ansible]$ cd cri-dockerd/
[devops@harbor cri-dockerd]$ ls
cri-dockerd  cri-docker.service  cri-docker.socket
[devops@harbor cri-dockerd]$ vim cri-docker.service
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.10.1 
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always


[devops@harbor ansible]$ vim kubernetes-devops.yml
- name: devops k8s from ansible
  hosts: all
  tasks:
  - name: setup docker repo
    yum_repository:
      name: docker
      description: docker
      baseurl: http://172.25.254.254:4444/docker
      file: docker
      gpgcheck: no

  - name: install docker
    dnf:
      name: docker-ce
      state: present


  - name: setup docker.service
    replace:
      path: /lib/systemd/system/docker.service
      regexp: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock"
      replace: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock  --iptables=true"

  - name: setup docker registry
    copy:
      content: |
        {
          "registry-mirrors":["https://reg.timinglee.org"]
        }
      dest: /etc/docker/daemon.json

  - name: setup docker certs
    file:
      path: /etc/docker/certs.d/reg.timinglee.org
      state: directory


  - name: cp certs file
    copy:
      src: "{{item.src}}"
      dest: "{{item.dest}}"
    loop:
      - src: /etc/docker/certs.d/reg.timinglee.org/ca.crt
        dest: /etc/docker/certs.d/reg.timinglee.org/ca.crt

      - src: /etc/docker/certs.d/reg.timinglee.org/ca.crt
        dest: /etc/pki/ca-trust/source/anchors/ca.crt


########################################################
  - name: stup cri-dockerd
    copy:
      src: "{{item.src}}"
      dest: "{{item.dest}}"
      mode: '0755'
    loop:
      - src: ./cri-dockerd/cri-dockerd
        dest: /usr/bin/cri-dockerd

      - src: "./cri-dockerd/cri-docker.service"
        dest: "/lib/systemd/system/cri-docker.service"

      - src: "./cri-dockerd/cri-docker.socket"
        dest: "/lib/systemd/system/cri-docker.socket"

  - name: update ca cert
    shell: "update-ca-trust extract;sysctl --system;systemctl daemon-reload"

  - name: start services
    service:
      name: "{{item}}"
      state: restarted
      enabled: yes
    loop:
      - docker
      - systemd-modules-load.service
      - cri-docker

[devops@harbor ansible]$ ansible-playbook kubernetes-devops.yml

七.利用ansible部署k8s软件

bash 复制代码
[devops@harbor ansible]$ vim kubernetes-devops.yml
- name: install kubernetes from ansible
  hosts: all
  tasks:
  - name: setup k8s repo
    yum_repository:
      name: kubernetes
      description: kubernetes
      baseurl: https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm
      file: kubernetes
      gpgcheck: no

  - name: install software in master
    dnf:
      name: "{{item}}"
      state: present
    loop:
      - kubeadm-1.35.7-150500.1.1
      - kubelet-1.35.7-150500.1.1
      - kubectl-1.35.7-150500.1.1
    when: inventory_hostname == "172.25.254.100"

  - name: install software in work node
    dnf:
      name: "{{item}}"
      state: present
    loop:
      - kubeadm-1.35.7-150500.1.1
      - kubelet-1.35.7-150500.1.1
    when: inventory_hostname == "172.25.254.10" or inventory_hostname == "172.25.254.20"
  
  - name: setup kubectl kubeadm complication
    lineinfile:
      path: /root/.bashrc
      line: |
        source <(kubectl completion bash)
        source <(kubeadm completion bash)
    when: inventory_hostname == "172.25.254.100"

  - name: start kubelet
    service:
      name: kubelet
      state: started
      enabled: yes
[devops@harbor ansible]$ ansible-playbook kubernetes-devops.yml


#让补齐功能生效
[root@k8s-master mnt]# source  ~/.bashrc
[root@k8s-master mnt]# kubectl 命令后按2此tab键
alpha          (Commands for features in alpha)
annotate       (更新一个资源的注解)
api-resources  (Print the supported API resources on the server)
api-versions   (Print the supported API versions on the server, in the form of "group/version")
apply          (Apply a configuration to a resource by file name or stdin)
attach         (挂接到一个运行中的容器)
auth           (Inspect authorization)
autoscale      (Auto-scale a deployment, replica set, stateful set, or replication controller)
certificate    (Modify certificate resources)

[root@k8s-master mnt]# kubeadm
certs       config      init        kubeconfig  token       version
completion  help        join        reset       upgrade
相关推荐
JavaPub-rodert2 小时前
使用 Docker 部署 Ollama:Docker Compose 一键运行 DeepSeek-R1 1.5B
运维·docker·容器
FoldWinCard3 小时前
K8s集群部署的方法原理
大数据·容器·kubernetes
二宝哥5 小时前
docker安装apisix
docker·容器·apisix
Kina_C6 小时前
从零搭建Kubernetes集群:Harbor私有仓库 + K8s v1.35 + Flannel网络插件完整部署指南
网络·容器·kubernetes
王da魔7 小时前
部署Kubernetes
云原生·容器·kubernetes
RobinDevNotes7 小时前
K8s+Megatron-LM+vLLM打通超大模型训练全链路
人工智能·kubernetes
池以遇8 小时前
云原生高级——kubernetes的部署
云原生·容器·kubernetes
UseLessQQ8 小时前
云计算k8s集群部署
java·kubernetes·云计算
智码看视界9 小时前
Day57-K8s核心概念速通:Pod、Deployment、Service与Ingress
云原生·容器·kubernetes·k8s·ingress·java后端·deployment