惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
Spread Privacy
Spread Privacy
P
Proofpoint News Feed
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MyScale Blog
MyScale Blog
T
Tor Project blog
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
MongoDB | Blog
MongoDB | Blog
Simon Willison's Weblog
Simon Willison's Weblog
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
小众软件
小众软件
G
GRAHAM CLULEY
P
Privacy International News Feed
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
人人都是产品经理
人人都是产品经理
S
Schneier on Security
Scott Helme
Scott Helme
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
E
Exploit-DB.com RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
The Register - Security
The Register - Security
S
Securelist
Martin Fowler
Martin Fowler
Project Zero
Project Zero
大猫的无限游戏
大猫的无限游戏
Cisco Talos Blog
Cisco Talos Blog

博客园 - 尹正杰

kubespray实战案例 kubespray管理k8s的worker集群扩缩容 Kubeasz使用吐槽博客专题 Kubeasz基于ezctl实现etcd集群的管理实战 Kubeasz基于ezctl实现k8s集群一键升级 Calico启用纯BGP模式+RR实战案例 Calico 底层原理及IPIP(依赖BGP协议))和vxlan(不依赖BGP)工作模式切换 kubeasz基于ezctl实现k8s集群的扩容和缩容 kubeasz快速部署K8S集群实战 Ubuntu 24.04.04 LTS版本系统优化 Ubuntu Server 24.04.04 LTS部署指南 windows极速部署Openclaw实战篇 K8S的StatefulSet控制器应用案例之MySQL主从同步实战 k8s底层基于不同运行时集成harbor企业级私有仓库实战 二进制K8S集群附加组件部署及CNI网络插件切换实战 二进制部署K8S 1.35.0+最新版实战案例 etcd高可用集群部署及K8S周期性备份数据实战 基于Docker实现《若依》服务业务容器化实战篇 k8s集群基于Flannel网络插件部署凡人修仙传 k8s集群基于Calico网络插件部署凡人修仙传 ElasticSEearch 9.X环境部署 K8S Vertical Pod Autoscaler(VPA)实战案例 Prometheus监控自定义程序指标
kubespray快速部署k8s集群实战
尹正杰 · 2026-06-06 · via 博客园 - 尹正杰

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.kubespray概述

1.Kubespray概述

Kubespray(原 Kargo):基于 Ansible、CNCF 维护的 K8s 一键部署工具,原生生产级 HA 集群,裸机 / 虚拟化 / 公有云全适配,主流企业自建集群首选方案。


官方文档:
	https://kubespray.io/

Github地址:
	https://github.com/kubernetes-sigs/kubespray

2.使用kubespray的前提

- 1.Kubernetes 的最低要求版本为 v1.30

- 2.在将运行Ansible命令的机器上,已安装了Ansible v2.14+、Jinja 2.11+和python-netaddr;

- 3.目标服务器必须能够访问互联网,以便拉取Docker镜像。否则,需要进行额外的配置(请参阅离线环境)

- 4.目标服务器已配置为允许IPv4转发。

- 5.如果为Pod和服务使用IPv6,则目标服务器配置为允许IPv6转发。

- 6.防火墙未被管理,您需要像以前一样自行制定规则。为避免部署过程中出现任何问题,您应禁用防火墙。

- 7.如果kubespray是以非root用户账户运行的,则应在目标服务器中配置正确的权限提升方法。然后,应指定ansible_become标志或命令参数--become或-b。


参考链接:
	https://github.com/kubernetes-sigs/kubespray#requirements

3.kubespray和k8s版本对应关系

image

image

image

如上图1所示,关于kubespray和k8s版本对应关系,Github上已经写的很明确了。比如我想要部署k8s 1.33.7,此处就可以优先选择kubespray v2.29.1版本。

如上图2所示,如果你想要部署k8s 1.33.12的话,就不太适合用v2.29.1,因为该版本官方默认最高支持的版本为: "1.33.10"

如上图3所示,目前kubespray官方发布的最新v2.31版本,也仅支持到v1.33.11版本哟~

