管理集群

准备工作

安装wdrip
下载最新版本wdrip.当前版本0.1.1

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
(base) ➜ curl -sSL --retry 3 https://host-wdrip-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/wdrip/install.sh |bash
(base) ➜ ls -lht /usr/local/bin/wdrip

# use wdrip -h to see wdrip help command
(base) ➜ wdrip -h

wdrip creates and manages infrastructure agnostic Kubernetes clusters
_ _
| | (_)
_ _ _ __| | ____ _ ____
| | | | / _ | / ___)| || _ \
| | | |( (_| || | | || |_| |
\___/ \____||_| |_|| __/
|_|


wdrip creates and manages infrastructure agnostic Kubernetes clusters and empower strong auto heal ability and easy recovery

Usage:
wdrip [command]

Available Commands:
bootstrap Bootstrap a Kubernetes cluster
build Kubernetes cluster build package
......

Use "wdrip [command] --help" for more information about a command.

配置wdrip
wdrip 目前仅支持阿里云上管理k8s集群,更多的CloudProvider未来会逐步加入。
wdrip 需要您的阿里云账号信息来帮助您管理您的云上k8s资源。将replace-with-your-own-accessKeyIdreplace-with-your-own-accessKeySecret替换成您自己的主账号AK信息。
wdrip 会额外为您创建OSS bucket,用来备份集群,用来紧急修复。bucket名称见下面的wdrip-index

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
(base) ➜ vi ~/.wdrip/config

apiVersion: alibabacloud.com/v1
contexts:
- context:
provider-key: alibaba.dev
name: devEnv
current-context: devEnv
kind: Config
providers:
- name: alibaba.dev
provider:
name: alibaba
value:
accessKeyId: {replace-with-your-own-accessKeyId}
accessKeySecret: {replace-with-your-own-accessKeySecret}
bucketName: {replace-with-your-bucketName, any valid string which not collide with other user}
region: cn-hangzhou

(base) ➜ wdrip get
I0608 21:53:07.759770 50502 provider.go:272] use HOME dir: [/Users/aoxn]
I0608 21:53:07.759928 50502 provider.go:287] trying to load context config from: /Users/aoxn/.wdrip/config
I0608 21:53:08.109595 50502 oss.go:42] oss get object from [oss://index-test-aoxn/wdrip/clusters/kubernetes-id-001.json]
I0608 21:53:08.164366 50502 iaas.go:326]
NAME ENDPOINT

如果wdrip get 报错Status Code: 403 Code: AccessDenied Message: The bucket you access does not belong to you. 请换一个bucketName,因为你指定的bucket名称在全局范围内与其他人的名称冲突了。

创建集群

wdrip遵循结构化原则,最小核心原则,模块化设计,因此具有非常高的灵活性。
wdrip会首先在云上初始化一个单Master节点的k8s集群(最小可用原则),这个阶段的速度最快,并且具有最小的故障面,具有最高的系统稳定性。
以下配置为您创建一个最小k8s集群,仅有一个master节点。预计3分钟内完成。

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
(base) ➜ export CLUSTER_NAME=kubernetes-id-001 \
REGION=cn-hangzhou ZONE_ID=cn-hangzhou-k \
IMAGE_ID=centos_7_9_x64_20G_alibase_20210623.vhd \
DISK_TYPE=cloud_essd \
INSTANCE_TYPE=ecs.c6.xlarge \
TOKEN=$(/usr/local/bin/wdrip token new)

(base) ➜ cat > config.yaml << EOF
clusterid: "${CLUSTER_NAME}"
iaas:
workerCount: 1
image: "${IMAGE_ID}"
disk:
size: 40G
type: "${DISK_TYPE}"
region: "${REGION}"
zoneid: ${ZONE_ID}
instance: "${INSTANCE_TYPE}"
registry: registry-vpc.${REGION}.aliyuncs.com
namespace: default
cloudType: public
kubernetes:
name: kubernetes
version: 1.20.4-aliyun.1
kubeadmToken: ${TOKEN}
etcd:
name: etcd
version: v3.4.3
runtime:
name: docker
version: 19.03.5
sans:
- 192.168.0.1
network:
mode: ipvs
podcidr: 172.16.0.1/16
svccidr: 172.19.0.1/20
domain: cluster.domain
netMask: 25
EOF

