kubernetes-guide/content/deploy/kubespray/install.md

198 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 使用 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` 的选项,跳过第二个步骤。