MacOS搭建K3s集群

1. 背景

近期计划学习K8s的相关知识,需要在本地进行各类型的实验,因此便有了此篇文章用于记录下在MacOS本地搭建起一套K3s集群环境

K3s 是轻量级的 Kubernetes,易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 100 MB 的二进制文件中,其安装在Windows与MacOS中都需要借助虚拟机来实现,经过了解,找到了一款同样十分轻量化,上手简单的虚拟机工具Multipass,后续将会基于该工具在本地创建出三个VM实例,操作系统为Ubuntu,基于此来搭建出本地K3s集群环境

为什么叫 K3s?

官方希望安装的 Kubernetes 只占用一半的内存,Kubernetes 是一个 10 个字母的单词,简写为 K8s,Kubernetes 的一半就是一个 5 个字母的单词,因此简写为 K3s,它没有全称,也没有官方的发音

2. 安装

a. Multipass

Multipass的安装方式有多种,本文采用的是官方提供的PKG包进行安装,下载路径为:https://multipass.run/

安装完成后,可以通过命令行工具进行调用,或通过顶部菜单栏进行使用:

  • 菜单栏

multipass-menu-bar-demo

  • 命令行
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
$ multipass help
Usage: multipass [options] <command>
Create, control and connect to Ubuntu instances.

This is a command line utility for multipass, a
service that manages Ubuntu instances.

Options:
-h, --help Displays help on commandline options
-v, --verbose Increase logging verbosity. Repeat the 'v' in the short option
for more detail. Maximum verbosity is obtained with 4 (or more)
v's, i.e. -vvvv.

Available commands:
alias Create an alias
aliases List available aliases
authenticate Authenticate client
delete Delete instances
exec Run a command on an instance
find Display available images to create instances from
get Get a configuration setting
help Display help about a command
info Display information about instances
launch Create and start an Ubuntu instance
list List all available instances
mount Mount a local directory in the instance
networks List available network interfaces
purge Purge all deleted instances permanently
recover Recover deleted instances
restart Restart instances
set Set a configuration setting
shell Open a shell on a running instance
start Start instances
stop Stop running instances
suspend Suspend running instances
transfer Transfer files between the host and instances
umount Unmount a directory from an instance
unalias Remove aliases
version Show version details

Tips: 可以前往Multipass官网查阅相关的文档以便更快上手

完成Multipass的安装后,通过以下命令创建三台Ubuntu虚拟机:

1
2
3
$ multipass launch --name vm1 --memory 2G --disk 10G --cpus 1
$ multipass launch --name vm2 --memory 2G --disk 10G --cpus 1
$ multipass launch --name vm3 --memory 2G --disk 10G --cpus 1

完成VM的创建后,可通过multipass list命令进行确认:

1
2
3
4
5
$ multipass list
Name State IPv4 Image
vm1 Running 192.168.64.7 Ubuntu 22.04 LTS
vm2 Running 192.168.64.8 Ubuntu 22.04 LTS
vm3 Running 192.168.64.9 Ubuntu 22.04 LTS

b. K3s

完成以上Multipass的初始化后,可以通过multipass shell <instance-name>命令分别进入三台虚拟机,随后进行K3s的安装

Tips: 因为需要同时操作三台VM,因此这里可能涉及到多终端同时输入,本文采用的命令行工具是iTerm2,多终端同时输入的快捷键是Command + Shift + I

进入三台虚拟机后,键入以下命令来完成K3s的安装(也可参考K3s官网说明进行安装):

1
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

安装完成后,界面如下所示:

k3s-install-completed

在K3s中,集群中的节点通常存在着两种不同的类型:k3s Agent节点和k3s Server节点

  • Server 节点指的是运行 k3s server 命令的主机,control plane 和数据存储组件由 K3s 管理
  • Agent 节点指的是运行 k3s agent 命令的主机,不具有任何数据存储或 control plane 组件

arch