当然,如果你真的有类似的需求,非要使用1.33.12版本的话,建议直接使用官方推荐部署方式,即kubeadm或者二进制的方式即可。

参考链接:
	https://github.com/kubernetes-sigs/kubespray/releases
    https://github.com/kubernetes-sigs/kubespray/blob/release-2.29/roles/kubespray_defaults/vars/main/checksums.yml
    https://github.com/kubernetes-sigs/kubespray/blob/release-2.31/roles/kubespray_defaults/vars/main/checksums.yml

二.kubespray离线环境部署准备

1.部署harbor仓库

参考链接:
	https://www.cnblogs.com/yinzhengjie/p/17153673.html

2.下载kubespray项目

	1.下载项目
[root@ansible99 ~]# git clone https://github.com/kubernetes-sigs/kubespray.git
Cloning into 'kubespray'...
remote: Enumerating objects: 87493, done.
remote: Counting objects: 100% (65/65), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 87493 (delta 41), reused 19 (delta 19), pack-reused 87428 (from 2)
Receiving objects: 100% (87493/87493), 28.54 MiB | 4.66 MiB/s, done.
Resolving deltas: 100% (49196/49196), done.
[root@ansible99 ~]# 



	2.切换分支
[root@ansible99 ~]# cd kubespray/
[root@ansible99 kubespray]# 
[root@ansible99 kubespray]# git checkout release-2.29
branch 'release-2.29' set up to track 'origin/release-2.29'.
Switched to a new branch 'release-2.29'
[root@ansible99 kubespray]# 
[root@ansible99 kubespray]# git branch 
  master
* release-2.29
[root@ansible99 kubespray]# 


温馨提示:
  上述2条命令我们也可以用一行命令来实现。
[root@ansible99 ~]# git clone -b release-2.29 https://github.com/kubernetes-sigs/kubespray.git
Cloning into 'kubespray'...
remote: Enumerating objects: 87493, done.
remote: Counting objects: 100% (84/84), done.
remote: Compressing objects: 100% (64/64), done.
remote: Total 87493 (delta 45), reused 16 (delta 16), pack-reused 87409 (from 2)
Receiving objects: 100% (87493/87493), 28.48 MiB | 12.14 MiB/s, done.
Resolving deltas: 100% (49197/49197), done.
[root@ansible99 ~]# 
[root@ansible99 ~]# 
[root@ansible99 ~]# cd kubespray/
[root@ansible99 kubespray]# 
[root@ansible99 kubespray]# git branch 
* release-2.29
[root@ansible99 kubespray]# 

3 配置集群部署文件及python环境准备

  1.准备集群文件
[root@ansible99 kubespray]# cp -a inventory/{sample,yinzhengjie-k8s}
[root@ansible99 kubespray]# 
[root@ansible99 kubespray]# vim inventory/yinzhengjie-k8s/inventory.ini
[all]
master231 ansible_host=10.0.0.231  ip=10.0.0.231
master232 ansible_host=10.0.0.232  ip=10.0.0.232
master233 ansible_host=10.0.0.233  ip=10.0.0.233
worker66 ansible_host=10.0.0.66  ip=10.0.0.66
worker77 ansible_host=10.0.0.77  ip=10.0.0.77

# 控制面 Master 节点(HA 写多个)
[kube_control_plane]
master231
master232
master233

# etcd 集群(推荐与 control plane 一致,也可独立节点)
[etcd]
master231
master232
master233

# 工作节点
[kube_node]
worker66
worker77

# 负载均衡(HA 集群必选,默认使用内置 haproxy)
[kube_lb]


# 可选:Calico BGP 路由反射器
[calico_rr]

  2.自定义集群配置
[root@ansible99 kubespray]# vim inventory/yinzhengjie-k8s/group_vars/k8s_cluster/k8s-cluster.yml 
...
# 需要关注的配置
kube_network_plugin: calico 
kube_service_addresses: 10.200.0.0/16  
kube_pods_subnet: 10.100.0.0/16 
cluster_name: yinzhengjie.com   
container_manager: containerd 

