Akemi

Kubespray部署多节点k8s集群v1.27.5

2025/09/10

Kubespray 是一个开源的 Kubernetes 部署、配置和管理工具。它的核心目标是提供一种高可用、生产就绪的 Kubernetes 集群部署方案。您可以把它理解为一个强大的、自动化的“Kubernetes 安装器”。

其实就是使用ansible的这么一种方式,以前可以用ansible+kubeadm,现在这CNCF直接提供了一种使用ansible来部署高可用的方法

支持的系统版本

kubernetes-sigs/kubespray: Deploy a Production Ready Kubernetes Cluster

其中2.20版本支持k8s v1.24.6的安装,并且支持Centos7

每个版本在对应分支中都可以查看其支持的版本

加速相关
如果你试过用kubeadm部署k8s,那就一定知道有好几个镜像是需要从gcr上下载的,也就是需要魔法下载的。

就算配置了阿里云的谷歌镜像仓库,也没法下载,所以在国内使用ansible安装k8s,最大的一个挑战就是加速问题,如果没有代理,将寸步难行

另外一种方法,是手动配置registry,自己拉好镜像之后放到私有仓库中,随后配置ansible的变量

1
2
3
4
5
6
7
8
9
10
Centos8.5.2111
Kubespray 2.23.0
k8s 1.27.5
10.163.2.100 ansible (CentOS9-Stream)
10.163.2.106 master1
10.163.2.102 master2
10.163.2.101 master3
10.163.2.109 worker1
10.163.2.108 worker2
10.163.2.131 worker3

配置ansible节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
hostnamectl set-hostname ansible && bash
yum -y install python3-pip sshpass

# 克隆Kubespray项目或者去网页上下载上传
git clone -b release-2.23 https://github.com/kubernetes-sigs/kubespray
tar -xf kubespray-2.23.0.tar.gz
cd kubespray-2.23.0/

# 写inventory文件
vim inventory/sample/inventory.ini
[all]
master1 ansible_host=10.163.2.106
master2 ansible_host=10.163.2.102
master3 ansible_host=10.163.2.101
worker1 ansible_host=10.163.2.109
worker2 ansible_host=10.163.2.108
worker3 ansible_host=10.163.2.131

[kube-master]
master1
master2
master3

[etcd]
master1
master2
master3

[kube-node]
master1
master2
master3
worker1
worker2
worker3

[calico_rr]

[k8s_cluster:children]
kube-master
kube-node
calico_rr

# 用pip安装python依赖
pip3 install -r requirements.txt \
-i https://mirrors.aliyun.com/pypi/simple/

ansible变量-k8s相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
inventory/sample/group_vars/k8s_cluster/k8s-cluster.yml

kube_version: v1.27.5 # k8s版本

# 前缀相关
cluster_name: cluster.local
use_kubernetes_node_name_prefix: false
use_kubernetes_node_role_prefix: true

# 网络插件相关
kube_network_plugin: calico
kube_service_addresses: 10.233.0.0/18 #
kube_pods_subnet: 10.233.64.0/18
kube_proxy_mode: ipvs # 数据转发模式

# 容器运行时,可选docker, containerd, crio
container_manager: containerd
1.24起,如果选docker,kubespray会自动部署cri-docker

# kubelet_cgroup_driver: systemd
默认使用systemd作为资源隔离驱动

# 是否部署 NodeLocal DNS 以提高 DNS 性能(默认已开启,推荐)
enable_nodelocaldns: true

# 是否部署 Nginx Ingress Controller
ingress_nginx_enabled: false
# 是否部署 metrics-server,用于 `kubectl top`
metrics_server_enabled: true
# 是否启用网络策略,需要 CNI 插件支持(如 Calico, Cilium)
enable_network_policy: true

# 证书相关
cert_validity_period: 3650
# 证书轮换
kubelet_rotate_server_certificates: true
kubelet_rotate_certificates: true

ansible变量-calico相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# calico相关
inventory/sample/group_vars/k8s_cluster/k8s-net-calico.yml

默认使用vxlan模式
# calico_vxlan_mode: 'Always'
# calico_ipip_mode: 'Never'
# calico_bpf_enabled: false

# Pod网段
calico_pool_cidr: "10.233.64.0/18"

# Calico 的网络后端
# 可选值:
# "bird": 使用 BGP 协议进行路由(默认,性能好,需要网络设备支持或节点在同一个 L2 网络)
# "vxlan": 使用 VXLAN 封装(Overlay 网络,适用于节点跨子网/数据中心的场景)
# "none": 不使用任何网络后端,通常用于其他 CNI 或特殊配置