(base) ➜ wdrip create --config config.yaml

wdrip: kubernetes cluster lifecycle management.
_ _
| | (_)
_ _ _ __| | ____ _ ____
| | | | / _ | / ___)| || _ \
| | | |( (_| || | | || |_| |
\___/ \____||_| |_|| __/
|_|

I1002 15:31:37.593094 96000 provider.go:268] use HOME dir: [/Users/aoxn]
I1002 15:31:37.593265 96000 provider.go:283] trying to load context config from: /Users/aoxn/.wdrip/config
I1002 15:31:37.595669 96000 provider.go:52] use command line config as bootconfig: [config.yaml] with provider[alibaba]
I1002 15:31:37.726288 96000 oss.go:32] oss get object from [oss://wdrip-index/wdrip/clusters/kubernetes-id-001.json]
....

I1002 15:31:41.989201 96000 iaas.go:96] watch cluster create progress with command: [ wdrip watch --name kubernetes-id-001 ]

观测集群的创建过程

创建的集群是一个异步的过程,因此我们提供了一个watch命令,用来观测创建的进度。执行watch命令前请将terminal窗口最大化,保证最佳输出效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(base) ➜  wdrip watch --name kubernetes-id-001
I1002 15:42:05.600911 96142 provider.go:268] use HOME dir: [/Users/aoxn]
I1002 15:42:05.601063 96142 provider.go:283] trying to load context config from: /Users/aoxn/.wdrip/config
✓ 【ALIYUN::ROS::Stack 】(kubernetes-id-001 ) [CREATE_COMPLETE,23, 23] 2021-10-02T15:31:42 2021-10-02T15:35:52
✓ 【ALIYUN::ROS::WaitCondition 】(k8s_master_waiter ) [CREATE_COMPLETE,23, 23] 2021-10-02T15:31:52 2021-10-02T15:35:51

.....

✓ 【ALIYUN::RAM::Role 】(KubernetesWorkerRole ) [CREATE_COMPLETE,23, 23] 2021-10-02T15:31:42 2021-10-02T15:31:52
✓ 【WDRIP::MESSAGE::OUTPUT 】(extra_mesage_id ) [CREATE_COMPLETE,23, 23] TimeElapse: 251s
I1002 15:42:14.446231 96142 ros.go:477] ===========================================================
I1002 15:42:14.446254 96142 ros.go:478] StackName: kubernetes-id-001
I1002 15:42:14.446259 96142 ros.go:479] StackId: 2d302c6c-24b3-4535-8875-8c7dd9a48bd7

查看集群列表

wdrip提供了命令用来查看本账号的provider所创建的集群列表

1
2
3
4
5
6
7
8
9
10
11
(base) ➜ wdrip get
I1002 16:16:59.615092 97592 provider.go:268] use HOME dir: [/Users/aoxn]
I1002 16:16:59.615225 97592 provider.go:283] trying to load context config from: /Users/aoxn/.wdrip/config
I1002 16:16:59.670775 97592 index.go:76] get cluster: [wdrip/clusters/kubernetes-id-001.json]
I1002 16:16:59.670802 97592 oss.go:32] oss get object from [oss://wdrip-index/wdrip/clusters/kubernetes-id-001.json]
I1002 16:16:59.735396 97592 index.go:76] get cluster: [wdrip/clusters/kubernetes-wdrip-77.json]
I1002 16:16:59.735420 97592 oss.go:32] oss get object from [oss://wdrip-index/wdrip/clusters/kubernetes-wdrip-77.json]
I1002 16:16:59.807551 97592 iaas.go:190]
NAME ENDPOINT
kubernetes-id-001 47.96.27.46/192.168.0.75
kubernetes-wdrip-77 116.62.24.127/192.168.0.53