# 需要新增的配置
kubelet_cgroup_driver: cgroupfs
kube_cert_validity_period: 438000h
kube_ca_cert_validity_period: 876000h

kube_kubeadm_controller_extra_args:
  cluster-signing-duration: 175200h

# 建议写死版本,不然这个软件有点抽风,一会部署k8s 1.33.7,一会有部署k8s 1.33.10让人摸不着头脑!
kube_version: 1.33.10
[root@ansible99 kubespray]#


温馨提示:
  更多关于变量的信息,可直接参考官方文档: https://kubespray.io/#/docs/ansible/vars


	3.构建python虚拟环境
[root@ansible99 kubespray]# apt update && apt -y install python3-pip python3-venv 

[root@ansible99 kubespray]# python3 -m venv venv

[root@ansible99 kubespray]# source venv/bin/activate
(venv) [root@ansible99 kubespray]# 

 
	4.安装依赖(锁定ansible版本适配v2.29)
(venv) [root@ansible99 kubespray]# pip3 list
Package Version
------- -------
pip     24.0
(venv) [root@ansible99 kubespray]# 
(venv) [root@ansible99 kubespray]# pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
(venv) [root@ansible99 kubespray]# 
(venv) [root@ansible99 kubespray]# 
(venv) [root@ansible99 kubespray]# pip3 list
Package      Version
------------ -------
ansible      10.7.0
ansible-core 2.17.14
cffi         2.0.0
cryptography 46.0.2
Jinja2       3.1.6
jmespath     1.0.1
MarkupSafe   3.0.3
netaddr      1.3.0
packaging    26.2
pip          24.0
pycparser    3.0
PyYAML       6.0.3
resolvelib   1.0.1
(venv) [root@ansible99 kubespray]# 



	5.免密ssh分发密钥至所有节点
(venv) [root@ansible99 kubespray]# ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519

(venv) [root@ansible99 kubespray]# ssh-copy-id root@10.0.0.231
(venv) [root@ansible99 kubespray]# ssh-copy-id root@10.0.0.232
(venv) [root@ansible99 kubespray]# ssh-copy-id root@10.0.0.233
(venv) [root@ansible99 kubespray]# ssh-copy-id root@10.0.0.66
(venv) [root@ansible99 kubespray]# ssh-copy-id root@10.0.0.77

4.自定义containerd配置

(venv) [root@ansible99 kubespray]#  vim inventory/yinzhengjie-k8s/group_vars/all/containerd.yml 
...
containerd_use_systemd_cgroup: false

containerd_registries_mirrors:
 - prefix: harbor250.yinzhengjie.com
   mirrors:
    - host: http://harbor250.yinzhengjie.com
      capabilities: ["pull", "resolve"]
      skip_verify: true
      #header:
      #  Authorization: "Basic YWRtaW46MQ=="

containerd_registry_auth:
  - registry: harbor250.yinzhengjie.com
    username: admin
    password: 1



5.自定义其他配置

(venv) [root@ansible99 kubespray]# vim inventory/yinzhengjie-k8s/group_vars/all/all.yml 
...

additional_sysctl:
  - { name: fs.inotify.max_user_instances, value: 8192 }

unsafe_show_logs: true

# 固定 Python 解释器,关闭自动探测警告
ansible_python_interpreter: /usr/bin/python3.12

# 允许用户/组已存在,避免重复创建报错
adduser_ignore_existing: true

6.同步镜像到harbor仓库

image
image

  1.进入offline目录,执行脚本生成离线资源清单files.list和images.list【此步骤会生成一个temp/目录】
(venv) [root@ansible99 kubespray]# cd contrib/offline && bash generate_list.sh


  2.修改temp/files.list文件,加上files.m.daocloud.io前缀
(venv) [root@ansible99 offline]# sed -i "s#https://#https://files.m.daocloud.io/#g" temp/files.list

  3.修改images.list文件,修改成daocloud的镜像加速配置