本文将vm1虚拟机做为server节点,vm2vm3共同作为agent节点,因此在下一步过程中,将对vm1进行server节点的初始化工作

切换至vm1的命令行中,输入以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo systemctl stop k3s
# 进入home目录
$ cd ~
# 创建.kube目录
$ mkdir .kube
# 复制配置文件
$ sudo cp /etc/rancher/k3s/k3s.yaml .kube/config
# 变更文件所有权为当前用户
$ sudo chown $(id -u):$(id -g) .kube/config


# 将以上命令压缩为一行命令
$ sudo systemctl stop k3s && cd ~ && mkdir .kube && sudo cp /etc/rancher/k3s/k3s.yaml .kube/config && sudo chown $(id -u):$(id -g) .kube/config

完成以上操作后,将k3s服务的默认加载配置路径进行修改,可通过sudo systemctl status k3s获取k3s的服务文件,如下所示:

k3s-service-status

获取到该文件路径后,通过sudo vim /etc/systemd/system/k3s.service 进行编辑,在末尾处追加以下内容:

1
2
--write-kubeconfig=/home/ubuntu/.kube/config \
--write-kubeconfig-mode=644 \

k3s-service-config

完成以上配置后,k3s在启动时便能够加载对应路径下的配置文件,随后通过以下命令对k3s进行重启:

1
2
$ sudo systemctl daemon-reload
$ sudo systemctl start k3s

启动k3s后,通过以下命令进行检查:

1
2
3
$ kubectl get node
NAME STATUS ROLES AGE VERSION
vm1 Ready control-plane,master 18m v1.28.5+k3s1

至此,server节点已初始化完成,后续操作将vm2vm3注册在vm1下作为agent节点,因此在vm2vm3 中通过sudo systemctl stop k3s先将k3s服务进行关停,随后通过以下命令在vm1中获取K3S_TOKEN

Tips: K3S_TOKEN 值存储在 Server 节点上的 /var/lib/rancher/k3s/server/node-token

1
2
$ sudo cat /var/lib/rancher/k3s/server/node-token
K10a86f0268880065de69856bbf9638024a8183e859843abd1aab0a675d58866fc8::server:af1f404587982ca51910c3f8241d3eab

通过以上K3S_TOKEN,拼接生成以下命令并分别在vm2vm3中执行,其中vm1的IP地址可通过multipass list进行查看:

1
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://<vm1的IP地址>:6443 K3S_TOKEN=<上述获取到的K3s Token> sh -

执行完成后,切换至vm1执行以下命令检查节点信息是否已存在:

1
2
3
4
5
$ kubectl get node
NAME STATUS ROLES AGE VERSION
vm1 Ready control-plane,master 47m v1.28.5+k3s1
vm2 Ready <none> 2m15s v1.28.5+k3s1
vm3 Ready <none> 2m9s v1.28.5+k3s1

至此,K3s Cluster已搭建完成,但后续如果希望在宿主机的MacOS中来控制这个K3s集群,则还需要进行以下操作进行配置

首先在宿主机中安装kubectl工具,然后在用户路径下同样创建~/.kube目录,并将vm1中的~/.kube/config文件拷贝至宿主机的~/.kube/目录下,如下所示:

Tips: 涉及到虚拟机文件传输,multipass已经提供了对应的命令multipass transfer命令,可通过官网示例进行学习

1
2
3
4
5
6
# 安装kubectl
$ brew install kubectl
# 创建~/.kube目录 
$ cd ~ && mkdir .kube
# 拷贝vm1中的~/.kube/config文件
$ multipass transfer vm1:/home/ubuntu/.kube/config ~/.kube/

随后替换配置文件中的server对应master节点的IP地址,如下所示:

Tips: 涉及到虚拟机的IP地址,可通过 multipass list进行查看

nacos-demo

变更完成后,通过本地以下命令确认宿主机是否已成功接入K3s集群:

