使用须知:
● 请务必检查制作镜像ECS机器的上是否安装好与当前操作系统版本对应的依赖。
● 在镜像制作完成后,ECS不会删除,需要用户自行删除。
● 私有镜像安装包包含了安装工作节点需要的脚本以及依赖组件,该包的版本会跟 着集群版本变更。
操作步骤:
步骤1 镜像制作前需要创建一台ECS。建议:ECS的规格4U8G。
说明
● 如果需要使用镜像文件来制作私有镜像,请参考附录。
● 镜像制作时间大约在10分钟左右,这将产生一定的流量和资源消费。
● ECS新增的安全组入方向规则需要确保TCP:22端口开放。
● 为共池裸机准备镜像时,镜像的启动方式需使用UEFI。
步骤2 私有镜像的创建依赖lvm2、conntrack、sudo、NetworkManager、haveged、ntp、
numactl、ipset、auditd组件,请务必检查制作镜像ECS机器的上是否安装好与当前操 作系统版本对应的依赖。
eg: yum install lvm2 conntrack sudo NetworkManager haveged ntp numactl ipset audit -y;
若yum install haveged 提示 no package,可尝试执行下面步骤:
yum install epel-release -y;
yum install haveged -y;
检查卸载不必要依赖:network-hotplug
eg:rpm -e network-hotplug
通过systemctl status auditd 查看auditd是否存在且正常,若存在基础镜像要求auditd 服务能够正常运行,可通过systemctl status auditd 查看,部分场景下selinx开启会导 致auditd无法运行,可以尝试关闭selinux。 (vim /etc/selinux/config修改SELINUX值 为:disabled,关闭SELINUX;检查是否存在/var/log/audit目录,若不存在需要创 建。重启节点后生效。);若不存在auditd服务需要安装此服务。
步骤3 OS的启动配置文件grub.cfg中设置“iommu=pt intel_iommu=on”。
- UEFI启动方式下,OS的启动配置文件路径在:/boot/efi/EFI/euleros/grub.cfg grub.cfg的配置参考下图:
步骤4 清理临时文件。
1. 执行下面命令,清理用户登录记录。
echo > /var/log/wtmp echo > /var/log/btmp
2. 执行下面命令,清理相应目录下的临时文件。
rm -rf /var/log/cloud-init*
rm -rf /var/lib/cloud/*
rm -rf /var/log/network-config.log 3. 执行下面命令,清理残留配置信息。
Euler操作系统:查看“/etc/sysconfig/network-scripts/”文件夹下有哪些以
“ifcfg”开头的文件,删除除了“ifcfg-lo”以外的以“ifcfg”开头的文件。
查看文件命令:ll /etc/sysconfig/network-scripts/
删除文件命令:rm -rf /etc/sysconfig/network-scripts/ifcfgxxx 4. 执行下面命令清除历史操作记录。
history -w;echo > /root/.bash_history;history -c;history -c;history -c;
步骤5 关闭虚拟机,创建私有镜像。
步骤6 给“镜像服务 IMS”提交工单,申请给私有镜像打上
“__support_c6_22xl_physical=true”的标签(注:开头是两个下划线),并提供私有 镜像的镜像ID。
步骤7 镜像创建完成后,使用该镜像作为工作节点的镜像进行验证操作。
----结束
附录
使用镜像文件来创建私有镜像时,才需执行此操作。请参照如下步骤执行:
步骤1 从可信的华为云镜像仓库获取基础镜像文件。
如何获取镜像ID,请参见快速导入镜像文件(基于Windows环境)。
步骤2 将获取到的镜像导入到个人帐号下的OBS桶里。
图2-15 导入到 OBS 桶中
步骤3 在IMS界面,选择“创建私有镜像”。在选择镜像源里选择“镜像文件”,获取对应 OBS桶里的镜像,“镜像用途”选择“ECS系统盘镜像”,“启动方式”选择
“UEFI”,系统盘设置为40G,单击“立即创建”。
图2-16 创建镜像
----结束
2.6 创建节点时 password 字段加盐加密的方法
通过API创建节点时password字段需要加盐加密,具体方法如下:
说明
盐值需要根据密码的要求来设置,密码复杂度要求如下:
● 长度为8-26位。
● 密码至少必须包含大写字母、小写字母、数字和特殊字符(!@$%^-_=+[{}]:,./?)中的三种。
● 密码不能包含用户名或用户名的逆序。
● Windows系统密码不能包含用户名或用户名的逆序,不能包含用户名中超过两个连续字符的 部分。
Python
以下是Python 3.7.7环境下对密码进行加盐的示例步骤:
说明
MacOS下python crypt包有兼容性问题,如碰到无法执行的情况,请在Linux下执行。
1. 根据盐值生成密文密码(在盐字符串的$符号前加上\符号):
python3 -c "import crypt;print(crypt.crypt('test@123', crypt.mksalt()))"
执行结果:
$6$KZ2u71CD4JjQneAy
$WF5dsoOjTgc9RD46i46cCL3H92LMEo78s0rHdfSLDE8PW7ylE2ICcxUGF7/8RBbnxW0crgA3ZGNFA0LLgF aYD0
2. 使用base64 encode(即为password字段值):
echo -n '$6$KZ2u71CD4JjQneAy
$WF5dsoOjTgc9RD46i46cCL3H92LMEo78s0rHdfSLDE8PW7ylE2ICcxUGF7/8RBbnxW0crgA3ZGNFA0LLgF
private static String getCharAndNumr(int length) { String val = "";
private static String generateSalt() { String salt;
public static String getSaltPassword(String password) { if(StringUtils.isBlank(password)) {
4. 使用base64 encode(即为password字段值):
(Base64.getEncoder().encodeToString(AddSaltPasswordUtil.getSaltPassword(cceNodeCreateVo.getPass word()).getBytes()))
5. 完整样例如下:
import java.util.Base64;
import java.util.Random;
import org.apache.commons.codec.digest.Crypt;
import org.apache.commons.lang.StringUtils;
public class PassWord {
static String defaultSalt = null;
public static void main(String[] args) throws Exception {
System.out.println(Base64.getEncoder().encodeToString(PassWord.getSaltPassword("自定义 password").getBytes()));
}
//根据盐值生成密文密码
public static String getSaltPassword(String password) throws Exception { if(StringUtils.isBlank(password)) {
private static String generateSalt() { String salt;
private static String getCharAndNumr(int length) { String val = "";
● https://github.com/amoghe/go-crypt
● https://github.com/GehirnInc/crypt
2.7 给 CCE 集群的节点添加第二块数据盘
您可以使用“安装前执行脚本”功能来配置CCE集群节点(弹性云服务器ECS),配置 方法请参见创建集群-高级配置。
说明
● 1.13.10及更高版本的集群创建节点时,若未开启LVM管理的数据盘,请参考本章节的介绍填 写安装前执行脚本进行格式化,否则该数据盘仍会被LVM管理。
● 1.13.10之前版本的集群创建节点时,若未开启LVM管理的数据盘请务必格式化,否则会与第 一块数据盘进行二选一被LVM管理,进而导致与预期不符的情况。
在使用“安装前执行脚本”功能前,请预先编写一个可以格式化数据盘的脚本(该脚 本需以root用户执行)。
输入参数:
1. 设定该脚本名字为formatdisk.sh,将formatdisk.sh保存到您的OBS中,获取该文 件在OBS中的地址,获取方式请参见通过对象URL访问对象。
2. 需要指定docker数据盘(使用LVM管理的数据盘称之为docker数据盘)的大小,
且docker盘不能与第二块盘大小一致。例如:100G的docker盘,110G的第二块 数据盘。
3. 第二块数据盘的挂载路径。例如:/data/code。
在“安装前执行脚本”中执行以下命令来实现格式化能力:
cd /tmp;curl -k -X GET OBS的地址/formatdisk.sh -1 -O;fdisk -l;sleep 30;bash -x formatdisk.sh 100 /data/
code;fdisk -l
formatdisk.sh脚本示例如下:
all_devices=$(lsblk -o KNAME,TYPE | grep disk | grep -v nvme | awk '{print $1}' | awk '{ print "/dev/"$1}') for device in ${all_devices[@]}; do
isRawDisk=$(lsblk -n $device 2>/dev/null | grep disk | wc -l) if [[ ${isRawDisk} > 0 ]]; then this device"
continue
continue
isLvm=$(sfdisk -lqL 2>>/dev/null | grep $device | grep "8e.*Linux LVM") if [[ ! -n ${isLvm} ]]; then
# part system type is not Linux LVM
[[ -n "${DOCKER_BLOCK_DEVICES}" ]] && echo "Disk ${device} system type is not Linux LVM, will skip this device"
continue fi
fi
block_devices_size=$(lsblk -n -o SIZE $device 2>/dev/null | awk '{ print $1}')
if [[ ${block_devices_size}"x" != "${dockerdisksize}Gx" ]] && [[ ${block_devices_size}"x" != "$
{systemdisksize}Gx" ]]; then echo "n
p1