使用 kubespray 搭建集群
原理
kubespray 是利用 ansible 这个工具,通过 SSH 协议批量让指定远程机器执行一系列脚本,安装各种组件,完成 K8S 集群搭建。
准备工作
下载 kubespray 并拷贝一份配置:
# 下载 kubespray
$ git clone --depth=1 https://github.com/kubernetes-sigs/kubespray.git
$ cd kubespray
# 安装依赖,包括 ansible
$ sudo pip3 install -r requirements.txt
# 复制一份配置文件
cp -rfp inventory/sample inventory/mycluster
修改配置
需要修改的配置文件列表:
inventory/mycluster/group_vars/all/*.yml
inventory/mycluster/group_vars/k8s-cluster/*.yml
下面介绍一些需要重点关注的配置,根据自己需求进行修改。
集群网络
修改配置文件 inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
:
# 选择网络插件,支持 cilium, calico, weave 和 flannel
kube_network_plugin: cilium
# 设置 Service 网段
kube_service_addresses: 10.233.0.0/18
# 设置 Pod 网段
kube_pods_subnet: 10.233.64.0/18
其它相关配置文件: inventory/mycluster/group_vars/k8s_cluster/k8s-net-*.yml
。
运行时
修改配置文件 inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
:
# 支持 docker, crio 和 containerd,推荐 containerd.
container_manager: containerd
# 是否开启 kata containers
kata_containers_enabled: false
其它相关配置文件:
inventory/mycluster/group_vars/all/containerd.yml
inventory/mycluster/group_vars/all/cri-o.yml
inventory/mycluster/group_vars/all/docker.yml
集群证书
修改配置文件 inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
:
# 是否开启自动更新证书,推荐开启。
auto_renew_certificates: true
准备机器列表
拿到集群部署的初始机器内网 ip 列表,修改 inventory/mycluster/inventory.ini
:
[all]
master1 ansible_host=10.10.10.1
master2 ansible_host=10.10.10.2
master3 ansible_host=10.10.10.3
node1 ansible_host=10.10.10.4
node2 ansible_host=10.10.10.5
node3 ansible_host=10.10.10.6
node4 ansible_host=10.10.10.7
node5 ansible_host=10.10.10.8
node6 ansible_host=10.10.10.9
node7 ansible_host=10.10.10.10
[kube_control_plane]
master1
master2
master3
[etcd]
master1
master2
master3
[kube_node]
master1
master2
master3
node1
node2
node3
node4
node5
node6
node7
[calico_rr]
[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr
注: 务必使用
ansible_host
标识节点内网 IP,否则可能导致出现类似 这个issue 的问题。
附上 vim 编辑 inventory,批量加机器的技巧:
国内环境安装
在国内进行安装时,会因 GFW 影响而安装失败,参考 kubespray 离线安装配置。
部署集群
ansible-playbook \
-i inventory/mycluster/inventory.ini \
--private-key=id_rsa \
--user=ubuntu -b \
cluster.yml
获取 kubeconfig
部署完成后,从 master 节点上的 /root/.kube/config
路径获取到 kubeconfig,这里以 ansible 的 fetch 功能为例,将 kubeconfig 拷贝下来:
$ ansible -i '10.10.6.9,' -b -m fetch --private-key id_rsa --user=ubuntu -a 'src=/root/.kube/config dest=kubeconfig flat=yes' all
[WARNING]: Skipping callback plugin 'ara_default', unable to load
10.10.6.9 | CHANGED => {
"changed": true,
"checksum": "190eafeead70a8677b736eaa66d84d77c4a7f8be",
"dest": "/root/kubespray/kubeconfig",
"md5sum": "ded532f68930c48a53b3b2144b30f7f5",
"remote_checksum": "190eafeead70a8677b736eaa66d84d77c4a7f8be",
"remote_md5sum": null
}
-i
中的逗号是故意的,意思是不让 ansible 误以为是个 inventory 文件,而是解析为单个 host。
获取到 kubeconfig 后,可以修改其中的 server 地址,将 https://127.0.0.1:6443
改为非 master 节点可以访问的地址,最简单就直接替换 127.0.0.1
成其中一台 master 节点的 IP 地址,也可以在 Master 前面挂个负载均衡器,然后替换成负载均衡器的地址。
扩容节点
如果要扩容节点,可以准备好节点的内网 IP 列表,并追加到之前的 inventory 文件里,然后再次使用 ansible-playbook
运行一次,有点不同的是: cluster.yml
换成 scale.yml
:
ansible-playbook \
-i inventory/mycluster/inventory.ini \
--private-key=id_rsa \
--user=ubuntu -b \
scale.yml
缩容节点
如果有节点不再需要了,我们可以将其移除集群,通常步骤是:
kubectl cordon NODE
驱逐节点,确保节点上的服务飘到其它节点上去,参考 安全维护或下线节点。- 停止节点上的一些 k8s 组件 (kubelet, kube-proxy) 等。
kubectl delete NODE
将节点移出集群。- 如果节点是虚拟机,并且不需要了,可以直接销毁掉。
前 3 个步骤,也可以用 kubespray 提供的 remove-node.yml
这个 playbook 来一步到位实现:
ansible-playbook \
-i inventory/mycluster/inventory.ini \
--private-key=id_rsa \
--user=ubuntu -b \
--extra-vars "node=node1,node2" \
remove-node.yml
--extra-vars
里写要移出的节点名列表,如果节点已经卡死,无法通过 SSH 登录,可以在--extra-vars
加个reset_nodes=false
的选项,跳过第二个步骤。