集群和节点环境准备#

算力集群的常规架构如下图所示。

../_images/cluster-architecture.png

集群架构#

集群的所有节点都需挂载共享文件系统,以便(1)用户HOME目录以及所有HOME目录下的文件在所有节点上一致。(2)系统及应用软件,如多个CUDA版本,多个Python版本可以一次性安装后,在所有节点上都可以访问。(3)利用POSIX的用户ID(uid、gid)控制文件访问权限,如每个用户的HOME只有用户自己可以访问。

集群的所有节点都用集中统一的用户认证系统,如Active Directory、LDAP、FreeIPA、NIS等,以保证用户在所有节点上访问以及权限的一致性。

整个集群被认为是同一个系统,其中所有节点间都是互信的,关闭防火墙,禁用SELINUX。而集群与外部则需要防火墙,只开少量的端口,集群外部用户访问都必须通过前端的登录节点,通讯由登录节点转发。对外的we门户就放在登录节点上。由于登录节点上一般为无状态,任务的状态都由AIP管理,部署多个登录节点可以达到高可用的功能。

集群内部的节点访问互联网(下载软件等)需要通过NAT网关。

集群内部的访问则可在任意一个节点上完成。

备注

本文档中EL表示基于Fedora的Enterprise Linux,如CentOS、Red Hat Enterprise Linux, Rocky Linux, Oracle Linux等。

集群节点准备#

1. 安装AIP依赖的软件包#

  • 在EL7(如CentOS 7)中,安装libyaml, libcurl, psmisc, net-tools

yum -y install libcurl libyaml psmisc net-tools
  • 在EL8(如Rocky Linux 8)或以上版本中,安装net-tools, libnsl

dnf install -y libcurl libyaml psmisc net-tools libnsl
  • 在Ubuntu上:

apt install dmidecode numactl psmisc

2. 关闭防火墙、关闭SELINUX#

在EL(CentOS、Rocky Linux,Red Hat Enterprise Linux等)上:

systemctl disable --now firewalld
setenforce 0
sed -i s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config

Ubuntu上:

ufw disable
setenforce 0
sed -i s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config

创建NFS文件服务#

对于测试集群,可以用第一个节点的本地盘作为NFS共享存储系统(或者选择集群中任意一台本地盘较大的节点创建NFS服务)。

小技巧

把普通Linux服务器作为NFS共享存储服务器,考虑其性能和可靠性,不建议在生产环境中使用。生产环境中应该使用专用NAS或高性能并行文件系统,如GPFS、Lustre等。

在第一个节点上创建NFS文件服务#

假设本地子网为10.10.0.0/24 在EL(CentOS、Rocky Linux、Red Hat等)上:

yum -y install nfs-utils

在Ubuntu上:

apt install nfs-kernel-server

配置:

mkdir -p /share
cat <<EOF> > /etc/exports
/home 10.10.0.0/24(rw,no_root_squash)
/share 10.10.0.0/24(rw,no_root_squash)
EOF
systemctl enable --now rpcbind nfs-server

在集群其他几点上挂载NFS#

假设共享NFS的服务器地址为10.10.0.4 在EL(CentOS、Rocky Linux、Red Hat等)上:

yum -y install nfs-utils

在Ubuntu上:

apt install nfs-common

继续配置:

mkdir -p /share
cat <<EOF >> /etc/fstab
10.10.0.4:/home /home nfs defaults 0 0
10.10.0.4:/share /share nfs defaults 0 0
EOF
systemctl daemon-reload
mount /home
mount /share

安装OpenLDAP服务#

小集群可以在主节点上安装,大机群需要一个专用的管理节点安装。 ### 在EL上安装 以下脚本安装提供TLS加密的OpenLDAP服务。执行前,请务必修改头部的部分参数,尤其是密码、域名等。

#!/bin/bash
ldaprootpw=Passw0rd              # LDAP Root 密码,请修改
managername=Manager              # LDAP管理员用户名,如必要,也请修改
managerpassword='Passw0rd123!'   # LDAP管理员密码,请修改
domain="dc=skyformaip,dc=com"    # 域名,请修改
oname=SkyFormAIP                 # 顶层组织名,请修改

yum -y install openldap-servers openldap-clients

workdir=/root
cd $workdir
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG
systemctl enable --now slapd

rootpw="$(slappasswd -s $ldaprootpw)"

cat <<EOF > chrootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: $rootpw
EOF

ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