(venv) [root@ansible99 offline]# sed -i "s@quay.io@quay.m.daocloud.io@g" temp/images.list
(venv) [root@ansible99 offline]# sed -i "s@docker.io@docker.m.daocloud.io@g" temp/images.list
(venv) [root@ansible99 offline]# sed -i "s@registry.k8s.io@k8s.m.daocloud.io@g" temp/images.list
(venv) [root@ansible99 offline]# sed -i "s@ghcr.io@ghcr.m.daocloud.io@g" temp/images.list

  4.执行以下命令将依赖的静态文件全部下载到 temp/files 目录下
(venv) [root@ansible99 offline]# wget -x -P temp/files -i temp/files.list


  5.执行skopeo命令迁移镜像到镜像仓库
(venv) [root@ansible99 offline]# apt -y install skopeo
(venv) [root@ansible99 offline]# 
(venv) [root@ansible99 offline]# cd temp/
(venv) [root@ansible99 temp]# 
(venv) [root@ansible99 temp]# echo 10.0.0.250 harbor250.yinzhengjie.com >> /etc/hosts
(venv) [root@ansible99 temp]# 
(venv) [root@ansible99 temp]# skopeo login --tls-verify=false -u admin -p 1 harbor250.yinzhengjie.com
Login Succeeded!
(venv) [root@ansible99 temp]# 
(venv) [root@ansible99 temp]# for image in $(cat images.list); do skopeo copy --dest-tls-verify=false docker://${image} docker://harbor250.yinzhengjie.com/k8s/${image#*/}; done


  6.查看harbor的WebUI
如上图所示。

7.部署二进制软件包离线下载站点

image

	1.准备站点目录
[root@harbor250 ~]# mkdir -pv /yinzhengjie/data/kubespray


	2.拷贝k8s相关的二进制文件到站点目录
(venv) [root@ansible99 kubespray]# scp -r contrib/offline/temp/files/files.m.daocloud.io/ 10.0.0.250:/yinzhengjie/data/kubespray


	3.准备nginx的站点配置文件
