Skip to content

Commit a49003b

Browse files
authored
Merge pull request #302 from ErikJiang/ssh_key_deploy_md
Add documentation for deploying clusters with ssh secret keys
2 parents 4f55ec3 + 07bcf2e commit a49003b

File tree

8 files changed

+215
-15
lines changed

8 files changed

+215
-15
lines changed

README.md

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,14 @@ kubean is a cluster lifecycle management tool based on [kubespray](https://githu
3737

3838
---
3939

40-
## Awesome features
40+
## :anchor: Awesome features
41+
4142
- Simplicity: Deploying of Kubean and powerful lifecycle management of kubernetes cluster implementing by declarative API.
4243
- Offline Supported: Offline packages(os-pkgs, images, binarys) are released with the release. You won't have to worry about how to gather all the resources you need.
4344
- Compatibility: Multi-arch delivery Supporting. Such as AMD, ARM with common Linux distributions. Also include Kunpeng with Kylin.
4445
- Expandability: Allowing custom actions be added to cluster without any changes for Kubespray.
4546

46-
## Quick Start
47+
## :surfing_man: Quick Start
4748

4849
#### 1. Ensure that a Kubernetes Cluster exists and Helm installed
4950

@@ -79,11 +80,9 @@ We cloud use the example in folder `artifacts/demo` which uses online resources
7980

8081
[![quick_start_image](docs/images/quick_start.gif)](https://asciinema.org/a/511386)
8182

82-
## Offline Usage
83-
84-
[offline](docs/offline.md)
85-
86-
## Documents
87-
- [Architecture](docs/architecture_zh.md)
88-
- [Kubean vs Kubespray](docs/comparisons_zh.md)
89-
- [CRD Outline](docs/crds_zh.md)
83+
## :book: Documents
84+
- [Architecture](docs/zh/architecture.md)
85+
- [Kubean vs Kubespray](docs/zh/comparisons.md)
86+
- [CRD Outline](docs/zh/crds.md)
87+
- [Deploy cluster using SSH secret key method](docs/zh/sshkey_deploy_cluster.md)
88+
- [Cluster deployment for air gap environments](docs/offline.md)

docs/offline.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Offline Usage
22

3+
> English | [中文](zh/offline.md)
4+
35
The `kubean` project can be divided into three functions, `generating offline package`
46
, `importing offline package to minio and registry` and `installing k8s`.
57

File renamed without changes.

docs/architecture_zh.md renamed to docs/zh/architecture.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
Kubean 的整体架构如下所示:
44

5-
![kubean-architecture](images/kubean-architecture.png)
5+
![kubean-architecture](../images/kubean-architecture.png)
66

77
Kubean 需要运行在一个已存在的 Kubernetes 集群,通过应用 Kubean 提供的标准 CRD 资源和 Kubernetes 内建资源来控制和管理集群的生命周期(安装、卸载、升级、扩容、缩容等)。 Kubean 采用 Kubespray 作为底层技术依赖,一方面简化了集群部署的操作流程,降低了用户的使用门槛。另一方面在 Kubespray 能力基础上增加了集群操作记录、离线版本记录等诸多新特性。
88

99
<br/>
1010

11-
![kubean-components](images/kubean-components.png)
11+
![kubean-components](../images/kubean-components.png)
1212

1313
Kubean 运行着多个控制器,这些控制器跟踪 Kubean CRD 对象的变化,并且与底层集群的 API 服务器进行通信来创建 Kubernetes原生资源对象。由以下四个组件构成:
1414

File renamed without changes.

docs/crds_zh.md renamed to docs/zh/crds.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ spec:
2727

2828
#### 属性关联
2929

30-
- `hostConfRef`:hostConfRef 是一个 ConfigMap 资源,它的内容应满足 ansible inventory 的格式,包含集群节点信息、类型分组信息。内容可参考 [demo](../artifacts/demo/hosts-conf-cm.yml)
30+
- `hostConfRef`:hostConfRef 是一个 ConfigMap 资源,它的内容应满足 ansible inventory 的格式,包含集群节点信息、类型分组信息。内容可参考 [demo](../../artifacts/demo/hosts-conf-cm.yml)
3131
- `name`:表示其引用的 ConfigMap 的名称
3232
- `namespace`:表示其引用的 ConfigMap 所在的命名空间
3333

34-
- `varsConfRef`:varsConfRef 是一个 ConfigMap 资源,用作初始化或覆盖 Kubespray 中声明的变量值。如果有离线需求,这将很有用。内容可参考 [demo](../artifacts/demo/vars-conf-cm.yml)
34+
- `varsConfRef`:varsConfRef 是一个 ConfigMap 资源,用作初始化或覆盖 Kubespray 中声明的变量值。如果有离线需求,这将很有用。内容可参考 [demo](../../artifacts/demo/vars-conf-cm.yml)
3535
- `name`:表示其引用的 ConfigMap 的名称
3636
- `namespace`:表示其引用的 ConfigMap 所在的命名空间
3737

docs/offline_zh.md renamed to docs/zh/offline.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,4 +294,4 @@ nerdctl_download_url: "{{ files_repo }}/github.com/containerd/nerdctl/releases/d
294294

295295
## 增量离线包的生成和使用
296296

297-
详细文档见[airgap_patch_usage](airgap_patch_usage.md)
297+
详细文档见: [Air gap patch usage](airgap_patch_usage.md).

docs/zh/sshkey_deploy_cluster.md

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
# :key: 使用 SSH 秘钥方式部署 K8S 集群
2+
3+
## 内容
4+
5+
*[1. SSH 秘钥的生成与分发](#SSH秘钥的生成与分发)
6+
*[2. 使用私钥制作 Secret](#使用私钥制作Secret)
7+
*[3. 创建主机清单配置](#创建主机清单配置)
8+
*[3. 制备部署集群的配置参数](#制备部署集群的配置参数)
9+
*[4. 准备 KuBean 的自定义资源](#准备KuBean的自定义资源)
10+
*[5. 开始部署集群](#开始部署集群)
11+
12+
## SSH秘钥的生成与分发
13+
14+
1. 通过 `ssh-keygen` 命令生成公私钥对,比如:
15+
``` bash
16+
$ ssh-keygen
17+
Generating public/private rsa key pair.
18+
Enter file in which to save the key (/root/.ssh/id_rsa):
19+
Enter passphrase (empty for no passphrase):
20+
Enter same passphrase again:
21+
Your identification has been saved in /root/.ssh/id_rsa.
22+
Your public key has been saved in /root/.ssh/id_rsa.pub.
23+
The key fingerprint is:
24+
SHA256:XBSD2HY1Lp8ZRfTC82cFEXzW/BRgEMd+SWiKzBNSUHN [email protected]
25+
The key's randomart image is:
26+
+---[RSA 2048]----+
27+
| +B=E*XO*O.|
28+
| . =X =o=O.=|
29+
| .oo o oo++o|
30+
| + = + .+|
31+
| S . .|
32+
| |
33+
| |
34+
| |
35+
| |
36+
+----[SHA256]-----+
37+
38+
$ ls /root/.ssh/id_rsa* -lh
39+
-rw-------. 1 root root 1.7K Nov 10 03:47 /root/.ssh/id_rsa # 私钥
40+
-rw-r--r--. 1 root root 408 Nov 10 03:47 /root/.ssh/id_rsa.pub # 公钥
41+
```
42+
43+
2. 分发公钥到集群的各个节点:
44+
``` bash
45+
# 比如指定将公钥分发至 `192.168.10.11` `192.168.10.12` 两个节点
46+
$ declare -a IPS=(192.168.10.11 192.168.10.12)
47+
48+
# 遍历节点 IP 分发公钥,假设用户名为: root, 密码为: kubean
49+
$ for ip in ${IPS[@]}; do sshpass -p "kubean" ssh-copy-id -o StrictHostKeyChecking=no root@$ip; done
50+
```
51+
52+
## 使用私钥制作Secret
53+
54+
1. 通过 kubectl 命令可以生成私钥的 Secret:
55+
``` bash
56+
$ kubectl -n kubean-system \ # 指定命名空间 kubean-system
57+
create secret generic sample-ssh-auth \ # 指定 secret 名称为 sample-ssh-auth
58+
--type='kubernetes.io/ssh-auth' \ # 指定 secret 类型为 kubernetes.io/ssh-auth
59+
--from-file=ssh-privatekey=/root/.ssh/id_rsa \ # 指定 ssh 私钥文件路径
60+
--dry-run=client -o yaml > ssh_auth_sec.yaml # 指定 secret yaml 文件生成路径
61+
```
62+
63+
2. 生成的 Secret YAML 内容大致如下所示:
64+
``` yaml
65+
apiVersion: v1
66+
kind: Secret
67+
metadata:
68+
creationTimestamp: null
69+
name: sample-ssh-auth
70+
namespace: kubean-system
71+
type: kubernetes.io/ssh-auth
72+
data:
73+
ssh-privatekey: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBdWVDbC8rSng1b0RT...
74+
```
75+
76+
## 创建主机清单配置
77+
78+
示例:主机清单 hosts_conf_cm.yaml 内容大致如下:
79+
``` yaml
80+
apiVersion: v1
81+
kind: ConfigMap
82+
metadata:
83+
name: sample-hosts-conf
84+
namespace: kubean-system
85+
data:
86+
hosts.yml: |
87+
all:
88+
hosts:
89+
master:
90+
ip: 192.168.10.11
91+
access_ip: 192.168.10.11
92+
ansible_host: 192.168.10.11
93+
worker:
94+
ip: 192.168.10.12
95+
access_ip: 192.168.10.12
96+
ansible_host: 192.168.10.12
97+
children:
98+
kube_control_plane:
99+
hosts:
100+
master:
101+
kube_node:
102+
hosts:
103+
master:
104+
worker:
105+
etcd:
106+
hosts:
107+
master:
108+
k8s_cluster:
109+
children:
110+
kube_control_plane:
111+
kube_node:
112+
calico_rr:
113+
hosts: {}
114+
```
115+
116+
> 注: 由于采用私钥登录,所以主机信息中不需要填写用户名密码(即: ansible_user、ansible_password)
117+
118+
## 制备部署集群的配置参数
119+
120+
集群配置参数 vars_conf_cm.yaml 的内容,可以参考: [demo vars conf](../../artifacts/demo/vars-conf-cm.yml).
121+
``` yaml
122+
apiVersion: v1
123+
kind: ConfigMap
124+
metadata:
125+
name: sample-vars-conf
126+
namespace: kubean-system
127+
data:
128+
group_vars.yml: |
129+
container_manager: containerd
130+
kube_network_plugin: calico
131+
kube_network_plugin_multus: false
132+
kube_proxy_mode: iptables
133+
enable_nodelocaldns: false
134+
etcd_deployment_type: kubeadm
135+
ntp_enabled: true
136+
...
137+
```
138+
139+
## 准备KuBean的自定义资源
140+
141+
1. Cluster 自定义资源内容示例
142+
``` yaml
143+
apiVersion: kubean.io/v1alpha1
144+
kind: Cluster
145+
metadata:
146+
name: sample
147+
spec:
148+
hostsConfRef:
149+
namespace: kubean-system
150+
name: sample-hosts-conf
151+
varsConfRef:
152+
namespace: kubean-system
153+
name: sample-vars-conf
154+
sshAuthRef: # 关键属性,指定集群部署期间的 ssh 私钥 secret
155+
namespace: kubean-system
156+
name: sample-ssh-auth
157+
```
158+
159+
2. ClusterOperation 自定义资源内容示例
160+
``` yaml
161+
apiVersion: kubean.io/v1alpha1
162+
kind: ClusterOperation
163+
metadata:
164+
name: sample-create-cluster
165+
spec:
166+
cluster: sample
167+
image: ghcr.m.daocloud.io/kubean-io/spray-job:latest
168+
backoffLimit: 0
169+
actionType: playbook
170+
action: cluster.yml
171+
preHook:
172+
- actionType: playbook
173+
action: ping.yml
174+
- actionType: playbook
175+
action: disable-firewalld.yml
176+
postHook:
177+
- actionType: playbook
178+
action: kubeconfig.yml
179+
- actionType: playbook
180+
action: cluster-info.yml
181+
```
182+
183+
## 开始部署集群
184+
185+
假设我们的所有 yaml 清单都存放在 create_cluster 目录
186+
``` bash
187+
$ tree create_cluster/
188+
create_cluster
189+
├── hosts_conf_cm.yml # 主机清单
190+
├── ssh_auth_sec.yml # SSH私钥
191+
├── vars_conf_cm.yml # 集群参数
192+
├── kubeanCluster.yml # Cluster CR
193+
└── kubeanClusterOps.yml # ClusterOperation CR
194+
```
195+
196+
通过 kubectl apply 开始部署集群:
197+
``` bash
198+
$ kubectl apply -f create_cluster/
199+
```

0 commit comments

Comments
 (0)