1
2
3
4
5
$ kubectl get node
NAME STATUS ROLES AGE VERSION
vm2 Ready <none> 14m v1.28.5+k3s1
vm3 Ready <none> 14m v1.28.5+k3s1
vm1 Ready control-plane,master 59m v1.28.5+k3s1

至此,MacOS搭建本地K3s集群完成

Tips: 受中国GFW影响,可能会出现multipass创建的虚拟机网络流量不从宿主机的VPN流出,可参考multipass VM unable to access the internet if host machine connected to an openVPN connection进行解决

3. 部署

在完成了以上本地K3s集群搭建后,通过在集群部署MySQL来验证整体集群环境的可行性,由于近期学习了Nacos,此处便以搭建Nacos的MySQL存储容器为目标,后续所使用的命名空间均为nacos,因此可以通过kubectl create ns nacos对该命名空间进行初始化(nsnamespace的缩写)

a. PersistentVolumeClaim

首先创建以下持久化存储卷mysql-pvc.yaml

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: nacos
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

完成以上文件创建后,通过kubectl -f mysql-pvc.yaml对该组件进行初始化

PVC的全称是Persistent Volume Claim,是Kubernetes中的一种资源对象,用于声明对持久性存储的需求,允许Pod来访问特定位置下的资源,并对该位置进行读写操作,通过PVC组件,可以很好地将存储资源与应用程序进行解耦

PVC组件包含以下属性:

  • accessModes:定义了Pod如何访问持久存储,常用的访问方式包含以下:
    • ReadWriteOnce:单个节点读写
    • ReadOnlyMany:多个节点只读
    • ReadWriteMany:多个节点读写
  • resources.request.storage:定义了PVC所需要的存储容量
  • volumeMode:指定了PVC的存储模式,可以是 Filesystem(文件系统)或 Block(块设备)

什么是块设备?

块设备是计算机领域用于存储数据的设备,它以固定大小的块为单位进行读写,一些常见的块设备为:HDD、SSD和光碟,使用块设备模式可以使得应用程序直接使用底层硬件设备而不是文件系统,这对于某些数据库系统是有性能提升的,因为某些数据库系统有自身的数据管理机制,使用块设备可以提供底层更直接的访问方式,满足特定的性能需求(如Oracle 数据库可以使用 Raw Devices,即未经过文件系统格式化的块设备,以提供更直接的数据访问方式)

b. Deployment & ConfigMap