[root@harbor250 ~]# cat default.conf 
server {
    listen       80;
    server_name  harbor250.yinzhengjie.com;

    root   /usr/share/nginx/html;
    index  index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
        autoindex on;
        autoindex_exact_size on;
        autoindex_localtime on;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
[root@harbor250 ~]# 

  4.启动容器
[root@harbor250 ~]# docker run -it -d -p 8080:80 -v /root/default.conf:/etc/nginx/conf.d/default.conf --name kubespray-server  -v /yinzhengjie/data/kubespray/:/usr/share/nginx/html/ docker.m.daocloud.io/library/nginx:1.25.1-alpine


  5.访问测试
访问效果如上图所示。

三.基于kubespray离线部署K8S实战

1.配置离线安装

(venv) [root@ansible99 kubespray]# vim inventory/yinzhengjie-k8s/group_vars/all/offline.yml  
---
## Global Offline settings
### Private Container Image Registry
# registry_host: "myprivateregisry.com"
registry_host: "harbor250.yinzhengjie.com/k8s"
files_repo: "http://harbor250.yinzhengjie.com:8080/files.m.daocloud.io"
### If using CentOS, RedHat, AlmaLinux or Fedora
# yum_repo: "http://myinternalyumrepo"
### If using Debian
# debian_repo: "http://myinternaldebianrepo"
### If using Ubuntu
# ubuntu_repo: "http://myinternalubunturepo"

## Container Registry overrides
kube_image_repo: "{{ registry_host }}"
gcr_image_repo: "{{ registry_host }}"
github_image_repo: "{{ registry_host }}"
docker_image_repo: "{{ registry_host }}"
quay_image_repo: "{{ registry_host }}"

## Kubernetes components
kubeadm_download_url: "{{ files_repo }}/dl.k8s.io/release/v{{ kube_version }}/bin/linux/{{ image_arch }}/kubeadm"
kubectl_download_url: "{{ files_repo }}/dl.k8s.io/release/v{{ kube_version }}/bin/linux/{{ image_arch }}/kubectl"
kubelet_download_url: "{{ files_repo }}/dl.k8s.io/release/v{{ kube_version }}/bin/linux/{{ image_arch }}/kubelet"


## Two options - Override entire repository or override only a single binary.

## [Optional] 1 - Override entire binary repository
# github_url: "https://my_github_proxy"
# dl_k8s_io_url: "https://my_dl_k8s_io_proxy"
# storage_googleapis_url: "https://my_storage_googleapi_proxy"
# get_helm_url: "https://my_helm_sh_proxy"

## [Optional] 2 - Override a specific binary
## CNI Plugins
cni_download_url: "{{ files_repo }}/github.com/containernetworking/plugins/releases/download/v{{ cni_version }}/cni-plugins-linux-{{ image_arch }}-v{{ cni_version }}.tgz"

## cri-tools
crictl_download_url: "{{ files_repo }}/github.com/kubernetes-sigs/cri-tools/releases/download/v{{ crictl_version }}/crictl-v{{ crictl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"

## [Optional] etcd: only if you use etcd_deployment=host
etcd_download_url: "{{ files_repo }}/github.com/etcd-io/etcd/releases/download/v{{ etcd_version }}/etcd-v{{ etcd_version }}-linux-{{ image_arch }}.tar.gz"

# [Optional] Calico: If using Calico network plugin
calicoctl_download_url: "{{ files_repo }}/github.com/projectcalico/calico/releases/download/v{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}"
# [Optional] Calico with kdd: If using Calico network plugin with kdd datastore
calico_crds_download_url: "{{ files_repo }}/github.com/projectcalico/calico/archive/v{{ calico_version }}.tar.gz"

# [Optional] Cilium: If using Cilium network plugin
ciliumcli_download_url: "{{ files_repo }}/github.com/cilium/cilium-cli/releases/download/v{{ cilium_cli_version }}/cilium-linux-{{ image_arch }}.tar.gz"

# [Optional] helm: only if you set helm_enabled: true
helm_download_url: "{{ files_repo }}/get.helm.sh/helm-v{{ helm_version }}-linux-{{ image_arch }}.tar.gz"

# [Optional] crun: only if you set crun_enabled: true
crun_download_url: "{{ files_repo }}/github.com/containers/crun/releases/download/{{ crun_version }}/crun-{{ crun_version }}-linux-{{ image_arch }}"

# [Optional] kata: only if you set kata_containers_enabled: true
kata_containers_download_url: "{{ files_repo }}/github.com/kata-containers/kata-containers/releases/download/{{ kata_containers_version }}/kata-static-{{ kata_containers_version }}-{{ image_arch }}.tar.xz"

# [Optional] cri-dockerd: only if you set container_manager: docker
cri_dockerd_download_url: "{{ files_repo }}/github.com/Mirantis/cri-dockerd/releases/download/v{{ cri_dockerd_version }}/cri-dockerd-{{ cri_dockerd_version }}.{{ image_arch }}.tgz"

# [Optional] runc: if you set container_manager to containerd or crio
runc_download_url: "{{ files_repo }}/github.com/opencontainers/runc/releases/download/v{{ runc_version }}/runc.{{ image_arch }}"

# [Optional] cri-o: only if you set container_manager: crio
# crio_download_base: "download.opensuse.org/repositories/devel:kubic:libcontainers:stable"
# crio_download_crio: "http://{{ crio_download_base }}:/cri-o:/"
crio_download_url: "{{ files_repo }}/storage.googleapis.com/cri-o/artifacts/cri-o.{{ image_arch }}.v{{ crio_version }}.tar.gz"
skopeo_download_url: "{{ files_repo }}/github.com/lework/skopeo-binary/releases/download/v{{ skopeo_version }}/skopeo-linux-{{ image_arch }}"

# [Optional] containerd: only if you set container_runtime: containerd
containerd_download_url: "{{ files_repo }}/github.com/containerd/containerd/releases/download/v{{ containerd_version }}/containerd-{{ containerd_version }}-linux-{{ image_arch }}.tar.gz"
nerdctl_download_url: "{{ files_repo }}/github.com/containerd/nerdctl/releases/download/v{{ nerdctl_version }}/nerdctl-{{ nerdctl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"

# [Optional] runsc,containerd-shim-runsc: only if you set gvisor_enabled: true
gvisor_runsc_download_url: "{{ files_repo }}/storage.googleapis.com/gvisor/releases/release/{{ gvisor_version }}/{{ ansible_architecture }}/runsc"
gvisor_containerd_shim_runsc_download_url: "{{ files_repo }}/storage.googleapis.com/gvisor/releases/release/{{ gvisor_version }}/{{ ansible_architecture }}/containerd-shim-runsc-v1"


## CentOS/Redhat/AlmaLinux
### For EL8, baseos and appstream must be available,
### By default we enable those repo automatically
# rhel_enable_repos: false
### Docker / Containerd
#docker_rh_repo_base_url: "{{ yum_repo }}/docker-ce/$releasever/$basearch"
#docker_rh_repo_gpgkey: "{{ yum_repo }}/docker-ce/gpg"

## Fedora
### Docker
#docker_fedora_repo_base_url: "{{ yum_repo }}/docker-ce/{{ ansible_distribution_major_version }}/{{ ansible_architecture }}"
#docker_fedora_repo_gpgkey: "{{ yum_repo }}/docker-ce/gpg"
### Containerd
#containerd_fedora_repo_base_url: "{{ yum_repo }}/containerd"
#containerd_fedora_repo_gpgkey: "{{ yum_repo }}/docker-ce/gpg"

## Debian
### Docker
# docker_debian_repo_base_url: "{{ debian_repo }}/docker-ce"
# docker_debian_repo_gpgkey: "{{ debian_repo }}/docker-ce/gpg"
### Containerd
# containerd_debian_repo_base_url: "{{ debian_repo }}/containerd"
# containerd_debian_repo_gpgkey: "{{ debian_repo }}/containerd/gpg"
# containerd_debian_repo_repokey: 'YOURREPOKEY'

## Ubuntu
### Docker
# docker_ubuntu_repo_base_url: "{{ ubuntu_repo }}/docker-ce"
# docker_ubuntu_repo_gpgkey: "{{ ubuntu_repo }}/docker-ce/gpg"
### Containerd
# containerd_ubuntu_repo_base_url: "{{ ubuntu_repo }}/containerd"
# containerd_ubuntu_repo_gpgkey: "{{ ubuntu_repo }}/containerd/gpg"
# containerd_ubuntu_repo_repokey: 'YOURREPOKEY'

2.基于ansible一键部署K8S集群

  1.添加hosts解析
(venv) [root@ansible99 kubespray]# ansible -i inventory/yinzhengjie-k8s/inventory.ini all -m shell -a 'echo 10.0.0.250 harbor250.yinzhengjie.com >>  /etc/hosts'
master233 | CHANGED | rc=0 >>

master232 | CHANGED | rc=0 >>

worker77 | CHANGED | rc=0 >>

master231 | CHANGED | rc=0 >>

worker66 | CHANGED | rc=0 >>

(venv) [root@ansible99 kubespray]# 
(venv) [root@ansible99 kubespray]# 
(venv) [root@ansible99 kubespray]# ansible -i inventory/yinzhengjie-k8s/inventory.ini all -m shell -a 'cat /etc/hosts|grep harbor250' 
master233 | CHANGED | rc=0 >>
10.0.0.250 harbor250.yinzhengjie.com
master231 | CHANGED | rc=0 >>
10.0.0.250 harbor250.yinzhengjie.com
worker66 | CHANGED | rc=0 >>
10.0.0.250 harbor250.yinzhengjie.com
worker77 | CHANGED | rc=0 >>
10.0.0.250 harbor250.yinzhengjie.com
master232 | CHANGED | rc=0 >>
10.0.0.250 harbor250.yinzhengjie.com
(venv) [root@ansible99 kubespray]# 
 

  2.部署集群
(venv) [root@ansible99 kubespray]# ansible-playbook -i inventory/yinzhengjie-k8s/inventory.ini  cluster.yml


温馨提示:
  - 1.此步骤不成功,就不要继续往下操作了,先解决问题后再做后续验证;
  - 2.关于故障排查技巧,可以参考如下命令:
        ansible-playbook -i inventory/yinzhengjie-k8s/inventory.ini reset.yml 
        ansible-playbook -i inventory/yinzhengjie-k8s/inventory.ini cluster.yml  -vvv

3.测试验证

  1.检查worker节点
[root@master231 ~]# kubectl get nodes -o wide
NAME        STATUS   ROLES           AGE     VERSION    INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
master231   Ready    control-plane   5m21s   v1.33.10   10.0.0.231    <none>        Ubuntu 24.04.4 LTS   6.8.0-117-generic   containerd://2.1.6
master232   Ready    control-plane   4m41s   v1.33.10   10.0.0.232    <none>        Ubuntu 24.04.4 LTS   6.8.0-117-generic   containerd://2.1.6
master233   Ready    control-plane   4m19s   v1.33.10   10.0.0.233    <none>        Ubuntu 24.04.4 LTS   6.8.0-117-generic   containerd://2.1.6
worker66    Ready    <none>          3m34s   v1.33.10   10.0.0.66     <none>        Ubuntu 24.04.4 LTS   6.8.0-117-generic   containerd://2.1.6
worker77    Ready    <none>          3m34s   v1.33.10   10.0.0.77     <none>        Ubuntu 24.04.4 LTS   6.8.0-117-generic   containerd://2.1.6
[root@master231 ~]# 
[root@master231 ~]# 

  2.检查证书有效期【我设置的是CA证书100年,master和】
[root@master232 ~]# kubeadm   certs  check-expiration
[check-expiration] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[check-expiration] Use 'kubeadm init phase upload-config --config your-config-file' to re-upload it.
W0612 15:05:16.293484   36532 utils.go:69] The recommended value for "clusterDNS" in "KubeletConfiguration" is: [10.200.0.10]; the provided value is: [169.254.25.10]