通过wdrip get -n kubernetes-id-001 -o yaml 可以查看该集群的详细信息

连接集群

当集群创建完成后,可以通过wdrip get命令下载kubeconfig文件来访问我们的集群。 当前wdrip创建的集群通过EIP在公网暴露了apiserver,因此可以通过公网本地访问。

1
2
3
4
5
6
7
8
9
10
11
12
(base) ➜ wdrip get -r kubeconfig -n kubernetes-id-001 -w ~/.kube/config.txt

I1002 16:14:38.136200 97541 provider.go:268] use HOME dir: [/Users/aoxn]
I1002 16:14:38.136349 97541 provider.go:283] trying to load context config from: /Users/aoxn/.wdrip/config
I1002 16:14:38.136730 97541 oss.go:32] oss get object from [oss://wdrip-index/wdrip/clusters/kubernetes-id-001.json]
I1002 16:14:40.241796 97541 sign.go:223] sign kubernetes: []
I1002 16:14:40.612558 97541 iaas.go:301] write kubeconfig to file [/Users/aoxn/.kube/config.txt]

(base) ➜ kubectl --kubeconfig ~/.kube/config.txt get no

NAME STATUS ROLES AGE VERSION
192.168.0.77.i-bp12a2wcmbrd4383cai3 Ready control-plane,master 2m2s v1.20.4-aliyun.1

添加工作节点

创建节点池

wdrip 提供了NodePool的概念,将一组具有相同的配置的节点组作为一个节点池统一管理。通过以下yaml可以创建具有N个节点的节点池。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(base) ➜ kubectl --kubeconfig ~/.kube/config.txt apply -f - <<EOF
apiVersion: alibabacloud.com/v1
kind: NodePool
metadata:
name: nodepool-01
namespace: kube-system
spec:
id: "very-long-id-xxxxx"
infra:
desiredCapacity: 1
cpu: 4
memory: 8
imageId: centos_7_9_x64_20G_alibase_20210623.vhd
EOF

# output
nodepool.alibabacloud.com/nodepool-01 created

通过kubectl --kubeconfig ~/.kube/config.txt get no -w 观测节点的创建。 节点的创建及加入过程大约需要等待90s。请等待

同样的方式可以创建多个具有不同配置的节点池。

扩容节点池

节点池的管理规划是完全面向终态的,但目前的实现还在早期阶段,您可以通过edit对应的NodePool的CRD的desiredCapacity的值来调整节点池的节点数量。
观测节点池的加入的过程参考上面方法。可以调大,也可以调小节点池的大小。
自动扩容节点池的功能Coming Soon。

1
(base) ➜ kubectl --kubeconfig ~/.kube/config.txt edit nodepool default-nodepool

集群高可用

一切都是面向终态的

构建高可用的k8s集群

单个Master的k8s集群不具备高可用,但已足够用作测试集群,经济适用。wdrip同样提供了灵活简单的方式将已有集群扩展成高可用集群。wdrip适用MasterSet的CRD资源代表Master节点组。
以下命令扩展当前集群的Master副本数量到3个。

1
2
3
4
5
6
7
8
9
(base) ➜ kubectl --kubeconfig ~/.kube/config.txt edit masterset
apiVersion: alibabacloud.com/v1
kind: MasterSet
metadata:
# 请不要改masterset这个名称,没做支持,也没意义。
name: masterset
namespace: kube-system
spec:
replicas: 3

wdrip需要2分钟左右的时间来初始化额外的2个Master节点,请等待。可以通过kubectl --kubeconfig ~/.kube/config.txt get no -w 观测Master节点的加入过程。

大规模集群场景

当你的集群规模进一步扩大后,3个Master已经不能满足你的需求了,那么你也可以通过MasterSet的replicas方便快速的将Master副本数量调整成您喜欢的任意的数量,不过一般不建议超过7个。