完成以上存储卷的创建后,再根据以下通过命令kubectl apply -f mysql-deployment.yaml来初始化mysql-deployment.yaml,如下所示:

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: nacos
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0.31
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-initdb
mountPath: /docker-entrypoint-initdb.d
- name: mysql-data
mountPath: /var/lib/mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "root"
- name: MYSQL_USER
value: "nacos"
- name: MYSQL_PASSWORD
value: "nacos"
- name: MYSQL_DATABASE
value: "nacos"
volumes:
- name: mysql-initdb
configMap:
name: mysql-initdb-config
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-initdb-config
namespace: nacos
data:
initdb.sql: |
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/******************************************/
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',
`c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',
`effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述',
`type` varchar(64) DEFAULT NULL COMMENT '配置的类型',
`c_schema` text COMMENT '配置的模式',
`encrypted_data_key` text NOT NULL COMMENT '密钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
`content` longtext NOT NULL COMMENT '内容',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL COMMENT '密钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识',
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (
`id` bigint(20) unsigned NOT NULL COMMENT 'id',
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`op_type` char(10) DEFAULT NULL COMMENT 'operation type',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL COMMENT '密钥',
PRIMARY KEY (`nid`),
KEY `idx_gmt_create` (`gmt_create`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


/******************************************/
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


CREATE TABLE `tenant_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`kp` varchar(128) NOT NULL COMMENT 'kp',
`tenant_id` varchar(128) default '' COMMENT 'tenant_id',
`tenant_name` varchar(128) default '' COMMENT 'tenant_name',
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE `users` (
`username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',
`password` varchar(500) NOT NULL COMMENT 'password',
`enabled` boolean NOT NULL COMMENT 'enabled'
);

CREATE TABLE `roles` (
`username` varchar(50) NOT NULL COMMENT 'username',
`role` varchar(50) NOT NULL COMMENT 'role',
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL COMMENT 'role',
`resource` varchar(128) NOT NULL COMMENT 'resource',
`action` varchar(8) NOT NULL COMMENT 'action',
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

以上文件通过间隔符---区分为2个部分,其中第一个部分为Deployment组件,Deployment是Kubernetes中的一种控制器(Controller),用于声明式地管理Pod的更新和部署,提供了一种便捷的方式来管理、定义、创建、升级以及扩展程序的副本集,声明式的意思在于开发者只需要关心如何定义应用程序,而无需关心应用程序是如何实现一个稳定状态的,同时允许DeploymentPod资源进行动态伸缩,指定集群中有关Pod的数量,并且可以进行滚动更新,而当Pod遇到故障或崩溃时,会自动新起一个全新的Pod

以上Deployment声明中,涉及到了以下几个核心的属性:

  • spec.template.spec.containers:指定了要运行容器名称、使用的镜像、端口、存储卷挂载以及环境变量

  • spec.template.spec.volumes:指定了容器所需要使用的存储卷集合,其中containers中所进行挂载的参数volumeMounts对应的name为此处所定义的存储卷的名称相对应,然而此处涉及到了两个卷,一个是名为 mysql-initdb 的 ConfigMap 卷,另一个是名为 mysql-data 的持久卷声明(PVC)

    • mysql-initdb:通过 ConfigMap 挂载到容器中,用于提供初始化 MySQL 数据库的 SQL 脚本

    • mysql-data:通过 PVC 挂载到容器中,用于持久化存储 MySQL 数据

直接定义Pod和定义Deployment有什么区别?

直接定义Pod时,需要手动来管理Pod的数量,以及它们的健康状态包括故障时的对应措施,同时在涉及到升级时,对应Pod也需要手动进行变更,而使用Deployment则可以很好地通过声明式来解决以上问题,Pod组件也没有版本历史记录,一旦出现需要回滚的故障时,就无法像Deployment一样灵活地进行回滚

简而言之,Deployment抽象并且减轻了Pod的概念和管理,使得开发者需要关注的地方更加的少了,相当于是做了一层抽象

第二个部分则为ConfigMap组件,正常情况下,ConfigMap用于存储应用程序相关的配置项,而后应用程序可以通过读取ConfigMap组件来获取对应的配置项,以达到解耦的效果,此处利用ConfigMap存储Nacos相关的初始化SQL(ConfigMap组件的一大优势在于改变其中的数据时,会触发对应Pod容器来重新加载配置已达到热更新的效果)

c. Service

完成以上组件的创建后,最后一步则是将以上MySQL暴露为服务,也就是Service组件,通过kubectl apply -f mysql-service.yaml进行创建,mysql-service.yaml如下所示:

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: nacos
spec:
ports:
- port: 3306
selector:
app: mysql

其中 spec.ports.port 字段用于指定 Service 暴露的端口号,以便其他应用程序能够通过3306端口连接到这个MySQL

本地可通过kubectl get pods -n nacos来确认该服务的状态:

1
2
3
$ kubectl get pods -n nacos
NAME READY STATUS RESTARTS AGE
mysql-58c97fb64c-tpk6r 1/1 Running 0 31h

如果需要在本地连接该服务,则可kubectl port-forward -n nacos service/mysql 33306:3306将本地的33306端口转发至该服务的3306端口,随后本地可通过DB工具进行连接

至此,Nacos所需要的MySQL搭建完成,详细的Nacos高可用K8s版本可前往https://github.com/nacos-group/nacos-k8s进行查阅