본문 바로가기
Openstack

오픈스택: magnum

by 왈레 2023. 4. 10.

컨트롤러 노드에서 진행

※ magnum을 설치하기 이전에 먼저 heat를 설치해야함


공식문서에서 추가적으로 제안하는 설치옵션 

옵션1. Octavia(LbassS_v2) : multiple master cluster를 위한
옵션2. Ironic: 베어메탈 클러스터를 위한
옵션3. Swift: 유저가 private 도커 저장소 사용하기 하기위한
옵션4. Ceilometer: cluster의 metrix 지표를 전송하기 위한
옵션5. barbican: 보안을 위한

 

밑에 나오는 magnum.conf는 위의 설치옵션은 설치되어있지 않다고 가정한 설정 값들입니다.

$ mysql
> CREATE DATABASE magnum;
> GRANT ALL PRIVILEGES ON magnum.* TO 'magnum'@'localhost' IDENTIFIED BY 'a';
> GRANT ALL PRIVILEGES ON magnum.* TO 'magnum'@'%' IDENTIFIED BY 'a';
> quit

# 유저 생성 및 admin 권한 부여 및 프로젝트 연결
$ openstack user create --domain default --password-prompt magnum # 비밀번호 a
$ openstack role add --project service --user magnum admin

# 서비스 추가
$ openstack service create --name magnum --description "OpenStack Container Infrastructure Management Service" container-infra

# API 엔드포인트 추가
$ openstack endpoint create --region RegionOne container-infra public <http://172.0.0.4:9511/v1>
$ openstack endpoint create --region RegionOne container-infra internal <http://controller:9511/v1>
$ openstack endpoint create --region RegionOne container-infra admin <http://controller:9511/v1>

# 매그넘 서비스는 COE 클러스터를 관리하기 위해 Identity 서비스에 추가 정보 필요
$ openstack domain create --description "Owns users and projects created by magnum" magnum
$ openstack user create --domain magnum --password-prompt magnum_domain_admin # 비밀번호 a
$ openstack role add --domain magnum --user-domain magnum --user magnum_domain_admin admin

# 확인
$ openstack user list #[magnum, magnum_domain_admin]
$ openstack service list | grep magnum
$ openstack endpoint list | grep magnum 
$ openstack domain list | grep magnum

$ DEBIAN_FRONTEND=noninteractive apt-get install magnum-api magnum-conductor python3-magnumclient
$ cp /etc/magnum/magnum.conf /etc/magnum/magnum.conf.org
$ grep -E '^[^#].' /etc/magnum/magnum.conf.org > /etc/magnum/magnum.conf
$ vi /etc/magnum/magnum.conf
[DEFAULT]
transport_url = rabbit://openstack:a@controller

[api]
host = 172.0.0.4 # 172영역의 ip

[certificates]
cert_manager_type = x509keypair,barbican # 택1 (바비칸 설치가 안되있다면 x509keypair)

[cinder_client]
region_name = RegionOne

[database]
connection = mysql+pymysql://magnum:a@controller/magnum

[keystone_authtoken]
memcached_servers = controller:11211
auth_version = v3
www_authenticate_uri = <http://controller:5000/v3>
project_domain_id = default
project_name = service
user_domain_id = default
password = a
username = magnum
auth_url = <http://controller:5000>
auth_type = password
admin_user = magnum
admin_password = a
admin_tenant_name = service

[trust] 
trustee_domain_name = magnum
trustee_domain_admin_name = magnum_domain_admin
trustee_domain_admin_password = a
trustee_keystone_interface = public, internal # 택1 (public 권장)
cluster_user_trust = True

[oslo_messaging_notifications]
driver = messaging

# metrix 정보를 Ceilometer 주기적으로 보내는 옵션으로 Ceilometer 설치가 안됬으면 false
[drivers]
send_cluster_metrics = False

# DB insert
$ su -s /bin/sh -c "magnum-db-manage upgrade" magnum

$ service magnum-api restart
$ service magnum-conductor restart

$ service magnum-api status
$ service magnum-conductor status

# 검증1
$ openstack coe service list
+----+------+------------------+-------+----------+-----------------+---------------------------+---------------------------+
| id | host | binary           | state | disabled | disabled_reason | created_at                | updated_at                |
+----+------+------------------+-------+----------+-----------------+---------------------------+---------------------------+
|  1 | None | magnum-conductor | up    | False    | None            | 2022-12-07T07:55:59+00:00 | 2022-12-07T07:55:59+00:00 |
+----+------+------------------+-------+----------+-----------------+---------------------------+---------------------------+

 

 