mngerpw="$(slappasswd -s $managerpassword)"

cat <<EOF > chdomain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=$managername,$domain" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: $domain

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=$managername,$domain

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: $mngerpw

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=$managername,$domain" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=$managername,$domain" write by * read
EOF

ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif

dc=$(echo $domain | cut -d, -f1 | cut -d= -f2)

cat <<EOF > basedomain.ldif
dn: $domain
objectClass: top
objectClass: dcObject
objectclass: organization
o: $oname
dc: $dc

dn: cn=$managername,$domain
objectClass: organizationalRole
cn: $managername
description: Directory Manager

dn: ou=People,$domain
objectClass: organizationalUnit
ou: People

dn: ou=Group,$domain
objectClass: organizationalUnit
ou: Group
EOF

ldapadd -x -D cn=$managername,$domain -w $managerpassword -f basedomain.ldif

PASSPHRASE=$(echo $ldaprootpw | head -c 6)
cd /etc/pki/tls/certs
umask 77
openssl genrsa -aes128 -passout pass:$PASSPHRASE 2048 > server.key
openssl rsa -passin pass:$PASSPHRASE -in server.key -out server.key
openssl req -utf8 -new -key server.key -out server.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=$oname/OU=IT/CN=$(hostname)" \
  -passin pass:$PASSPHRASE
openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650
cp /etc/pki/tls/certs/server.key \
   /etc/pki/tls/certs/server.crt \
   /etc/pki/tls/certs/ca-bundle.crt \
   /etc/openldap/certs/

chown ldap: /etc/openldap/certs/server.key \
    /etc/openldap/certs/server.crt \
    /etc/openldap/certs/ca-bundle.crt
cd $workdir
cat <<EOF > mod_ssl.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/ca-bundle.crt
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/server.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/server.key
EOF
ldapmodify -Y EXTERNAL -H ldapi:/// -f mod_ssl.ldif
sed -i 9d /etc/sysconfig/slapd
sed -i '9i SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"' /etc/sysconfig/slapd
systemctl restart slapd

在Ubuntu上安装#

请参考线上文档:https://www.server-world.info/en/note?os=Ubuntu_22.04&p=openldap&f=1

在每个节点上配置LDAP客户端#

在EL上:

yum -y install sssd sssd-ldap oddjob-mkhomedir

在Ubuntu上:

apt install sssd sssd-ldap oddjob-mkhomedir

配置:

ldapserver_ip=10.10.1.3    #修改LDAP服务器的IP地址
domain="dc=skyformaip,dc=com" #修改域名,与LDAP服务设置的域名一致

cat <<EOF > /etc/sssd/sssd.conf
[domain/default]
id_provider = ldap
autofs_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldaps://$ldapserver_ip:636
ldap_search_base = $domain
ldap_id_use_start_tls = False
cache_credentials = True
[sssd]
services = nss, pam, autofs
domains = default
[nss]
homedir_substring = /home
EOF
chmod 600 /etc/sssd/sssd.conf
# for EL 7
authconfig --enablesssd --enablesssdauth --update
# for other OS
authselect select sssd with-mkhomedir --force
systemctl enable sssd oddjobd
systemctl restart sssd oddjobd

集群NAT网关#

若硬件路由器不支持NAT网关,而内部节点要需要能够访问外网(外网不允许直接访问内网节点),可以在一台Linux服务器上设置NAT网关。如图二所示。

../_images/nat-gateway.png

NAT网关#

1. 私网节点设置#

把网络的gateway设成网关节点的内网网卡地址

systemctl disable --now firewalld
route add default gw 192.168.11.9   # 网关内网地址

2. NAT网关节点设置#

public_ip=10.10.0.42              # 网关外网地址
public_nic=eth0                   # 网关外网网卡设备名
private_subnet="192.168.11.0/24"  # 内网子网
private_nic=eth1                  # 网关内网网卡设备名
systemctl disable --now firewalld
cat <<EOF > /etc/init.d/nat
#!/bin/bash
# chkconfig: 345 99 10
case "$1" in
  start)
    echo 1 > /proc/sys/net/ipv4/ip_forward
    modprobe iptable_nat
    iptables -t nat -A POSTROUTING -s $private_subnet -o $public_nic -j SNAT --to-source $public_ip
    iptables -A FORWARD -i $private_nic -j ACCEPT
    ;;
  *)
    ;;
esac
exit 0
EOF
chmod +x /etc/init.d/nat
chkconfig nat on
service nat start