1
2
(base) ➜ kubectl --kubeconfig ~/.kube/config.txt -n kube-system edit masterset
# set replicas to 5

然后通过上面的命令观测Master节点数量的变化,同样需要等待大约2分钟时间。

缩减集群规模

一切都是面向终态的,当您的集群规模降低后,不在需要这么多的Master后,同样可以通过调整MasterSet的replicas来调整Master的数量。可以调整到3个副本,也可以调整到1个Master副本。Master缩减的过程中需要保持多数quorum,因此缩减是逐步发生的。并且在系统未达到稳态以前,缩减也不会立即发生。

1
2
(base) ➜ kubectl --kubeconfig ~/.kube/config.txt -n kube-system edit masterset
# set replicas to 3 or 1

然后通过上面的命令观测Master节点数量的变化。

集群灾难恢复

备份机制

wdrip定期备份您的集群的k8s的etcd数据,用于发生集群级别故障的时候快速恢复。默认每10分钟备份一次,保留最近4个备份副本。
您可用通过wdrip get -r backup来查看当前的备份信息。

1
2
3
4
5
6
7
8
9
10
(base) ➜ wdrip get -r backup -n kubernetes-id-001
I1002 18:28:13.072037 98760 provider.go:268] use HOME dir: [/Users/aoxn]
I1002 18:28:13.072184 98760 provider.go:283] trying to load context config from: /Users/aoxn/.wdrip/config
I1002 18:28:13.072557 98760 oss.go:32] oss get object from [oss://wdrip-index/wdrip/backup/kubernetes-id-001/index.json]
I1002 18:28:13.140780 98760 iaas.go:243]
NAME PREFIX DATE PATH
kubernetes-id-001 wdrip/backup 20211002-1024 wdrip/backup/kubernetes-id-001/20211002-1024/snapshot.db
kubernetes-id-001 wdrip/backup 20211002-1014 wdrip/backup/kubernetes-id-001/20211002-1014/snapshot.db
kubernetes-id-001 wdrip/backup 20211002-1004 wdrip/backup/kubernetes-id-001/20211002-1004/snapshot.db
kubernetes-id-001 wdrip/backup 20211002-0954 wdrip/backup/kubernetes-id-001/20211002-0954/snapshot.db

恢复场景一:在原基础设施上恢复

如果k8s因未知因素管控完全故障,wdrip没有能够自行恢复,那么您可以手动触发命令执行恢复。仅需要一行命令即可

1
2
3
# -n 指定恢复的目标集群(本体)。
(base) ➜ wdrip recover -n kubernetes-id-001

等待大概2到3分钟后,通过kubectl get no 查看节点恢复情况。

恢复场景二:恢复到新的基础设施上

有些情况下,集群所对应的基础设施被损坏,人为的或者灾难性的,以至于无法在原有基础设施上恢复,那么我们可以通过新建一个具有相同规格的基础设施的集群,然后在本基础设施上恢复出原有集群的备份意识。

1
2
3
4
5
6
7
# 创建具有相同规格的新的集群kubernetes-id-002,步骤参考【创建集群】Section
(base) ➜ wdrip create --config config.yaml

# 将备份的旧的kubernetes-wdrip-120集群配置(意识)恢复到新建的集群121上。
# -n 指定恢复的目标集群(本体), -f 指定恢复的配置来源于哪个集群(意识)。
(base) ➜ wdrip recover -n kubernetes-id-002 -f kubernetes-id-001

节点修复机制

节点是运行负载的工具而已,无需像对待宠物那样对待节点,对于失效的节点,替换是成本最小的方案,替换之前我们会尝试重启来恢复。

自定义集群参数能力

规划中(节点、集群)

运维简化机制

节点故障后快速恢复,定位问题很难。 在wdrip这里,你可以直接删掉故障节点,让系统直接拉起一个新的节点副本即可。

附录

以上示例所涉及到的脚步均保存于wdrip项目中,使用前请git clone到本地.

1
(base) ➜ git clone https://github.com/aoxn/wdrip.git