kubernetes-guide/deploy/kubespray/install.md

198 lines
5.5 KiB
Markdown
Raw Permalink Normal View History

2023-09-27 17:04:00 +08:00
# 使用 kubespray 搭建集群
## 原理
[kubespray](https://github.com/kubernetes-sigs/kubespray) 是利用 [ansible](https://docs.ansible.com/ansible/latest/index.html) 这个工具,通过 SSH 协议批量让指定远程机器执行一系列脚本,安装各种组件,完成 K8S 集群搭建。
## 准备工作
下载 kubespray 并拷贝一份配置:
```bash
# 下载 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`:
```yaml
# 选择网络插件,支持 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`:
```yaml
# 支持 docker, crio 和 containerd推荐 containerd.
container_manager: containerd
# 是否开启 kata containers
kata_containers_enabled: false
```
其它相关配置文件:
```txt
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`:
```yaml
# 是否开启自动更新证书,推荐开启。
auto_renew_certificates: true
```
## 准备机器列表
拿到集群部署的初始机器内网 ip 列表,修改 `inventory/mycluster/inventory.ini`:
```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](https://github.com/kubernetes-sigs/kubespray/issues/5949) 的问题。
附上 vim 编辑 inventory批量加机器的技巧:
![](https://image-host-1251893006.cos.ap-chengdu.myqcloud.com/2023/09/25/vim-inventory.gif)
## 国内环境安装
在国内进行安装时,会因 GFW 影响而安装失败,参考 [kubespray 离线安装配置](offline.md)。
## 部署集群
```bash
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 拷贝下来:
```bash
$ 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`:
```bash
ansible-playbook \
-i inventory/mycluster/inventory.ini \
--private-key=id_rsa \
--user=ubuntu -b \
scale.yml
```
## 缩容节点
如果有节点不再需要了,我们可以将其移除集群,通常步骤是:
1. `kubectl cordon NODE` 驱逐节点,确保节点上的服务飘到其它节点上去,参考 [安全维护或下线节点](../../best-practices/ops/securely-maintain-or-offline-node.md)。
2. 停止节点上的一些 k8s 组件 (kubelet, kube-proxy) 等。
3. `kubectl delete NODE` 将节点移出集群。
4. 如果节点是虚拟机,并且不需要了,可以直接销毁掉。
前 3 个步骤,也可以用 kubespray 提供的 `remove-node.yml` 这个 playbook 来一步到位实现:
```bash
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` 的选项,跳过第二个步骤。