抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Kubernetes 是一个开源的容器编排引擎,可用来对容器化应用进行自动化部署、扩缩和管理。本文将会描述如何搭建一个可用于生产环境的高可用集群。

若第一次接触 k8s,建议看完 k8s - 快速入门 再查看此文。

一、准备外部数据库

需要准备一台数据库服务器,例如购买服务器并搭建好 PostgreSQL、MySQL 等数据库。

1
2
3
4
# pg url
postgres://username:password@hostname:5432/database-name
# mysql url
mysql://username:password@tcp(hostname:3306)/database-name

二、部署 Server 节点

执行命令即可,需要注意的是高可用集群节点选举较慢,若 kubectl get nodes 查不到任何资源,可以等待一段时间再试试。

1
2
3
4
5
6
7
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server \
--disable="traefik" \
--embedded-registry \
--cluster-cidr="10.0.0.0/8" \
--service-cidr="172.16.0.0/12" \
--cluster-dns="172.16.0.10" \
--datastore-endpoint="postgres://username:password@hostname:5432/database-name"
  • –disable=traefik
    禁用默认traefik控制器
  • –embedded-registry
    启动集群内部镜像共享
  • –cluster-cidr
    增加集群 CIDR 的子网大小,以免耗尽 Pod 的 IP 空间
  • –cluster-domain
    集群域名,默认cluster.local,内部pod可以通过..svc.cluster.local相互访问
  • –datastore-endpoint
    指定外部数据库,高可用必须,本地测试这行可忽略
    也可改为 mysql://username:password@tcp(hostname:3306)/database-name
    更多内容可关注官方文档:https://docs.k3s.io/zh/quick-start

三、添加更多 Server 节点

只需要末尾多出指定 K3S_TOKEN 即可
K3S_TOKEN 使用的值存储在 Server 节点上的 /var/lib/rancher/k3s/server/token 中,可使用 cat 查看。

1
2
3
4
5
6
7
8
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server \
--disable="traefik" \
--embedded-registry \
--cluster-cidr="10.0.0.0/8" \
--service-cidr="172.16.0.0/12" \
--cluster-dns="172.16.0.10" \
--datastore-endpoint="postgres://username:password@hostname:5432/database-name" \
--token=K3S_TOKEN

四、添加 Agent 节点 (可选)

K3s Server 节点默认是可调度的,所以 HA K3s 集群不需要 Agent 节点。

但是你仍然想用使用专门的 Agent 节点来运行应用程序和服务的话,可以根据 k3s.io/添加Agent节点 进行操作,本文不再赘述。

五. 查看节点

1
2
3
4
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 24h v1.29.6+k3s2
node2 Ready control-plane,master 23h v1.29.6+k3s2

六、Deployment 资源限制

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
apiVersion: v1
kind: Namespace
metadata:
name: whoami
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
namespace: whoami
labels:
app: whoami
spec:
replicas: 3 # 运行3个实例
revisionHistoryLimit: 1
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami:latest
resources: # 资源限制
requests:
cpu: 10m
memory: 6Mi
limits:
cpu: 100m
memory: 64Mi
env: # 环境变量
- name: A
value: theAValue
- name: B
value: theBValue
imagePullPolicy: Always
ports:
- name: whoami-port
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami
namespace: whoami
spec:
ports:
- name: whoami-port
port: 80
targetPort: whoami-port
selector:
app: whoami

七、动态扩缩容

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
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: whoami-autoscaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: whoami # 指定名称,与部署应用绑定
minReplicas: 1 # 最小
maxReplicas: 10 # 最大
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 500 # cpu 达到 50%
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 700 # 内存使用率达到 70%
behavior: # 扩缩容间隔60秒
scaleDown:
policies:
- type: Pods
value: 1
periodSeconds: 60
scaleUp:
policies:
- type: Pods
value: 1
periodSeconds: 60

八、ConfigMap 详解

当有些配置文件需要挂载给容器,我们就可以直接借助 ConfigMap 定义并挂载

定义 configmap.yml

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: ConfigMap
metadata:
name: whoami-config-map
data:
cfg-key: |-
这是文件第一行内容
这是文件第二行内容
cfg2-key: |-
一个ConfigMap可以有多对key-value

绑定

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
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
namespace: whoami
labels:
app: whoami
spec:
replicas: 3 # 运行3个实例
revisionHistoryLimit: 1
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami:latest
imagePullPolicy: Always
ports:
- name: whoami-port
containerPort: 80
volumeMounts:
- name: volume-a # 通过name锁定volume
mountPath: /etc/cfg.yml
subPath: ./etc/cfg.yml
volumes:
- name: volume-a # 暴露一个name
configMap:
name: whoami-config-map # 通过name锁定configMap
items:
- key: cfg-key # 通过key取值
path: ./etc/cfg.yml

评论