用anisble搭建k8s集群及原理

一.Kubernetes(K8s)概述

Kubernetes 是 Google 基于 Borg 技术开源的容器集群管理系统,它在 Docker 等容器技术的基础上,为容器化应用提供了部署运行、资源调度、服务发现、动态伸缩、故障自愈等全生命周期管理能力,大幅提升了大规模容器集群管理的便捷性。

Kubernetes 的核心设计思想,是从宏观视角以统一方式定义任务间的各种关系,并为未来扩展更多任务类型预留空间。它最核心的能力,就是按照用户意愿与集群规则,自动化处理容器之间的各种关系,这一能力就是我们常说的「容器编排」。可以说,Kubernetes 的本质,就是一个具有普遍适用性的容器编排工具。

二.k8s的设计架构

K8s 采用主从(Master‑Node)分布式架构,整体分为控制平面和工作节点两大层,基于声明式 API,所有数据存 etcd,组件之间通过 API 交互。

控制平面(Master,集群控制中枢,不跑业务 Pod)

  • etcd:分布式键值存储,集群唯一数据库,保存全部配置、状态数据。
  • kube‑apiserver:集群统一入口,提供 REST API,负责认证鉴权,所有组件都和它交互,读写 etcd。
  • kube‑controller‑manager:控制器集合,持续做调谐:对比期望状态与实际状态,出现偏差就执行修复。
  • kube‑scheduler:调度器,监听未绑定节点的 Pod,按规则选出最合适 Node,把 Pod 分配过去。
  • 生产环境控制平面做多实例实现高可用。

工作节点(Node,执行业务负载)

每个业务节点都运行下面组件:

  • kubelet:节点代理,和 apiserver 通信;管理本机 Pod 生命周期,创建、监控、重启 Pod,上报节点状态。
  • kube‑proxy:网络代理,维护转发规则,实现 Service 负载均衡,处理 Pod 流量。
  • 容器运行时(containerd/cri‑o):负责拉取镜像、启动停止容器。

配套插件层

  • CNI 网络插件(Calico/Flannel):实现 Pod 网络,完成 Pod 之间通信。
  • Ingress‑controller:实现七层域名访问能力。

三.K8s 应用部署方式

3.1 Deployment(无状态,最常用)

  • 适用:Web 后端、Nginx,无本地数据,Pod 随便销毁重建。
  • 特点:滚动更新、回滚、扩缩容。
  • 类比:盖浇饭,哪份坏了直接重做一份,新旧菜品逐步替换,不停止营业。
bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest

3.2 StatefulSet(有状态部署)

  • 适用:MySQL、Redis 集群、ZooKeeper,需要稳定网络标识、持久存储。
  • 特点:Pod 有序创建删除,稳定主机名,绑定持久存储。
  • 类比:包间,每个包间固定编号、固定储物柜子,不能随便打乱替换。

3.3. DaemonSet

  • 适用:日志采集、监控代理(filebeat、node‑exporter)。
  • 特点:每个节点跑一个 Pod,节点新增自动部署。
  • 类比:每个后厨工位必须配一名卫生保洁。

3.4 Job / CronJob 任务部署

  • Job:一次性任务,跑完就结束。类比:一次性批量预制 100 份半成品。
  • CronJob:定时任务,按时间周期执行,类似 crontab。
  • 类比:每天凌晨 3 点盘点库存。

3.5. Helm Chart 部署(包部署)

  • 不是控制器,是应用打包工具。把一整套 yaml(Deployment、Service、Ingress 等)打包成 Chart。
  • 类比:现成整套开店套餐,一键配齐后厨、前台、分拣全套配置,不用手写一堆 yaml。

3.6 直接裸 Pod(不推荐)

  • 直接写 kind:Pod 创建。
  • 问题:Pod 挂掉不会自动重建,没有扩缩容能力。
  • 类比:临时做一份菜,打翻了没人重做。仅测试使用。

四. k8s的集群原理

把整个集群想象成一家外卖餐饮公司

控制平面(老板 + 管理办公室):不直接做菜,只管决策

  • etcd:公司全部台账、订单、人员信息数据库
  • apiserver:前台接待,所有需求都从这里进,所有信息从这里查
  • controller‑manager:运营主管,不停对照「计划订单」和「实际出餐」,不一样就纠正
  • scheduler:派单员,看哪个后厨工位有空,把订单派过去
  • Node 工作节点 = 各个后厨工位
  • kubelet = 后厨组长,接到派单,安排干活,盯着菜品(Pod),坏了就重做,上报状态
  • Pod = 一份份做好的餐品(业务容器)
  • kube‑proxy = 外卖分拣员,把顾客订单分发到对应餐品,做转发负载均衡