호라이즌에 magnum ui 추가 (ubuntu version: 22.04 LTS server, openstack version: 제드)

$ apt install python3-magnum-ui
$ vi /etc/openstack-dashboard/local_settings.py
# 추가
ENABLE_MAGNUM_UI = True
MAGNUM_URL = "<http://controller:9511/v1>"

# 변경
COMPRESS_OFFLINE = False # True에서 False로 변경

$ service apache2 restart

 

 

트러블슈팅 (ubuntu version: 22.04 LTS server, openstack version: 제드)

1. cluster 탬플릿 생성 시 labels에 container_runtime을 containerd로 설정 할 경우
cluster 생성시 Pod들이 creating 상태에서 stuck됨


1. 해결방안
$ vi /usr/lib/python3/dist-packages/magnum/drivers/common/templates/kubernetes/fragments/install-cri.sh
$ssh_cmd systemctl disable docker.service docker.socket
$ssh_cmd systemctl stop docker.service docker.socket
  # 추가 (참조하는 파일을 바꿔줘야함)
  if $ssh_cmd [ -f /etc/containerd/config.toml ] ; then
     $ssh_cmd sed -i 's/bin_dir.*$/bin_dir\\ =\\ \\""\\/opt\\/cni\\/bin\\/"\\"/' /etc/containerd/config.toml
  fi
  
2. cluster 생성 시 api connection이 제대로 안될 경우
  
2. 해결방안
-> heat.conf에서 controller를 ip로 변경
-> 클러스터 설치 시 필요한 정보를 얻을 때 컨트롤러 노드의 API 주소로 
요청을 날리는데 controller가 상수로 박혀있어 API 요청이 제대로 이뤄지지 않음

 

 

클러스터 탬플릿 생성 시 유용한 labels

1. metrics_server_enabled=true [default:true] // metrix 서버 활성화 여부
2. kube_dashboard_enabled=true [default:true] // 쿠버네티스 대쉬보드 활성화 여부
3. monitoring_enabled=true [default:false] // 프로메테우스 활성화 여부
monitoring_enabled이 true로 설정되면 trueMagnum은 Kubernetes 클러스터에 Prometheus Operator를
자동으로 배포하고 클러스터와 해당 애플리케이션을 모니터링하도록 구성합니다.
Prometheus Operator는 Kubernetes 클러스터에서 Prometheus를 쉽게 배포, 관리 및 확장할 수 있게
해주는 Kubernetes 네이티브 애플리케이션입니다.

Magnum 클러스터 템플릿에서 prometheus_alert_rules및 와 같은 추가 구성 옵션을 제공하여
Prometheus 모니터링 시스템을 추가로 구성할 수 있습니다 . prometheus_scrape_configs이러한
옵션을 사용하면 특정 모니터링 요구 사항을 충족하도록 Prometheus 구성을 지정할 수 있다.

4. container_runtime=containerd [default:docker] // 컨테이너 런타임 변경
5. cloud_provider_enabled=true [defualt:false] // 오픈스택 ciner를 사용하면 true로 설정
6. kube_tag=v1.24.3 // 일단 default로 사용
제드에서 default는 v1.23.3인데 쿠버네티스 버전 변경을 위해서 kube_tag 값 변경도 해보고
다른 여러가지 옵션들을 조합해보았지만 실패...

7. cinder_csi_enabled=true // Cinder 서비스의 CSI 드라이버 사용

 

provider, private 네트워크 생성

# provider 네트워크 생성 (cli)
$ openstack network create --share --external \\
   --provider-physical-network provider \\
   --provider-network-type flat provider

# provider 서브넷
$ openstack subnet create --network provider \\
   --allocation-pool start=172.0.0.10,end=172.0.0.240 \\
   --dns-nameserver 8.8.8.8 --gateway 172.0.0.1 \\
   --subnet-range 172.0.0.0/24 provider-subnet

# 확인
$ openstack network list
$ openstack subnet list

# private 네트워크 생성 (호라이즌)
1. 네트워크, 서브넷 이름 예시) private, private-subnet 
2. 네트워크 주소 예시) 10.11.12.0/24
3. 게이트웨이 주소 예시) 10.11.12.1

# 라우터 생성
1. 외부 네트워크 선택: provider(172 영역대)
2. 라우터 클릭 후 private 네트워크와 연결 