CrossSubnet模式(推荐)

1
2
3
4
5
6
7
8
Calico with BGP backend + IPIP mode CrossSubnet
即通过BGP路由,IPIP封装的形式
如果是跨子网则用IPIP封装,如果二层则不封装

calico_network_backend: "bird"
calico_ipip_mode: "CrossSubnet"
calico_vxlan_mode: "Never"
calico_nat_outgoing: true

vxlan网络(默认)

但效率低,不推荐,起码打开IPIP

1
2
3
4
calico_network_backend: "vxlan"
calico_ipip_mode: "Never"
calico_vxlan_mode: "Always"
calico_nat_outgoing: true

加速相关ansible变量与部署

如果你试过用kubeadm部署k8s,那就一定知道有好几个镜像是需要从gcr上下载的,也就是需要魔法下载的。

就算配置了阿里云的谷歌镜像仓库,也没法下载,所以在国内使用ansible安装k8s,最大的一个挑战就是加速问题,如果没有代理,将寸步难行

另外一种方法,是手动配置registry,自己拉好镜像之后放到私有仓库中,随后配置ansible的变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 调整主机组变量,代理相关(推荐使用)
vim inventory/sample/group_vars/all/all.yml
http_proxy: "http://192.168.1.7:7897"
https_proxy: "http://192.168.1.7:7897"

# 调整主机组变量,提权相关,我这里直接用root
vim inventory/sample/group_vars/all/all.yml
ansible_become_pass: "1" # root密码

# 调整主机组变量,docker镜像源
vim inventory/sample/group_vars/all/docker.yml
docker_registry_mirrors:
- https://registry.docker-cn.com
- https://mirror.aliyuncs.com

# 二进制与镜像加速(可选)
vim inventory/sample/group_vars/k8s_cluster/k8s-cluster.yml
添加变量
#gcr_image_repo: "gcr.m.daocloud.io"
#kube_image_repo: "k8s.m.daocloud.io"
#docker_image_repo: "docker.m.daocloud.io"
#quay_image_repo: "quay.m.daocloud.io"
#github_image_repo: "ghcr.m.daocloud.io"
#files_repo: "https://files.m.daocloud.io"

# 注释掉bug代码
extra_playbooks/roles/kubernetes/preinstall/tasks/0040-verify-settings.yml
这个剧本的第一个task
#- name: Stop if either kube_control_plane or kube_node group is empty
# assert:
# that: "groups.get('{{ item }}')"
# with_items:
# - kube_control_plane
# - kube_node
# run_once: true
# when: not ignore_assert_errors

# 创建密钥
ssh-keygen -N '' -f ~/.ssh/id_rsa

# 可以先执行一句ad-hoc,把防火墙都关一下,不然etcd连不上会报错
ansible -i inventory/sample/inventory.ini -m shell -a "systemctl disable firewalld.service --now" all

# 进行k8s集群部署,大约会花费20~30分钟
ansible-playbook -i inventory/sample/inventory.ini cluster.yml -v -u root --private-key=~/.ssh/id_rsa

部署完成
PLAY RECAP ****************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
master1 : ok=758 changed=72 unreachable=0 failed=0 skipped=1288 rescued=0 ignored=7
master2 : ok=653 changed=60 unreachable=0 failed=0 skipped=1133 rescued=0 ignored=2
master3 : ok=655 changed=61 unreachable=0 failed=0 skipped=1131 rescued=0 ignored=2
worker1 : ok=508 changed=34 unreachable=0 failed=0 skipped=771 rescued=0 ignored=1
worker2 : ok=508 changed=34 unreachable=0 failed=0 skipped=771 rescued=0 ignored=1
worker3 : ok=508 changed=34 unreachable=0 failed=0 skipped=771 rescued=0 ignored=1

# 验证集群状态
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 17h v1.27.5
master2 Ready control-plane 17h v1.27.5
master3 Ready control-plane 17h v1.27.5
worker1 Ready <none> 17h v1.27.5
worker2 Ready <none> 17h v1.27.5
worker3 Ready <none> 17h v1.27.5
CATALOG
  1. 1. 配置ansible节点
  2. 2. ansible变量-k8s相关
  3. 3. ansible变量-calico相关
    1. 3.1. CrossSubnet模式(推荐)
    2. 3.2. vxlan网络(默认)
  4. 4. 加速相关ansible变量与部署