完整工作流程:

你(用户)提交需求 (YAML):要同时出 3 份盖浇饭(3 个 Pod 副本)。

  • 需求给到前台 apiserver,记录进台账 etcd。
  • 运营主管 controller‑manager 一看:现在只有 1 份饭,还差 2 份。
  • 派单员 scheduler 看哪个后厨闲,把任务派过去。
  • 后厨组长 kubelet 收到任务,做出另外 2 份饭 Pod。
  • 如果一份饭打翻了(Pod 崩溃),主管发现数量不对,立刻再派单重做一份,保证始终 3 份,这就是自愈。
  • 顾客点餐访问(外部请求),分拣员 kube‑proxy 把请求分发到任意一份盖浇饭上,就是Service 负载均衡。
  • 滚动升级:把旧菜品一份份撤下,上新版本菜品,全程店里不断出餐,不影响顾客。
  • HPA 自动扩缩容:饭点人多,自动多开后厨做更多份;深夜人少,减少份数节省人力。

滚动升级:把旧菜品一份份撤下,上新版本菜品,全程店里不断出餐,不影响顾客。
HPA 自动扩缩容:饭点人多,自动多开后厨做更多份;深夜人少,减少份数节省人力。

五.构建harbor镜像仓库

K8S中文官网:https://kubernetes.io/zh-cn/

#尽量不要把用172.25.254.254IP会报错

主机名 IP 角色
harbor.timinglee.org 172.25.254.250 harbor 仓库
k8s-master.timinglee.org 172.25.254.100 master,k8s 集群控制节点
k8s-node1.timinglee.org 172.25.254.10 worker,k8s 集群工作节点
k8s-node2.timinglee.org 172.25.254.20 worker,k8s 集群工作节点

部署docker本地仓库