# iptime 설정
1. iptime admin 사이트로 접속 후 admin 접속 후 -> "라우팅 테이블 관리" 이동
2. 10.11.12.0/24로 들어오면 아까 생성한 라우터의 외부 게이트웨이 ip로 라우팅

 

 

쿠버네티스용 이미지 생성

### 컨트롤러 노드의 cli에서 진행 ###

# 매그넘 쿠버네티스용 fedora-coreos35 (Atomic의 후속버전, os_distro='fedora-coreos')
$ wget <https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/35.20220424.3.0/x86_64/fedora-coreos-35.20220424.3.0-openstack.x86_64.qcow2.xz>
$ xz -dv fedora-coreos-35.20220424.3.0-openstack.x86_64.qcow2.xz
$ openstack image create Fedora-CoreOS-35 \\
  --file=fedora-coreos-35.20220424.3.0-openstack.x86_64.qcow2 \\
  --disk-format=qcow2 \\
  --container-format=bare \\
  --property os_distro='fedora-coreos' \\
  --public

# 매그넘 쿠버네티스용 fedora-coreos37 (Atomic의 후속버전, os_distro='fedora-coreos')
<https://getfedora.org/en/coreos/download?tab=cloud_operators&stream=stable&arch=x86_64>
$ openstack image create Fedora-CoreOS-37 \\
  --disk-format=qcow2 \\
  --container-format=bare \\
  --file=fedora-coreos-37.20230122.3.0-openstack.x86_64.qcow2 \\
  --property os_distro='fedora-coreos' \\
  --public


# atomic은 이제 사용안함
# 매그넘 쿠버네티스용 fedora-Atomic 이미지 (os_distro='fedora-atomic')
$ wget <https://download.fedoraproject.org/pub/alt/atomic/stable/Fedora-Atomic-27-20180419.0/CloudImages/x86_64/images/Fedora-Atomic-27-20180419.0.x86_64.qcow2>
$ openstack image create \\
  --disk-format=qcow2 \\
  --container-format=bare \\
  --file=Fedora-Atomic-27-20180419.0.x86_64.qcow2\\
  --property os_distro='fedora-atomic' \\
  Fedora-Atomic-27

# 확인
$ openstack image list

 

 

 

클러스터 생성 및 kubectl 연결

# 클러스터 탬플릿 생성
$ openstack coe cluster template create kubernetes-template \\
--image Fedora-CoreOS-35 \\
--fixed-network private \\
--fixed-subnet private-subnet \\
--external-network provider \\
--dns-nameserver 8.8.8.8 \\
--master-flavor m1.small \\
--flavor m1.small \\
--coe kubernetes \\
--network-drive calico \\
--volume-driver cinder \\
--docker-volume-size 10 \\
--docker-storage-driver overlay2 \\ 
--public \\


# 클러스터 생성
$ openstack coe cluster create kubernetes-cluster \\
--cluster-template kubernetes-cluster-template \\
--master-count 1 \\
--node-count 2 \\
--timeout 60 \\
--keypair mykey

# 클러스터 탬플릿 확인
$ openstack coe cluster template list

# 클러스터 확인
$ openstack coe cluster show kubernetes-cluster

# 생성 체크포인트 확인
$ openstack stack list --nested | grep kubernetes-cluster
$ openstack stack resource list ... 
$ openstack stack resource show ...

# kubectl 연결
$ snap install kubectl --classic
$ openstack coe cluster list
$ openstack coe cluster show kubernetes-cluster
$ mkdir -p ~/clusters/kubernetes-cluster
$ openstack coe cluster config kubernetes-cluster --dir ~/clusters/kubernetes-cluster
$ export KUBECONFIG=/root/clusters/kubernetes-cluster/config
$ kubectl get nodes
$ kubectl get pods -n kube-system

# 쿠버네티스 검증
$ kubectl create deployment nginx --image=nginx
$ kubectl get pods -o wide
$ kubectl expose deployment nginx --type="NodePort" --port 80
$ kubectl get services nginx
$ curl localhost:[port]

'Openstack' 카테고리의 다른 글

오픈스택: octavia  (0) 2023.04.10
오픈스택: heat  (0) 2023.04.10
9. 오픈스택: compute 추가  (0) 2023.04.06
8. 오픈스택: cinder(블록 스토리지) 설치(2)  (0) 2023.04.06
7. 오픈스택: cinder(블록 스토리지) 설치(1)  (0) 2023.04.06

댓글