【牧云】牧云(CloudWalker)主机安全管理平台集群版安装
集群版部署
一、部署环境检查
1.1 硬件配置表
按照不同带机量,需要满足以下硬件配置:
探针数量 | CPU | 内存 | 数据盘IO/空间 | 网络 | 所需节点数 |
---|---|---|---|---|---|
3k | 24 | 32 | 1w/500 G | 千兆 | 4 |
5k | 32 | 64 | 1w/500 G | 千兆 | 4 |
8k | 16 | 64 | 2w/800 G | 万兆 | 11 |
8k | 32 | 64 | 2w/800 G | 万兆 | 7 |
1w | 32 | 64 | 2w/1 T | 万兆 | 11 |
1.5w | 32 | 64 | 4w/1.5 T | 万兆 | 11 |
2w | 32 | 128 | 4w/2 T | 万兆 | 11 |
1.2 操作系统信息检查
序号 | 检查项 | 要求 | 建议 |
---|---|---|---|
1 | 操作系统 | Linux内核不能太老 | CentOS7.6+;Ubuntu20.04+ |
2 | 主机名 | 相互不冲突、没有特殊字符 | 只能包含:小写字母[a-z]、数字[0-9]、减号 - |
3 | 系统防火墙 | 停用 | 停用firewalld、ufw等系统防火墙 |
4 | selinux | 禁用 | 保持selinux 为disabled |
5 | DNS | 存在且可用 | 存在可用dns server的配置 |
6 | 时间同步 | 时区与时间是同步的 | 有NTP配置 |
7 | swap分区 | 禁用 | swapoff -a 关闭后再注释掉/etc/fstab对应行 |
8 | /var 空间 | 可用空间大于50G | 不单独挂载,根目录空间大于70G |
9 | 数据盘 | 挂载到/var/lib/rancher/k3s | 使用安装脚本自动挂载,与系统盘不在同一个设备 |
二、部署前准备
2.1、准备安装介质
安装包:
底座安装包 k3s-installer-v0.3.3-rc0.tgz
应⽤安装包 CW-C10-22.05.003-R7-Patch-2210251730.tgz
磁盘性能测试⼯具 run_fio_4k.sh
选择一台部署机(一般使用第一台,也就是master1)上传安装介质和工具,后续所有操作未做说明均在部署机上执行
安装包上传至:/root/installer(上传后核对 MD5 值)
2、部署节点检查
1. 安装 ansible
-
安装 ansible
- 方法一:在线安装
yum -y install ansible
- 方法二:离线安装
cd /root/installer tar zxvf k3s-installer-v0.3.3-rc0.tgz cd ansible/packages/centos7_amd64/ yum -y --skip-broken install *.rpm
-
确认 ansible 可用
[root@iZwz98w4s2a9nzexzl8qp4Z centos7_amd64]# which ansible ansible-playbook sshpass xfs_quota
/usr/bin/ansible
/usr/bin/ansible-playbook
/usr/bin/sshpass
/usr/sbin/xfs_quota
[root@iZwz98w4s2a9nzexzl8qp4Z centos7_amd64]#
- 编写集群节点清单
[all:vars]
ansible_user=root
ansible_password=root密码
[dephost]
172.30.207.105 name=test-01
[nodes]
172.30.207.102 name=test-02
172.30.207.103 name=test-03
172.30.207.104 name=test-04
创建节点清单 /root/inventory.txt,格式如下, name 为节点的主机名,需要所有节点唯⼀部署机需要写在 [dephost] ,其他节点写在 [nodes]
-
关闭主机key检查
- 方法一:
export ANSIBLE_HOST_KEY_CHECKING=False ; echo "export ANSIBLE_HOST_KEY_CHECKING=False" >> /root/.bashrc
- 方法二: 修改/etc/ansible/ansible.cfg文件,取消注释host_key_checking参数,
# uncomment this to disable SSH key host checking host_key_checking = False
-
测试ansible是否可以执行命令
[root@iZwz98w4s2a9nzexzl8qp4Z ~]# ansible -i /root/inventory.txt all -m shell -a "hostname"
172.30.207.105 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp4Z
172.30.207.104 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp6Z
172.30.207.103 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp5Z
172.30.207.102 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp7Z
- 重启节点
[root@iZwz98w4s2a9nzexzl8qp4Z ~]# ansible -i /root/inventory.txt nodes -m shell -a reboot
172.30.207.104 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Shared connection to 172.30.207.104 closed.",
"unreachable": true
}
172.30.207.103 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Shared connection to 172.30.207.103 closed.",
"unreachable": true
}
172.30.207.102 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Shared connection to 172.30.207.102 closed.",
"unreachable": true
}
[root@iZwz98w4s2a9nzexzl8qp4Z ~]#
[root@iZwz98w4s2a9nzexzl8qp4Z ~]# reboot
重启节点避免一些临时配置导致后续使用中出现问题
注:此操作需要先与客户确认后在操作
重启后在执行命令查看各节点是否可达
[root@iZwz98w4s2a9nzexzl8qp4Z ~]# ansible -i /root/inventory.txt all -m shell -a "hostname"
172.30.207.101 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp4Z
172.30.207.104 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp6Z
172.30.207.102 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp7Z
172.30.207.103 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp5Z
- 推送免密登录 生成密钥
[root@iZwz98w4s2a9nzexzl8qp4Z ~]# ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519.
Your public key has been saved in /root/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:eQ374U/F7ghsMt5ph6HfzVoLgMN6ZzjpRtiX8CxQ2l8 root@iZwz98w4s2a9nzexzl8qp4Z
The key's randomart image is:
+--[ED25519 256]--+
| |
| . |
| + . |
| o.+.+ E . |
| S+B.= o|
| ..=+Xo. o |
| ..==+*+. o|
| oo==o*o*.|
| ...o+.=o+|
+----[SHA256]-----+
[root@iZwz98w4s2a9nzexzl8qp4Z ~]# ansible -i /root/inventory.txt all -m shell -a "echo '$(cat /root/.ssh/id_ed25519.pub)' >> /root/.ssh/authorized_keys"
172.30.207.101 | CHANGED | rc=0 >>
172.30.207.104 | CHANGED | rc=0 >>
172.30.207.103 | CHANGED | rc=0 >>
172.30.207.102 | CHANGED | rc=0 >>
[root@iZwz98w4s2a9nzexzl8qp4Z ~]#
- 验证免密登录 删除或注释掉 inventory.txt 内的 ansible_password
# inventory.txt
[all:vars]
ansible_user=root
# ansible_password=root密码
尝试执行命令
[root@iZwz98w4s2a9nzexzl8qp4Z ~]# ansible -i /root/inventory.txt all -m shell -a "hostname"
172.30.207.104 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp6Z
172.30.207.101 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp4Z
172.30.207.102 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp7Z
172.30.207.103 | CHANGED | rc=0 >>
iZwz98w4s2a9nzexzl8qp5Z
如果可以正常执⾏命令,说明信任关系配置完成。
2.磁盘性能测试
-
安装 fio
- 方法一:在线安装 fio
ansible -i /root/inventory.txt all -m shell -a "yum -y install fio"
- 方法二:离线安装 fio
[root@iZwz9cu8gh0lsteean9j4nZ ~]# ansible -i /root/inventory.txt all -m copy -a "src=/root/installer/ansible/artifacts/bin/amd64/fio dest=/usr/bin/fio mode=0755 backup=yes"
-
下发测试脚本
ansible -i /root/inventory.txt all -m copy -a "src=/root/utils/run_fio_4k.sh dest=/root/run_fio.sh mode=0755"
-
执行测试脚本 注:如果没有数据盘,在测试磁盘io的时候一定不要使用整盘测试
- 方法一:整盘测试
ansible -i /root/inventory.txt all -m shell -a "/root/run_fio.sh /dev/vdb fio-output"
- 方法二:创建文件测试
ansible -i /root/inventory.txt all -m shell -a "fallocate -l 1G /tmp/iotest.tmp" ansible -i /root/inventory.txt all -m shell -a "/root/run_fio.sh /tmp/iotest.tmp fio-output"
-
等待命令执行完毕后查看结果(约 3-4 分钟),确保 avg 的值满足硬件配置需求
[root@iZwz9cu8gh0lsteean9j4nZ ~]# ansible -i /root/inventory.txt all -m shell -a "chdir=/root/fio-output grep iops *write.4K.*"
172.30.207.105 | CHANGED | rc=0 >>
fio.randwrite.4K.1.log: iops : min= 6698, max=10260, avg=6858.58, stdev=451.04, samples=59
fio.write.4K.1.log: iops : min= 6698, max=21506, avg=7052.58, stdev=1914.29, samples=59
172.30.207.104 | CHANGED | rc=0 >>
fio.randwrite.4K.1.log: iops : min=51506, max=55210, avg=53751.02, stdev=855.01, samples=59
fio.write.4K.1.log: iops : min=39330, max=43388, avg=41594.17, stdev=1092.63, samples=59
172.30.207.102 | CHANGED | rc=0 >>
fio.randwrite.4K.1.log: iops : min=51842, max=55388, avg=53506.27, stdev=879.61, samples=59
fio.write.4K.1.log: iops : min=36934, max=43238, avg=40478.54, stdev=1265.71, samples=59
172.30.207.103 | CHANGED | rc=0 >>
fio.randwrite.4K.1.log: iops : min=46868, max=50696, avg=49368.07, stdev=867.01, samples=59
fio.write.4K.1.log: iops : min=32286, max=37418, avg=35552.95, stdev=951.33, samples=59
注:如果是⽣产环境,必须确保磁盘性能测试通过,才可以开始下⾯的部署
3.节点配置(此操作会重启节点)
- 进入 predeploy 目录
[root@iZwz9cu8gh0lsteean9j4nZ ~]# cd /root/utils/cluster
[root@iZwz9cu8gh0lsteean9j4nZ utils]# cd predeploy
- 执行配置脚本(如果没有 nslookup 命令会执行失败,需要先安装 bind-utils,四台都需要安装)
[root@iZwz9cu8gh0lsteean9j4nZ predeploy]# ansible-playbook -i /root/inventory.txt predeploy-configure.yaml
三、集群版部署
1、编写default.ini文件
- 进入 installer 目录
[root@iZwz9cu8gh0lsteean9j4nZ ~]# cd /root/installer/
[root@iZwz9cu8gh0lsteean9j4nZ ~]# tar -zxvf k3s-installer-v0.3.3-rc0.tgz
# 如果之前是离线安装的 ansible 解压这一步就不用执行了
[root@iZwz9cu8gh0lsteean9j4nZ ~]# cd /root/installer/ansible/inventory
[root@iZwz9cu8gh0lsteean9j4nZ inventory]# cp default.ini.example default.ini
- 编写default.ini
vim default.ini
# 下面的语法:
# <ip>
[master]
# master 控制平面
# 应当为奇数个,一个也可以,但是无法实现高可用,除了研发用途之外建议至少使用三台节点,但也不建议太多,会有性能影响。
172.30.207.105 public_ip=x.x.x.x
172.30.207.102 public_ip=x.x.x.x
172.30.207.103 public_ip=x.x.x.x
[worker]
# worker
# 可以为任意数量,一般为申请的机器除去 master 之外的所有机器,如果没有额外的机器,则可以直接不写内容
# 比如
# 192.168.0.4 public_ip=192.168.0.4
# 192.168.0.5 public_ip=192.168.0.5
172.30.207.104 public_ip=x.x.x.x
[all:vars]
# 全局变量
# 这里会有一些全局变量,其中的一些可以控制 k3s installer 的安装行为。
# 全局变量的默认值在 roles/defaults/defaults/main.yml 中定义。
# ansible_user 为 ssh 登陆需要的用户名
ansible_user=root
# 是否自动挂载数据盘
k3s_installer_do_disk_probe = true
# 自动挂载数据盘大小下限
# k3s_installer_disk_probe_limit = 10G
# 可尝试挂载的设备
# k3s_installer_disk_probe_devices = ["sdb","vdb","sdc","vdc"]
# 挂载点
# k3s_installer_mount_point = /var/lib/rancher/k3s
# 是否要求挂载数据盘
k3s_installer_require_mount = true
# 是否检查数据盘启用 XFS Project Quota
k3s_installer_do_quota_check = true
# change_hostname 为 true 的时候,将会修改节点的 hostname
# 采用 k3s-<role>-<index> 的形式命名 默认值为 true 如果没有特别需要,可以不做修改
k3s_installer_change_hostname = true
# k3s_rancher_hostname 指定安装完成后用什么域名来访问 rancher 的控制面板。当修改这项配置时,请确保配置了对应的 DNS ,将对应的 DNS 指向集群中所有或部分>节点的 IP
# k3s_rancher_hostname = rancher.custom.tld
# master 节点上额外的 k3s 配置
extra_k3s_master_config = 'kube-apiserver-arg: "service-node-port-range=20000-50052"'
# 所有节点上额外的 k3s 配置
extra_k3s_config = ""
[master]:如果节点数量小于等于 9 则写前三个节点,节点数量大于 9 可以写前五个节点
如果有公网 ip 的话 public_ip 就写公网 ip ,没有的话就写内网 ip
[all:vars]:设置安装的一些配置项
ansible_user=ubuntu
用于登录的用户名,需根据实际情况修改
k3s_installer_change_hostname
设置为 true 会自动更改主机 hostname
k3s_rancher_hostname
rancher 管理面板的域名,默认值为 <master的ip>.nip.io。如果客户环境允许的话可以找客户申请一个域名并指向所有 IP 作为管理界面的域名。
修改extra_k3s_master_config的值为
extra_k3s_master_config = 'kube-apiserver-arg: "service-node-port-range=20000-50052"'
- 挂载磁盘
-
a.自动挂载
在编写default.ini的时候将以下参数设置为 true,并确保数据盘大于 10G 且未被挂载 k3s_installer_do_disk_probe k3s_installer_require_mount 如果要使用 quota 功能(可以限制单个 PV 大小防止硬盘被打满),建议把 k3s_installer_do_quota_check 设置为 true。 如果使用自动挂载,滑板车会把数据盘格式化为 xfs 分区格式,并启用 quota。
-
b.手动挂载(可以使用 ansible 命令统一执行,ansible -i /root/installer/ansible/inventory/default.ini all -m shell -a “$cmd”)
# 创建物理卷 pvcreate /dev/vdb -ff # 创建名为 cloudwalker_k3s 的卷组 vgcreate cloudwalker_k3s /dev/vdb # 在物理卷上创建名为 var_lib_rancher_k3s_storage 大小为 1TB 的逻辑卷并加入 cloudwalker_k3s 卷组,1024G 可以根据实际情况调整。 lvcreate -L 1024G --name var_lib_rancher_k3s_storage cloudwalker_k3s /dev/vdb # 将该逻辑卷格式化为 xfs 分区 mkfs.xfs /dev/cloudwalker_k3s/var_lib_rancher_k3s_storage mkdir -p /var/lib/rancher/k3s # 使用 prjquota option 挂载分区 mount -o prjquota /dev/cloudwalker_k3s/var_lib_rancher_k3s_storage /var/lib/rancher/k3s # 写 fstab,启动时自动挂载 echo "/dev/mapper/cloudwalker_k3s-var_lib_rancher_k3s_storage /var/lib/rancher/k3s xfs rw,prjquota 0 2" >> /etc/fstab
-
2、安装 k3s 底座
- 执行如下命令进行安装
- 如果是ubuntu系统需要先执行下 export PYTHONPATH=/usr/lib/python3/dist-packages
/root/installer/ansible/install.sh
- 脚本运行过程中会首先检查当前的配置和环境是否正确。检查无误后,会进行安装流程。视 IO 水平不等,安装脚本需要 10 - 20 分钟完成。
- 执行如下命令查看安装是否正常
[root@iZwz9cu8gh0lsteean9j4nZ ansible]# kubectl get node
NAME STATUS ROLES AGE VERSION
k3s-master-1 Ready control-plane,etcd,master 7m1s v1.21.4+k3s1
k3s-master-2 Ready control-plane,etcd,master 6m2s v1.21.4+k3s1
k3s-master-3 Ready control-plane,etcd,master 5m47s v1.21.4+k3s1
k3s-worker-1 Ready worker 5m4s v1.21.4+k3s1
3、安装牧云
- 解压安装包
[root@k3s-master-1 ~]# cd /root/installer/
[root@k3s-master-1 installer]# tar -zxvf CW-C10-22.05.003-R7-Patch-2210251730.tgz
- 进解压目录进行安装
[root@k3s-master-1 installer]# cd package/
**进入package目录后, 可运行 submit.sh 安装牧云,需要在安装时指定平台对外使用的hostname,生成证书,下文以平台对外域名是 cloudwalker.chaitin.cn 为例, 如果没有域名使用IP,这里填写IP。首次安装可使用 custom-values、custom-secret-values 参照下文自定义配置。 **server.ingress记得修改
安装命令示例
yes | ./submit.sh . -- --set server.ingress=cloudwalker.chaitin.cn --set presets="NodePort50051" # 使用牧云版界面
yes | ./submit.sh . -- --set server.ingress=cloudwalker.chaitin.cn --set presets="NodePort50051\,PullPolicyAlways" # 使用牧云版界面、总是拉取镜像
注:加 yes 是为了避免错过输入 y 的那一步导致安装失败
目前支持的预设有
PullPolicyAlways
选择是否总是拉取镜像。适用于需要手动替换镜像或者相同 tag 镜像更新版本的测试环境,可能拖慢集群启动速度或者导致集群故障时难以恢复,不建议在生产环境启用。
NodePort50051
选择是否使用 50051 而非 30051 作为探针通信端口。
ExclusiveDB
选择是否让 Postgres 数据库实例部署在独立的服务器上,具体操作见 可选操作:Postgres 独占部署并开启巨页。