bash 复制代码
[root@harbor ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0



[root@harbor ~]# dnf install httpd createrepo-y
[root@harbor ~]# mkdir  /var/www/html/docker/ -p
[root@harbor ~]# vim /etc/httpd/conf/httpd.conf
Listen 4444
[root@harbor ~]# systemctl enable --now httpd

[root@harbor ~]# dnf  install docker-ce -downloadonly  --destdir /mnt/ -y
[root@harbor ~]# mv /mnt/*.rpm /var/www/html/docker/
[root@harbor ~]# createrepo -v /var/www/html/docker/

[root@harbor ~]# cat /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = http://172.25.254.250:4444/docker
gpgcheck = 0
EOF

[root@harbor ~]# dnf install docker-ce -y

安装docker在harbor仓库节点

bash 复制代码
[root@harbor ~]# dnf install docker-ce -y

[root@harbor ~]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
[root@harbor ~]# modprobe -a br_netfilter
[root@harbor ~]# 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

[root@harbor ~]# systemctl restart  systemd-modules-load.service
[root@harbor ~]# sysctl  --system

[root@harbor ~]# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
[root@harbor ~]# systemctl daemon-reload
[root@harbor ~]# systemctl enable --now docker

生成key

bash 复制代码
[root@harbor ~]# mkdir /data/certs -p
[root@harbor ~]# mkdir /data/certs -p
[root@harbor ~]# 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

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CQ
Locality Name (eg, city) [Default City]:SHANPING
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 []:2753086580@qq.com

编辑harbor配置文件

bash 复制代码
[root@harbor ~]# tar zxf  harbor-offline-installer-v2.5.4.tgz -C /opt/
[root@harbor ~]# cd /opt/harbor/
[root@harbor harbor]# ls
common.sh  harbor.v2.5.4.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor 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   #登录密码

[root@harbor harbor]# ./install.sh --with-chartmuseum


#编写启动脚本
[root@harbor ~]# 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
#关闭容器
[root@harbor harbor]# docker compose  down

[root@harbor ~]# systemctl enable --now harbor
[root@harbor harbor]# docker compose  ps

启动并验证

bash 复制代码
[root@harbor harbor]# mkdir  /etc/docker/certs.d/reg.timinglee.org/ -p
[root@harbor harbor]# cp /data/certs/timinglee.org.crt  /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@harbor harbor]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.250     harbor reg.timinglee.org


[root@harbor harbor]# systemctl restart docker
[root@harbor harbor]# docker compose up -d

[root@harbor harbor]# docker login  reg.timinglee.org -u admin
Password:

WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/

Login Succeeded

六.构建部署kubernetes所需主机(用ansible搭建)

关闭swap(所有主机操作)

bash 复制代码
#需要把以下注释掉
[root@node1/2|harbor|master ~]# vim /etc/fstab
bash 复制代码
[root@node1/2|harbor|master ~]# systemctl mask swap.target
[root@node1/2|harbor|master ~]# sed '/swap/s/^/#/g' -i /etc/fstab

#记得重启
[root@node1/2|harbor|master ~]# reboot



#无数输出,才是ok
[root@node1/2|harbor|master ~]# swapon  -s
[root@node1/2|harbor|master ~]#

ansible介绍

Ansible 是开源自动化运维工具,用 Python 开发,实现批量对多台服务器执行配置、部署、命令、软件安装。

  • 特点:无 Agent(不需要在被管机器装客户端),基于 SSH 协议通信。

核心组件

  • 控制节点:装 Ansible 的机器,执行运维操作(你的 k8s‑master 可以做控制机)
  • 被管主机:被批量操作的服务器(master、node1、node2、harbor)
  • Inventory(主机清单):记录所有被管服务器 IP、主机名、分组,/etc/ansible/hosts
  • Module(模块):Ansible 内置功能单元,执行实际动作:yum安装、copy传文件、service管理服务、shell执行命令
  • Playbook:YAML 编写的自动化剧本,把一堆任务编排,实现复杂自动化,可重复执行。
  • Ad‑hoc:单条临时命令,一次性批量执行,不写剧本。

两种使用方式

  • Ad‑hoc 临时命令(快速)
bash 复制代码
# 给所有机器执行hostname命令
ansible all -m shell -a "hostname"
  • Playbook 剧本(复杂自动化,生产用)
bash 复制代码
#yaml 写任务,一键批量部署,例如批量初始化 k8s 节点、安装 docker、配置 hosts、部署 harbor。
- hosts: k8s_nodes
  tasks:
    - name: 设置主机名
      hostname:
        name: "{{ inventory_hostname }}"

你的 4 台机器,可以写 inventory 清单,ansible 批量完成:

  • 统一修改 hosts 域名解析(harbor.timinglee.org、k8s‑master...)
  • 批量关闭防火墙、selinux
  • 批量安装 containerd、kubeadm、kubelet,搭建 k8s 集群
  • 一键部署 harbor 私有镜像仓库

对比理解(生活例子)

  • 手动运维:一台台 ssh 登录敲命令,重复劳动。
  • Ansible:一个领班,通过 ssh 远程,同时指挥一批机器干活,写好剧本,反复执行。

优点

  • 无 agent,只需要 ssh,被管理机器不用装软件
  • Playbook 使用 YAML,可读性好
  • 幂等性:重复执行不会搞坏系统,达到期望状态就不再操作
  • 可以做配置管理、应用部署、批量命令

缺点

  • 依赖 SSH,大批量机器并发性能不如有 agent 工具;
  • 复杂大规模集群,执行速度会变慢。

记得在harbor仓库创建公开的k8s文件

安装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 xia | 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


[devops@harbor ansible]$ ansible all -m ping
172.25.254.20 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
172.25.254.100 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
172.25.254.10 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}