CERTIFICATE                  EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                   May 30, 2076 06:58 UTC   49y             ca                      no      
apiserver                    May 30, 2076 06:58 UTC   49y             ca                      no      
apiserver-kubelet-client     May 30, 2076 06:58 UTC   49y             ca                      no      
controller-manager.conf      May 30, 2076 06:58 UTC   49y             ca                      no      
front-proxy-client           May 30, 2076 06:58 UTC   49y             front-proxy-ca          no      
scheduler.conf               May 30, 2076 06:58 UTC   49y             ca                      no      
!MISSING! super-admin.conf                                                                    

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      May 19, 2126 06:58 UTC   99y             no      
front-proxy-ca          May 19, 2126 06:58 UTC   99y             no      
[root@master232 ~]# 

  3.检查worker组件证书的有效期【注意哈,证书有效期是20年的哟~】
[root@master232 ~]# openssl x509  -in /var/lib/kubelet/pki/kubelet-client-current.pem -text -noout | grep Validity -A 2
        Validity
            Not Before: Jun 12 09:48:02 2026 GMT
            Not After : Jun  7 09:48:02 2046 GMT
[root@master232 ~]# 



  4.检查K8S集群网络网段分配情况
[root@master231 ~]# kubectl get pods -A -o wide
NAMESPACE     NAME                                       READY   STATUS    RESTARTS        AGE   IP               NODE        NOMINATED NODE   READINESS GATES
kube-system   calico-kube-controllers-6b48c55b44-wqf6s   1/1     Running   0               54s   10.100.165.3     worker77    <none>           <none>
kube-system   calico-node-fxd72                          1/1     Running   0               54s   10.0.0.233       master233   <none>           <none>
kube-system   calico-node-h6cfh                          1/1     Running   0               54s   10.0.0.231       master231   <none>           <none>
kube-system   calico-node-rwhkz                          1/1     Running   0               53s   10.0.0.66        worker66    <none>           <none>
kube-system   calico-node-wqmzd                          1/1     Running   0               53s   10.0.0.232       master232   <none>           <none>
kube-system   calico-node-zsbx2                          1/1     Running   0               52s   10.0.0.77        worker77    <none>           <none>
kube-system   coredns-594cbfb5fd-8wxd5                   1/1     Running   0               53s   10.100.249.1     master232   <none>           <none>
kube-system   coredns-594cbfb5fd-ddx7g                   1/1     Running   0               53s   10.100.160.129   master231   <none>           <none>
kube-system   dns-autoscaler-8558dbc749-8q5w5            1/1     Running   0               53s   10.100.165.4     worker77    <none>           <none>
kube-system   kube-apiserver-master231                   1/1     Running   1 (4m23s ago)   52s   10.0.0.231       master231   <none>           <none>
kube-system   kube-apiserver-master232                   1/1     Running   1 (4m18s ago)   52s   10.0.0.232       master232   <none>           <none>
kube-system   kube-apiserver-master233                   1/1     Running   1 (4m12s ago)   51s   10.0.0.233       master233   <none>           <none>
kube-system   kube-controller-manager-master231          1/1     Running   2 (4m23s ago)   51s   10.0.0.231       master231   <none>           <none>
kube-system   kube-controller-manager-master232          1/1     Running   2 (4m18s ago)   51s   10.0.0.232       master232   <none>           <none>
kube-system   kube-controller-manager-master233          1/1     Running   2 (4m12s ago)   51s   10.0.0.233       master233   <none>           <none>
kube-system   kube-proxy-cd7zn                           1/1     Running   0               50s   10.0.0.66        worker66    <none>           <none>
kube-system   kube-proxy-hsq49                           1/1     Running   0               49s   10.0.0.232       master232   <none>           <none>
kube-system   kube-proxy-nn8c5                           1/1     Running   0               49s   10.0.0.231       master231   <none>           <none>
kube-system   kube-proxy-tds6l                           1/1     Running   0               49s   10.0.0.233       master233   <none>           <none>
kube-system   kube-proxy-th7x9                           1/1     Running   0               50s   10.0.0.77        worker77    <none>           <none>
kube-system   kube-scheduler-master231                   1/1     Running   2 (4m23s ago)   50s   10.0.0.231       master231   <none>           <none>
kube-system   kube-scheduler-master232                   1/1     Running   2 (4m18s ago)   50s   10.0.0.232       master232   <none>           <none>
kube-system   kube-scheduler-master233                   1/1     Running   2 (4m12s ago)   50s   10.0.0.233       master233   <none>           <none>
kube-system   nginx-proxy-worker66                       1/1     Running   1 (4m7s ago)    50s   10.0.0.66        worker66    <none>           <none>
kube-system   nginx-proxy-worker77                       1/1     Running   1 (4m9s ago)    49s   10.0.0.77        worker77    <none>           <none>
kube-system   nodelocaldns-5z9pz                         1/1     Running   0               47s   10.0.0.231       master231   <none>           <none>
kube-system   nodelocaldns-f2v5d                         1/1     Running   1 (44s ago)     49s   10.0.0.232       master232   <none>           <none>
kube-system   nodelocaldns-fjk2c                         1/1     Running   3 (28s ago)     49s   10.0.0.233       master233   <none>           <none>
kube-system   nodelocaldns-msjwp                         1/1     Running   2 (33s ago)     49s   10.0.0.66        worker66    <none>           <none>
kube-system   nodelocaldns-z8rf5                         1/1     Running   0               48s   10.0.0.77        worker77    <none>           <none>
[root@master231 ~]# 
[root@master231 ~]# kubectl get svc -A
NAMESPACE     NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes   ClusterIP   10.200.0.1   <none>        443/TCP                  26m
kube-system   coredns      ClusterIP   10.200.0.3   <none>        53/UDP,53/TCP,9153/TCP   22m
[root@master231 ~]#