Maas
물리 노드 관리
# maas 설치과정
sudo snap install maas-test-db
sudo snap install maas --channel=3.3/stable
sudo maas init region+rack --maas-url http://192.168.100.110:5240/MAAS --database-uri maas-test-db:///
sudo maas createadmin --username admin --password ubuntu --email admin@example.com
sudo maas apikey --username admin > ~/admin-api-key
Machine Add 이슈
- Machine으로 등록할 모든 컴퓨터/서버 pxe 부팅 enable 및 우선순위 작업 선행되어야 함
- 최초 Pxe Boot → New 상태로 등록될 때 Power Type 자동으로 인식함. 인식하지 못하는 경우는 Manual로 등록해서 직접 서버의 전원관리 (껐다 켰다) 해줘야함. iDRAC 확인 필요!
DHCP 설정
- 설정 경로
- 대시보드 → 컨트롤러 → vlan → DCHP 설정
- DHCP 설정 시 범위 지정 고려
- 서브넷이 관리되고 있는 경우(Managed), Maas는 Reserved로 설정한 IP Range는 절대 침범하지 않음.
- 라우터의 DHCP 범위, Openstack의 Floating IP 범위 등으로 사용할 Range를 정하여 설정해주어야 함.
- Dynamic 타입의 경우 Maas가 노드들을 Commission 및 Deploy하는 단계에서 사용하는 Ip. Juju를 통해 Deploy하는 경우 해당 과정에서만 사용되고, 배포되고 난 이후에는 예약되지 않은 범위의 ip를 재할당 받기 때문에 넓은 범위를 지정할 필요는 없음.
- 설정 시 반드시 DNS 서버 설정 해야함. 안 그럴시 부팅 시 에러 (cloudinit 관련)
Dell EMC 서버 Commission(Add machine 단계) fail 이슈
로그
Unknown section `None'
INFO: Loading IPMI kernel modules...
INFO: Checking for HP Moonshot...
INFO: Checking for Redfish...
INFO: Reading current IPMI BMC values...
INFO: Found existing IPMI user "maas"!
INFO: Configuring IPMI BMC user "maas"...
INFO: IPMI user number - User3
INFO: IPMI user privilege level - Administrator
ERROR: Redfish HTTP Error 401: Unauthorized
Traceback (most recent call last):
File "/tmp/user_data.sh.mMBXli/scripts/commissioning/30-maas-01-bmc-config", line 1118, in detect_and_configure
if bmc.detected():
File "/tmp/user_data.sh.mMBXli/scripts/commissioning/30-maas-01-bmc-config", line 1052, in detected
return self.get_bmc_ip() is not None
File "/tmp/user_data.sh.mMBXli/scripts/commissioning/30-maas-01-bmc-config", line 1107, in get_bmc_ip
self._bmc_ip = self._get_bmc_ip()
File "/tmp/user_data.sh.mMBXli/scripts/commissioning/30-maas-01-bmc-config", line 1070, in _get_bmc_ip
response = urllib.request.urlopen(
File "/usr/lib/python3.10/urllib/request.py", line 216, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.10/urllib/request.py", line 525, in open
response = meth(req, response)
File "/usr/lib/python3.10/urllib/request.py", line 634, in http_response
response = self.parent.error(
File "/usr/lib/python3.10/urllib/request.py", line 563, in error
return self._call_chain(*args)
File "/usr/lib/python3.10/urllib/request.py", line 496, in _call_chain
result = func(*args)
File "/usr/lib/python3.10/urllib/request.py", line 643, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: Unauthorized
INFO: Checking for IPMI...
INFO: IPMI detected!
INFO: Reading current IPMI BMC values...
INFO: Configuring IPMI Lan_Channel...
INFO: Configuring IPMI Lan_Channel_Auth...
INFO: Lan_Channel_Auth settings unavailable!
WARNING: No K_g BMC key found or configured, communication with BMC will not use a session key!
INFO: Configuring IPMI Serial_Channel...
INFO: Configuring IPMI SOL_Conf...
INFO: Found existing IPMI user "maas"!
INFO: Configuring IPMI BMC user "maas"...
INFO: IPMI user number - User3
INFO: IPMI user privilege level - Administrator
INFO: IPMI Version - LAN_2_0
INFO: IPMI boot type - efi
INFO: Attempting to enable preconfigured static IP on BMC...
ERROR: IPMI Command '['bmc-config', '--commit', '--key-pair=None:IP_Address_Source=Static']' returned non-zero exit status 1.
Traceback (most recent call last):
File "/tmp/user_data.sh.mMBXli/scripts/commissioning/30-maas-01-bmc-config", line 1126, in detect_and_configure
**bmc.get_credentials(),
File "/tmp/user_data.sh.mMBXli/scripts/commissioning/30-maas-01-bmc-config", line 660, in get_credentials
ip_address, mac_address = self.get_bmc_ip()
File "/tmp/user_data.sh.mMBXli/scripts/commissioning/30-maas-01-bmc-config", line 628, in get_bmc_ip
self._bmc_set(section_name, "IP_Address_Source", "Static")
File "/tmp/user_data.sh.mMBXli/scripts/commissioning/30-maas-01-bmc-config", line 271, in _bmc_set
check_call(
File "/usr/lib/python3.10/subprocess.py", line 369, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['bmc-config', '--commit', '--key-pair=None:IP_Address_Source=Static']' returned non-zero exit status 1.
INFO: Checking for Facebook Wedge...
INFO: No BMC automatically detected!
- 원인
- maas 부팅 시 ipmi(전원 관련) 정보를 idrac 서버에서 가져온다.
- 서버 장비 뒷편에 idrac 전용 랜선 포트가 있는데 이 포트에 연결해야 idrac에서 정보를 가져올 수 있음.
- 해결
- 랜선 2개 (기본 네트워크 용 랜선 1, idrac 용1) 연결이 필요하다.
Power Type Error
Dell 서버의 경우 Idrac 과 같은 Power Type을 얻어오는 lan 정보(ip 등)이 초기 정보와 다르게 변경 되었을 수 있다. 변경 된 정보 확인 후 Mass Controller에 해당 정보 갱신하여 해결.
Machine 상태
- New → Commisioning → Ready → Deploy
- Ready 단계에서의 machine 설정
- Network → br-ex, openVswitch 브릿지 설정
Juju
각 노드에 application 배포 역할
# 설치
sudo snap install juju --classic --channel 2.9
# 보안
juju add-cloud --client -f maas-cloud.yaml(만들어야함) maas-one
juju add-credential --client -f maas-creds.yaml(만들어야함) maas-one
# Juju Controller 노드 배포
juju bootstrap --bootstrap-series=jammy --constraints tags=juju maas-one maas-controller
juju add-model --config default-series=jammy openstack
juju switch maas-controller:openstack
Openstack Charms
참고 명령어
# 설정 변경 예시
juju config ceph-osd osd-devices='/dev/sdb /dev/sdc'
#조회 예시
juju run-action ceph-osd/8 --wait restart
#로그 계속 조회
watch -n 5 -c juju status --color
#특정 서비스 로그 조회
juju debug-log --replay --include ceph-osd
Nas → Ceph Osd 활용
문제 상황 : openstack Charms 중 Ceph-osd를 배포하려면 파티션 되어있지 않은 빈 디스크가 노드당 최소 한개씩은 필요하다. 그러나, 4개의 노드에 디스크가 하나씩 밖에 없고 해당 디스크는 부팅 과정에서 이미 파티셔닝 되어서 Ceph-osd의 Osd Device로 사용하지 못하는 상태.
해결 : Synology Nas에서 Lun을 생성하여 각 노드의 Block Device로 사용.
- Nas Lun → 리눅스 Block 스토리지 사용
# (해당 노드 juju ssh 후) Nas 서버 연결
sudo iscsiadm --mode discoverydb --type sendtargets --portal 192.168.2.60 --discover
#노드 당 Lun 연결
node 1 : sudo iscsiadm --mode node --targetname iqn.2000-01.com.synology:infra-nas.Target-1.5495a7e60f7
node 2 : sudo iscsiadm --mode node --targetname iqn.2000-01.com.synology:infra-nas.Target-11.5495a7e60f7 -o update -n node.startup -v automatic
node 3 : sudo iscsiadm --mode node --targetname iqn.2000-01.com.synology:infra-nas.Target-12.5495a7e60f7
node 4 : sudo iscsiadm --mode node --targetname iqn.2000-01.com.synology:infra-nas.Target-13.5495a7e60f7
#부팅 시 자동 연결 설정
-o update -n node.startup -v automatic
-o update -n node.conn[0].startup -v automatic
#block device 연결 확인
lsblk
#수동 로그인
--login
재부팅 이후 Ceph-Osd Block 상태
증상 : 각 ceph-osd block 상태. list-disks 해보면 disk는 인식하지만, skipping osd devices previously processed by this unit 이런 로그 나옴.
해결 : ssh 접속 후 sudo ceph-volume lvm activate --all
Vault 이후 처리
vault init
export VAULT_ADDR="http://192.168.2.107:8200"
# Unseal 용 키 생성
vault operator init -key-shares=5 -key-threshold=3
예시 결과
Unseal Key 1: CHSnzWk34pFcyU2Xll/sTU+NeJYgNMGnZ6S+9a+Mifhv
Unseal Key 2: UJJyNMepdHm5fvqo4pPuNpLX9IPKPbhr1Dj9SPj8YWOF
Unseal Key 3: PsdAILzwsjZtD8SjtBtYxBpQ4ywo48iBSlCdGQR64ixB
Unseal Key 4: E3/MR4odJutnwJGD2xLsQ/0FTglW8ZkrDX3NFu++SXVH
Unseal Key 5: iTiiWxNqGWRz+YnjGaMxFjtuVAXUuM7QeyExA1kx2bhz
Initial Root Token: s.8r7ojjWIyqqzsQCJvDbuUeRj
Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.
Vault does not store the generated root key. Without at least 3 keys to
reconstruct the root key, Vault will remain permanently sealed!
It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.
# Unseal (3(threshold)개 이상)
vault operator unseal CHSnzWk34pFcyU2Xll/sTU+NeJYgNMGnZ6S+9a+Mifhv
vault operator unseal UJJyNMepdHm5fvqo4pPuNpLX9IPKPbhr1Dj9SPj8YWOF
vault operator unseal PsdAILzwsjZtD8SjtBtYxBpQ4ywo48iBSlCdGQR64ixB
export VAULT_TOKEN=s.8r7ojjWIyqqzsQCJvDbuUeRj
vault token create -ttl=10m
juju run vault/leader authorize-charm token=s.4ex7of1cqi2rY4rhWTN658oe
- Unseal 과정 중 init 되지 않았다는 에러 발생시
- init=false 일 경우 init 명령어 한번 더 실행
Enable Tls
juju run vault/leader generate-root-ca
Vault Unseal Key 유실 케이스
재부팅 등의 이유로 vault 가 sealed 되어 있다면 unseal 키로 unseal 해줘야 함.
unseal 키를 유실 했다면 vault 서버를 초기화 및 재시작 후 재 init 해야함.
juju ssh vault/0
sudo apt install mysql-client
sudo cat /var/snap/vault/common/vault.hcl -> pwd 확인
mysql -u vault -p vault -h 127.0.0.1
패스워드 입력
drop database vault;
exit
systemctl restart vault.
이후 init 과정 + tls 재시작.
Apache2.0 실패 이슈 (Cert)
- Glance, DashBoard 에서 apache 구동 실패 하는 경우 있었음.
- 원인 : Vault 에서 생성한 ca의 심볼릭 링크가 안걸림
- 해결 2
위와 같이 심볼릭 링크가 걸려있어야 하나, 걸려있지 않았음.
# glance lxd 내부 /etc/apache2/ssl/glance
#심볼릭 링크 생성
(glance)
ln -s /etc/apache2/ssl/glance/cert_juju-0c4b28-3-lxd-3.maas cert_192.168.100.113
ln -s /etc/apache2/ssl/glance/key_juju-0c4b28-3-lxd-3.maas key_192.168.100.113
(cinder)
ln -s /etc/apache2/ssl/cinder/cert_juju-0c4b28-1-lxd-4.maas cert_192.168.100.117
ln -s /etc/apache2/ssl/cinder/key_juju-0c4b28-1-lxd-4.maas key_192.168.100.117
systemctl restart apache2.service (에러 발생한 lxd 내부)
재부팅 이슈
- mysql cluster → leader(로 추정되는) 노드 까지 껏다 키니 해결
- juju 2.9 기준
- 재부팅 또는 각 노드에 대해
juju run-action --wait mysql-innodb-cluster/leader reboot-cluster-from-complete-outage
- 리더 유닛 정상 실행 되면 일정 시간 후에 slave 유닛들도 정상화됨.
- juju 3.1 기준
- 아무 mysql 클러스터 노드에 대해
juju run mysql-innodb-cluster/1 reboot-cluster-from-complete-outage
실행
- vault → vault 서비스 inactive 및 vault sealed 되어있었음
- vault/0 ssh 후 vault.service restart
- ceph-osd → nas ip 바뀜, 등록된 osd 재부팅 후 inactivate 상태였음
- ssh 접속 후 노드별 osd activate 후 해결
현재 설정 상 명령어(osd는 재부팅 후 자동실행 처리 했다고 가정)
# Mysql 클러스터 복구
juju run-action --wait mysql-innodb-cluster/leader reboot-cluster-from-complete-outage
#Vault 복구(Unseal) - Mysql 관련 유닛 Active 상태 확인 후 진행
export VAULT_ADDR="http://192.168.100.120:8200"
juju ssh vault/0
sudo systemctl restart vault.service
exit
vault operator unseal JoWo2xPQOWFX4Q5hxUG0v08uvbWjifsHs3m5yVyxjLXY
vault operator unseal lkx5PtwJLihoA3MLyt2HL03+SBS1gm93psqdfoPPH1H3
vault operator unseal 2Ovzneb6nHejAFNw5rh34C9aNSUkiZaSHyqAJ+kSa6Zr
Openstack 설정
이미지 생성
https://download.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-GenericCloud-Base.latest.x86_64.qcow2 -O rocky8.qcow2
openstack image create --public --container-format bare \
--disk-format qcow2 --file ~/cloud-images/rocky8.qcow2 \
rocky8
네트워크 생성p
openstack subnet create --network user1_net --dns-nameserver 192.168.100.10 \
--subnet-range 10.0.2.0/24 \
--allocation-pool start=10.0.2.10,end=10.0.2.199 \
admin_subnet
openstack router create user1_router
openstack router add subnet user 1_router user1_subnet
openstack router set user1_router --external-gateway ext_net
인스턴스 생성
openstack server create --image rocky8 --flavor m1.tiny \
--key-name user1 --network user1_net --security-group Allow_SSH \
rocky8
FLOATING_IP=$(openstack floating ip create -f value -c floating_ip_address ext_net)
openstack server add floating ip rocky8 $FLOATING_IP
타 서브넷 정적 라우팅(Cisco rv340 문제)
- 상황
- Mass & Openstack Cluster ⇒ 192.168.100.0/24 대역
- 100.0 대역 라우터의 wan 포트 ↔ 1.0 대역 라우터의 lan 포트 서로 연결
- 100.0 대역 네트워크는 1.0 대역 및 1.0 라우터를 통한 인터넷 통신 가능
- 사내 사용되고 있는 네트워크 대역 ⇒ 192.168.0.0, 1.0, 2.0 대역 존재
- 현재 3개의 네트워크에서는 100.0 대역 접근 불가 → 접근 되도록 설정하고자 함
문의 링크
추가 실행 사항
env | grep OS_
yaleeyu7Akaabaeb
마스 → 물리 서버 클러스터링
juju 대시보드 설치 + 접속
juju 계정 관리
Juju
기능
모델링
- 최근의 솔루션은 단일 애플리케이션이 아니라 서로 연관된 다중 애플리케이션으로 이루어진 경우가 많음.(micro service, cloud)
- juju는 서로 다른 컴포넌트들이 (설정 값등을) 소통하는 방법, 환경을 제공
Juju Dashboard
- 3.0 미만 버전에서는 juju 설치시 자동 배포됨
- 기존 juju-gui → juju dashboard
- 드래그 앤 드롭, 새로운 배포 → cli로 쉽게 해결됨. 사라진 것 같음
- gui의 경우 2019 이후 release 없음
- 이전 gui를 사용하기 위해선 controller를 juju 2.7 기준으로 재 bootstrap 하는 등 별도의 처리가 필요함.
juju register MGMTBGFwaW0wJhMPbG9jYWxob3N0OjE3MDcwExMxOTIuMTY4LjEwMC4yOjE3MDcwBCBCGVBS3Xf98lYqxV2wYxxsKDeBTi4OHJ-fl5JO8HcErBMPbWFhcy1jb250cm9sbGVyEwAA
"apim" has not been granted access to any models. You can use "juju grant" to grant access.
Juju User
- 유저 별 model, cloud 권한 설정 가능.
Openstack
https://help.cloud.grnet.gr/t/use-openstack-as-cloud-provider-with-juju/47
juju metadata generate-image -d ~/simplestreams -i f8cc865c-bec7-4480-a6c0-ee50bd653b08 -s bionic -r RegionOne -u https://192.168.100.124:5000/v3
juju bootstrap openstack openstack-controller --metadata-source /home/direa/simplestreams/images --config network="admin_net" --config external-network="ext_net" --debug
juju credentials --client --show-secrets --format yaml
node1 → 810c
node2 → 80ac
node3 → 7f8c
네트워크 Bond + 재배포
문제 상황 1
- openstack 배포 과정에 unit 배포 조차 제대로 안되는 경우 및 juju ssh 도 간헐적으로 안되는 현상 발생
- maas 클러스터 정상적으로 배포 완료 하더라도 이후 openstack 인스턴스 생성 시 해당 ip로 접근이 안됨
- maas node ssh 후
ovs-vsctl show
쳤을 때 br-ex 에 bond0 인터페이스가 제대로 올라오지 않고 에러
예상 원인
- maas 에서 bond 생성 시 Unconfigured가 아닌 서브넷 지정 후 Auto-Assign 까지 해준 상태에서 브릿지 걸었음
해결
- 본딩 알고리즘을 balance-xor(mac 기반 hash func로 로드밸런싱)로 변경
Resize
- Resizing 요청 보냈으나 아무 응답 없음(대시보드, cli 모두)
- 디버깅
- nova-controller 노드의 /var/log/nova/ 하위의 nova-conductor, nova-scheduler 로그 확인
nova.exception_Remote.NoValidHost_Remote: No valid host was found.
확인
Got no allocation candidates from the Placement API. This could be due to insufficient resources or a temporary occurrence as compute nodes start up.
- 실 사용 가능량 조회
openstack hypervisor show 1 -f shell | grep -E 'memory_mb|vcpus|free'
- 해결
- 메모리 줄인(128g → 64g) flavor 적용 후 resizing 진행
특정 인스턴스 종료되는 문제
문제 상황
인스턴스 액션로그에는 “-” 로 user id 가 없는 상황인데 stop을 실행시킴
예상 원인
https://serverfault.com/questions/783053/openstack-instances-power-off-by-itself
db 와의 동기화에서 실패가 원인인 것 같음 실제 문제의 인스턴스가 배치된 노드의 nova 로그에서도 같은 로그가 발생하는 것을 확인
ubuntu@node4:~$ sudo zcat /var/log/nova/nova-compute.log.3.gz | grep power_state | head -1
2024-02-16 00:18:06.544 22164 INFO nova.compute.manager [None req-7b98b5d9-92bd-4362-8a18-be95b9d163a9 - - - - - -] [instance: e60932e9-3437-4fbb-a5e6-3d0bb9d861c6] During _sync_instance_power_state the DB power_state (1) does not match the vm_power_state from the hypervisor (4). Updating power_state in the DB to match the hypervisor.
Probing EDD 문제
/etc/default/grub
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8 edd=off_no_timer_check net.ifnames=0 crashkernel=auto"
인스턴스에서 ‘e’ 눌러서 커널 진입후 수정 필요