#建立用户
[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


[devops@harbor ansible]$ ansible all -m shell -a 'whoami '
172.25.254.10 | CHANGED | rc=0 >>
root
172.25.254.100 | CHANGED | rc=0 >>
root
172.25.254.20 | CHANGED | rc=0 >>
root

利用ansible剧本部署docker

bash 复制代码
[devops@harbor ansible]$ vim k8s.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 k8s.yml

#如果不知道怎么写脚本的话,可以通过以下命令帮助

bash 复制代码
[devops@harbor ansible]$ ansible-doc +模块名(比如 user,template,yum,dnf)

利用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 k8s.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 k8s.yml

利用ansible部署k8s软件

bash 复制代码
[devops@harbor ansible]$ vim k8s.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

#没变绿是正常的,后面初始化可以变绿
[root@k8s-master mnt]# systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
     Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/kubelet.service.d
             └─10-kubeadm.conf
     Active: activating (auto-restart) (Result: exit-code) since Tue 2026-08-18 17:09:25 CST; 1s ago
       Docs: https://kubernetes.io/docs/
    Process: 79433 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_>
   Main PID: 79433 (code=exited, status=1/FAILURE)

打开harbor仓库看是否成功

七.在master中初始化kubernetes集群

添加kubernets环境变量到本机

bash 复制代码
[root@master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" > ~/.bash_profile
[root@master ~]# source  ~/.bash_profile

在master中完成集群初始化

bash 复制代码
[root@master ~]# 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

#master本集群的凭证,如果忘记,可以通过以下查询
[root@master ~]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token m5ay2n.lw75n4kqe9j6ild3 --discovery-token-ca-cert-hash sha256:4933cf96a92b2d06102614ffa2421b2ec4ab4071bc1bfd68cfdaf99a8754f84d


#如果初始化出问题
[root@master ~]# kubeadm reset  --cri-socket=unix:///var/run/cri-dockerd.sock #可以重置集群设定


[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE    VERSION
master   NotReady   control-plane   102s   v1.35.3

添加node节点到本集群

bash 复制代码
[root@node1/2 ~]#  kubeadm join 172.25.254.100:6443 --token kubeadm join 172.25.254.100:6443 kubeadm join 172.25.254.100:6443 --token m5ay2n.lw75n4kqe9j6ild3 --discovery-token-ca-cert-hash sha256:4933cf96a92b2d06102614ffa2421b2ec4ab4071bc1bfd68cfdaf99a8754f84d--cri-socket=unix:///var/run/cri-dockerd.sock



#测试
[root@master ~]# kubectl get nodes		#可以看到集群中主机但是因为网络插件问题状态是NotReady
[root@master ~]# kubectl  get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   6m12s   v1.35.7
node1    NotReady    <none>          45s   v1.35.7
node2    NotReady    <none>          56s   v1.35.7

安装网络插件

#记得在harbor仓库创建"flannel"目录

bash 复制代码
[root@k8s-master ~]# tar zxf kube-flannel-v0.28.9.tar.gz
[root@k8s-master ~]# ls
flannel  kube-flannel-v0.28.9.tar.gz
[root@k8s-master ~]# cd flannel/

[root@k8s-master flannel]# docker load  -i kube-flannel-v0.28.9.tar
Loaded image: ghcr.io/flannel-io/flannel-cni-plugin:v1.9.1-flannel3
Loaded image: ghcr.io/flannel-io/flannel:v0.28.9


[root@master ~]# docker tag ghcr.io/flannel-io/flannel-cni-plugin:v1.9.0-flannel1 reg.timinglee.org/flannel/flannel-cni-plugin
[root@master ~]# docker push  reg.timinglee.org/flannel/flannel-cni-plugin

[root@master ~]# docker tag ghcr.io/flannel-io/flannel:v0.28.1 reg.timinglee.org/flannel-io/flannel
[root@master ~]# docker push reg.timinglee.org/flannel-io/flannel

[root@master ~]# vim kube-flannel.yml
        image: flannel-io/flannel:v0.28.1
        image: flannel-io/flannel-cni-plugin:v1.9.0-flannel1
        image: flannel-io/flannel:v0.28.1
        
[root@k8s-master flannel]# grep -n  image: kube-flannel.yml  #要改内容所在行的位置
148:        image: flannel-io/flannel:v0.28.9
175:        image: flannel-io/flannel-cni-plugin:v1.9.1-flannel3
186:        image: flannel-io/flannel:v0.28.9


[root@master ~]# kubectl apply -f kube-flannel.yml
bash 复制代码
#测试
[root@master ~]# kubectl  get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   14m   v1.35.7
node1    Ready    <none>          8m15s   v1.35.7
node2    Ready    <none>          7m56s   v1.35.7

感谢各位耐心看完这篇博客。写作过程也是自我梳理复盘的过程,难免会有考虑不周的地方,欢迎大家批评指正。希望这篇内容能够对你有所帮助,我们下篇博文再会。

相关推荐
Thneonl5 小时前
让恢复动作敢按下去:dry-run、审批门、自动回滚与 mutable twin
rust·kubernetes
艾伦_耶格宇5 小时前
【DOCKER容器实战】-2MySQL
运维·docker·容器
分布式存储与RustFS5 小时前
从 MinIO 到 RustFS:不只是换语言,更是换一份协议自由
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
To_OC15 小时前
跑了3个Docker容器后,我终于搞懂镜像和容器到底啥关系
后端·docker·容器
ltl18 小时前
mTLS 工程实践:服务间双向认证怎么落地
kubernetes
tryCbest19 小时前
Docker 从零到精通:知识与跨平台使用指南
docker·容器
开始学AI21 小时前
Codex2API Docker 使用宿主机代理:OAuth Token 兑换 403 问题排查与解决方案
运维·docker·容器
做前端的娜娜子1 天前
Docker 常用命令全梳理:从镜像拉取到容器编排
docker·容器·掘金·金石计划
m0_579146651 天前
关于Docker Desktop导致C盘空间异常占用的排查与根治方案
运维·docker·容器