[Openstack] powering-off 상태의 VM 을 강제로 리부팅 하는 방법

리눅스/OpenStack|2023. 7. 27. 10:47
반응형

VM 상태가 powering-off 라면 중지도 되지 않고, 리부팅도 되지 않습니다.

- 예시) VM 이름 : master

 

# openstack server show master |grep task_state
| OS-EXT-STS:task_state               | powering-off                                             |

 

이 상태에서 VM 을 중지할 경우 실패가 됩니다.

# openstack server stop master
Cannot 'stop' instance 17c0f56b-00c2-485d-9280-7d2cb09a6139 while it is in task_state powering-off (HTTP 409) (Request-ID: req-8380c8ea-fa5b-45bc-b16d-c5651a0b2281)

 

이때, 아래와 같이 nova 명령을 이용해 상태를 초기화 하고 경우에 따라 VM 중지 또는 시작 명령으로 서버를 재가동 할 수 있습니다.

# nova reset-state --active master
Reset state for server master succeeded; new state is active

# openstack server stop master

# openstack server start master
# openstack server show master |grep state
| OS-EXT-STS:power_state              | Running                                                  |
| OS-EXT-STS:task_state               | None                                                     |
| OS-EXT-STS:vm_state                 | active                                                   |

반응형

댓글()

Openstack VM 생성시 에러 {'code': 400, ..., 'message': "Host is not mapped to any cell"}

리눅스/OpenStack|2023. 7. 18. 11:47
반응형

컴퓨트 노드를 추가하고 VM (이름 : worker2) 을 생성할때 발생한 에러 입니다.

아래와 같이 상태를 확인하였습니다.

 

# openstack server show worker2 |grep fault
| fault                               | {'code': 400, 'created': '2023-07-18T02:32:17Z', 'message': "Host 'compute2' is not mapped to any cell"} |

 

이때 openstack compute service list 에 추가된 컴퓨트 노드가 정상으로 출력된다고 해도 아래와 같이 다시 명령을 실행해주세요.

nova-manage cell_v2 discover_hosts --verbose
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell0': 12471ee6-907e-47d5-b002-b008d99b847b
Checking host mapping for compute host 'compute2': 8f3070ff-4173-4c06-a004-19eeabeacd97
Creating host mapping for compute host 'compute2': 8f3070ff-4173-4c06-a004-19eeabeacd97
Found 1 unmapped computes in cell: 12471ee6-907e-47d5-b002-b008d99b847b

 

그리고 다시 VM 을 생성하면 잘 될 것입니다.

 

반응형

댓글()

CentOS 7 에서 GlusterFS 설치 (단일 서버)

리눅스/OS 일반|2023. 7. 12. 15:55
반응형

GlusterFS 를 RAID 와 같은 여러가지 형태로 구성 가능하지만 본 매뉴얼에서는 단일 서버로 서비스하는 방법에 대해 기술하였습니다.

 

[사전 작업]
서버에 추가 Disk 를 연결하고 /data 디렉토리로 마운트 했습니다.
그리고 마운트 디렉토리 안에 gv0 이라는 Brick 디렉토리를 생성해 두었습니다.

Brick 디렉터리는 GlusterFS 볼륨에서 데이터를 저장하는 디렉터리를 뜻합니다.
- /data/gv0

 

1. 설치

호스트 명을 변경합니다.
# hostnamectl set-hostname gnode


호스트를 등록 합니다.
# vi /etc/hosts

127.0.0.1   localhost gnode

 

GlusterFS 설치를 위한 Repository 를 등록해줍니다.
등록은 yum 로 간단히 할 수 있습니다.
# yum -y install centos-release-gluster

 

GlusterFS 패키지를 설치합니다.
# yum -y install glusterfs glusterfs-libs glusterfs-server

서버 부팅시 glusterd 데몬이 자동 구동 되도록 하고, 현재 세션에서도 구동시켜줍니다.
# systemctl enable --now glusterd

 

설치된 버전을 확인합니다.

# glusterd --version
glusterfs 9.6
Repository revision: git://git.gluster.org/glusterfs.git
Copyright (c) 2006-2016 Red Hat, Inc. <https://www.gluster.org/>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
It is licensed to you under your choice of the GNU Lesser
General Public License, version 3 or any later version (LGPLv3
or later), or the GNU General Public License, version 2 (GPLv2),
in all cases as published by the Free Software Foundation.

 

2. 볼륨 생성

Cluster Pool 을 구성합니다.

여러대로 구성할 경우 본 서버가 아닌 다른 서버를 peer 로 등록해야 하지만, 단일 서버로 구성할 예정이므로 추가할 peer 가 없습니다.

Pool 을 구성하는 peer 리스트를 확인합니다.

# gluster pool list
UUID Hostname  State
eb4dba8d-df9a-4471-962a-103200830683 localhost Connected 

 

볼륨을 구성합니다.

# gluster volume create gv0 gnode:/data/gv0
volume create: gv0: success: please start the volume to access data

 

* 에러 출력시

volume create: gv0: failed: The brick gnode:/data/gv0 is being created in the root partition. It is recommended that you don't use the system's root partition for storage backend. Or use 'force' at the end of the command if you want to override this behavior.

위와 같은 에러 메세지는 별도의 파티션 디렉토리가 아니고 루트 (/) 파티션에서 생성한 디렉토리에서 볼륨을 구성할때 경고 메세지가 출력되는 것입니다. 추가 디스크나 별도의 파티션을 추가하지 않았지만 테스트 목적으로 구성하고 싶다면, 명령 뒤에 force 문자를 추가하여 실행할 수 있습니다.

예) gluster volume create gv0 gnode:/data/gv0 force

 

gv0 볼륨을 시작합니다.

# gluster volume start gv0

volume start: gv0: success

 

gv0 볼륨 상태를 확인합니다.

# gluster volume info gv0

 
Volume Name: gv0
Type: Distribute
Volume ID: 5aeec667-d4f8-433c-8fec-91ae275569ea
Status: Started
Snapshot Count: 0
Number of Bricks: 1
Transport-type: tcp
Bricks:
Brick1: gnode:/data/gv0
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on

3. Client 마운트

GlusterFS 에서는 몇가지 마운트 방법을 제공합니다. GlusterFS (FUSE), NFS, iSCSI, SMB 방식인데 여기에서는 일반적인 FUSE 방식을 설명하겠습니다.

Client 에서 마운트에 필요한 패키지를 설치하고 마운트를 합니다.

GlusterFS 서버를 찾을 수 있도록 도메인을 연결하면 좋겠지만 현재 테스트 환경에서는 hosts 파일을 이용하였으므로 Client 에서도 찾을 수 있도록 /etc/hosts 파일에 아래 내용을 작성해 줍니다.

# vi /etc/hosts

127.0.0.1   localhost localhost.localdomain
192.168.10.10 gnode

 

클라이언트 패키지를 설치하고 마운트를 합니다.

# yum -y install glusterfs-client  // CentOS 명령어 이므로 Ubuntu 사용자는 apt 명령 사용

# mkdir /backup

# mount -t glusterfs gnode:/gv0 /backup

# df -h
파일 시스템     크기  사용  가용 사용% 마운트위치
tmpfs           1.5G  2.3M  1.5G    1% /run
/dev/sda2       214G   29G  174G   15% /
tmpfs           7.3G   66M  7.3G    1% /dev/shm
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           1.5G  192K  1.5G    1% /run/user/1000
gnode:/gv0       10G  135M  9.9G    2% /backup

 

* 참고

디렉토리에 쿼터를 적용하는 방법이나 GlusterFS 를 RAID 서버와 같이 여러대로 구성하는 방법은 아래 포스팅을 참고해주세요.

https://sysdocu.tistory.com/1821

 

반응형

댓글()

2. Openstack Image, Flavor, Network, VM 순차적으로 생성하기

리눅스/OpenStack|2023. 7. 10. 08:35
반응형

Openstack 인프라 구성이 완료된 상태에서 진행합니다.

참고 : https://sysdocu.tistory.com/1833

 

 

1. 이미지 생성

 

OS 설치용 이미지를 Openstack 에 등록해야 합니다.

 

CentOS 7 cloud 버전 이미지를 다운로드 합니다.

# wget https://mirrors.cloud.tencent.com/centos-cloud/centos/7/images/CentOS-7-x86_64-GenericCloud-2009.qcow2

 

이미지 파일을 등록합니다.

# openstack image create "CentOS7" --file CentOS-7-x86_64-GenericCloud-2009.qcow2 --disk-format qcow2 --container-format bare --public

+------------------+---------------------------------------------------------------------------------------------------------------------------------------------+
| Field            | Value                                                                                                                                       |
+------------------+---------------------------------------------------------------------------------------------------------------------------------------------+
| container_format | bare                                                                                                                                        |
| created_at       | 2023-07-10T01:23:08Z                                                                                                                        |
| disk_format      | qcow2                                                                                                                                       |
| file             | /v2/images/acbe118e-6881-4ecf-8447-868864150c81/file                                                                                        |
| id               | acbe118e-6881-4ecf-8447-868864150c81                                                                                                        |
| min_disk         | 0                                                                                                                                           |
| min_ram          | 0                                                                                                                                           |
| name             | CentOS7                                                                                                                                     |
| owner            | 677861619c5445368a353ebeb0bcba2b                                                                                                            |
| properties       | os_hidden='False', owner_specified.openstack.md5='', owner_specified.openstack.object='images/CentOS7', owner_specified.openstack.sha256='' |
| protected        | False                                                                                                                                       |
| schema           | /v2/schemas/image                                                                                                                           |
| status           | queued                                                                                                                                      |
| tags             |                                                                                                                                             |
| updated_at       | 2023-07-10T01:23:08Z                                                                                                                        |
| visibility       | public                                                                                                                                      |
+------------------+---------------------------------------------------------------------------------------------------------------------------------------------+

 

생성된 이미지를 확인합니다.

# openstack image list

+--------------------------------------+---------+--------+
| ID                                   | Name    | Status |
+--------------------------------------+---------+--------+
| acbe118e-6881-4ecf-8447-868864150c81 | CentOS7 | active |
+--------------------------------------+---------+--------+

 

* Ubuntu Cloud 이미지는 아래 공식 사이트에서 다운로드가 가능합니다.

https://cloud-images.ubuntu.com/

 

 

2. Flavor 생성

 

Flavor는 VM의 리소스 (CPU, 메모리, 디스크 등) 와 구성을 정의 합니다.

 

Flavor 를 생성합니다.

형식) openstack flavor create --ram <RAM> --disk <DISK> --vcpus <VCPUS> --public <FLAVOR_NAME>

# openstack flavor create --ram 2048 --disk 20 --vcpus 2 --public myflavor

+----------------------------+--------------------------------------+
| Field                      | Value                                |
+----------------------------+--------------------------------------+
| OS-FLV-DISABLED:disabled   | False                                |
| OS-FLV-EXT-DATA:ephemeral  | 0                                    |
| disk                       | 20                                   |
| id                         | 7e94605d-ace3-4980-94ad-fa49b36c4735 |
| name                       | myflavor                             |
| os-flavor-access:is_public | True                                 |
| properties                 |                                      |
| ram                        | 2048                                 |
| rxtx_factor                | 1.0                                  |
| swap                       |                                      |
| vcpus                      | 2                                    |
+----------------------------+--------------------------------------+

 

생성된 Flavor 를 확인합니다.

# openstack flavor list
+--------------------------------------+----------+------+------+-----------+-------+-----------+
| ID                                   | Name     |  RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+----------+------+------+-----------+-------+-----------+
| 7e94605d-ace3-4980-94ad-fa49b36c4735 | myflavor | 2048 |   20 |         0 |     2 | True      |
+--------------------------------------+----------+------+------+-----------+-------+-----------+

 

 

3. Network 생성

 

먼저 기본 provider 네트워크를 생성합니다.
# openstack network create --share --external --provider-physical-network provider --provider-network-type flat provider
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2023-07-17T06:08:56Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | b536c267-4a33-4068-a0da-4748a1cbfc97 |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| mtu                       | 1550                                 |
| name                      | provider                             |
| port_security_enabled     | True                                 |
| project_id                | 677861619c5445368a353ebeb0bcba2b     |
| provider:network_type     | flat                                 |
| provider:physical_network | provider                             |
| provider:segmentation_id  | None                                 |
| qos_policy_id             | None                                 |
| revision_number           | 1                                    |
| router:external           | External                             |
| segments                  | None                                 |
| shared                    | True                                 |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| updated_at                | 2023-07-17T06:08:56Z                 |
+---------------------------+--------------------------------------+

* 옵션 설명
--share : 모든 프로젝트가 가상 네트워크 사용하도록 허용
--external : 가상 네트워크가 외부에 연결되도록 함 (내부 네트워크 사용시 --internal)

다음 파일에 옵션이 설정되었는지 확인하고 없으면 입력합니다.
# vi /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2_type_flat]
flat_networks = provider

# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings = provider:eno1

위 eno1 은 네트워크 장치명입니다.
설정이 변경된 경우 neutron 을 재시작 합니다.
# systemctl restart neutron-server

external 네트워크에 서브넷을 생성합니다.
VM 에 할당할 외부 IP 대역 및 게이트웨이 정보를 입력합니다.
# openstack subnet create --network provider --allocation-pool start=115.68.142.66,end=115.68.142.94 --dns-nameserver 8.8.8.8 --gateway 115.68.142.65 --subnet-range 115.68.142.64/27 provider
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| allocation_pools     | 115.68.142.66-115.68.142.94          |
| cidr                 | 115.68.142.64/27                     |
| created_at           | 2023-07-17T06:12:12Z                 |
| description          |                                      |
| dns_nameservers      | 8.8.8.8                              |
| dns_publish_fixed_ip | None                                 |
| enable_dhcp          | True                                 |
| gateway_ip           | 115.68.142.65                        |
| host_routes          |                                      |
| id                   | d2346f72-dd3b-4ef2-8065-0fd34d50177f |
| ip_version           | 4                                    |
| ipv6_address_mode    | None                                 |
| ipv6_ra_mode         | None                                 |
| name                 | provider                             |
| network_id           | b536c267-4a33-4068-a0da-4748a1cbfc97 |
| prefix_length        | None                                 |
| project_id           | 677861619c5445368a353ebeb0bcba2b     |
| revision_number      | 0                                    |
| segment_id           | None                                 |
| service_types        |                                      |
| subnetpool_id        | None                                 |
| tags                 |                                      |
| updated_at           | 2023-07-17T06:12:12Z                 |
+----------------------+--------------------------------------+


사용자 환경에 내부 네트워크 제공을 위해 사용자 환경을 로드 합니다.
테스트를 위해 admin 으로 VM 을 생성할 경우 바로 아래 명령은 넘어갑니다.
# source sysdocu-openrc

VM 끼리 내부 네트워크로 사용할 서브넷을 생성합니다.
# openstack network create selfservice
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2023-07-14T01:35:56Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | 30fbd00c-5968-40bf-a6e6-6e1b3307a232 |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| mtu                       | 1500                                 |
| name                      | selfservice                          |
| port_security_enabled     | True                                 |
| project_id                | 677861619c5445368a353ebeb0bcba2b     |
| provider:network_type     | vxlan                                |
| provider:physical_network | None                                 |
| provider:segmentation_id  | 477                                  |
| qos_policy_id             | None                                 |
| revision_number           | 1                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| updated_at                | 2023-07-14T01:35:56Z                 |
+---------------------------+--------------------------------------+

# openstack subnet create --network selfservice --dns-nameserver 8.8.8.8 --gateway 172.16.1.1 --subnet-range 172.16.1.0/24 selfservice
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| allocation_pools     | 172.16.1.2-172.16.1.254              |
| cidr                 | 172.16.1.0/24                        |
| created_at           | 2023-07-14T01:36:07Z                 |
| description          |                                      |
| dns_nameservers      | 8.8.8.8                              |
| dns_publish_fixed_ip | None                                 |
| enable_dhcp          | True                                 |
| gateway_ip           | 172.16.1.1                           |
| host_routes          |                                      |
| id                   | d577dadf-9d16-49ef-b495-69412745bc7b |
| ip_version           | 4                                    |
| ipv6_address_mode    | None                                 |
| ipv6_ra_mode         | None                                 |
| name                 | selfservice                          |
| network_id           | 30fbd00c-5968-40bf-a6e6-6e1b3307a232 |
| prefix_length        | None                                 |
| project_id           | 677861619c5445368a353ebeb0bcba2b     |
| revision_number      | 0                                    |
| segment_id           | None                                 |
| service_types        |                                      |
| subnetpool_id        | None                                 |
| tags                 |                                      |
| updated_at           | 2023-07-14T01:36:07Z                 |
+----------------------+--------------------------------------+

외부네트워크와 내부 네트워크를 연결하는 작업을 진행하기 위해 Router 를 생성합니다.
# openstack router create router
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| admin_state_up          | UP                                   |
| availability_zone_hints |                                      |
| availability_zones      |                                      |
| created_at              | 2023-07-17T06:13:12Z                 |
| description             |                                      |
| distributed             | False                                |
| external_gateway_info   | null                                 |
| flavor_id               | None                                 |
| ha                      | False                                |
| id                      | 12bb1577-1184-4aaf-a285-175579a0f13f |
| name                    | router                               |
| project_id              | 677861619c5445368a353ebeb0bcba2b     |
| revision_number         | 1                                    |
| routes                  |                                      |
| status                  | ACTIVE                               |
| tags                    |                                      |
| updated_at              | 2023-07-17T06:13:12Z                 |
+-------------------------+--------------------------------------+

# openstack router add subnet router selfservice
# openstack router set router --external-gateway provider

연결을 확인합니다.
# source admin-openrc
# openstack router list
+--------------------------------------+--------+--------+-------+----------------------------------+-------------+-------+
| ID                                   | Name   | Status | State | Project                          | Distributed | HA    |
+--------------------------------------+--------+--------+-------+----------------------------------+-------------+-------+
| 12bb1577-1184-4aaf-a285-175579a0f13f | router | ACTIVE | UP    | 677861619c5445368a353ebeb0bcba2b | False       | False |
+--------------------------------------+--------+--------+-------+----------------------------------+-------------+-------+

 

 

4. VM 생성

 

VM 초기 구성을 변경하기 위해 관련 패키지를 설치하고 파일을 생성합니다.

ubuntu 일반계정과 root 관리자 계정 두 가지 로그인 방법이 있으므로 상황에 맞게 사용하시면 됩니다.

# apt-get -y install cloud-init

# vi temp.sh

(root 계정으로 로그인 허용)

#cloud-config
users:
  - name: root
chpasswd:
  list: |
    root:12345678@#$%
  expire: False
runcmd:
  - 'sed -i "s/^#PermitRootLogin .*/PermitRootLogin yes/" /etc/ssh/sshd_config'
  - 'sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config'
  - 'systemctl restart sshd'

 

(ubuntu 기본 계정으로 로그인 허용)

#cloud-config
users:
  - name: ubuntu
chpasswd:
  list: |
    ubuntu:12345678@#$%
  expire: False
runcmd:
  - 'sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config'
  - 'systemctl restart sshd'
  - 'sudo usermod -aG sudo ubuntu'
  - 'sed -i "s/\/ubuntu:\/bin\/sh/\/ubuntu:\/bin\/bash/" /etc/passwd'

 

(root 패스워드를 설정하고, sudo 권한 가진 ubuntu 계정 생성)

#cloud-config
users:
  - name: ubuntu
chpasswd:
  list: |
    ubuntu:12345678@#$%
  expire: False
runcmd:
  - 'sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config'
  - 'systemctl restart sshd'
  - 'useradd -m -d /home/ubuntu -s /bin/bash -G sudo ubuntu'
  - 'echo "ubuntu:12345678@#$%" | chpasswd'
  - 'echo "ubuntu  ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers'

 

Image 와 Flavor 를 이용해 VM 을 생성합니다.

VM 생성할때는 위에서 생성한 Flavor, Image, Key, (내부) Network 정보를 포함해야 합니다.

형식) openstack server create --flavor <FLAVOR_NAME> --image <IMAGE_NAME> --nic net-id <NETWORK_NAME> --user-data <INITIALIZE_FILE> <INSTANCE_NAME>

# openstack server create --flavor myflavor --image "CentOS7" --nic net-id=selfservice --user-data /root/temp.sh myinstance
+-------------------------------------+-------------------------------------------------+
| Field                               | Value                                           |
+-------------------------------------+-------------------------------------------------+
| OS-DCF:diskConfig                   | MANUAL                                          |
| OS-EXT-AZ:availability_zone         |                                                 |
| OS-EXT-SRV-ATTR:host                | None                                            |
| OS-EXT-SRV-ATTR:hypervisor_hostname | None                                            |
| OS-EXT-SRV-ATTR:instance_name       |                                                 |
| OS-EXT-STS:power_state              | NOSTATE                                         |
| OS-EXT-STS:task_state               | scheduling                                      |
| OS-EXT-STS:vm_state                 | building                                        |
| OS-SRV-USG:launched_at              | None                                            |
| OS-SRV-USG:terminated_at            | None                                            |
| accessIPv4                          |                                                 |
| accessIPv6                          |                                                 |
| addresses                           |                                                 |
| adminPass                           | QSjCjKK3oiJi                                    |
| config_drive                        |                                                 |
| created                             | 2023-07-14T05:16:28Z                            |
| flavor                              | myflavor (7e94605d-ace3-4980-94ad-fa49b36c4735) |
| hostId                              |                                                 |
| id                                  | a23ff754-668f-4f9e-b517-376ae41ddc42            |
| image                               | CentOS7 (acbe118e-6881-4ecf-8447-868864150c81)  |
| key_name                            | None                                           |
| name                                | myinstance                                      |
| progress                            | 0                                               |
| project_id                          | 677861619c5445368a353ebeb0bcba2b                |
| properties                          |                                                 |
| security_groups                     | name='default'                                  |
| status                              | BUILD                                           |
| updated                             | 2023-07-14T05:16:28Z                            |
| user_id                             | 7ffedad885e1490e9f5598081077f5a8                |
| volumes_attached                    |                                                 |
+-------------------------------------+-------------------------------------------------+

 

root@controller:~# openstack server list
+--------------------------------------+------------+--------+-----------------------------------------+---------+----------+
| ID                                   | Name       | Status | Networks                                | Image   | Flavor   |
+--------------------------------------+------------+--------+-----------------------------------------+---------+----------+
| a23ff754-668f-4f9e-b517-376ae41ddc42 | myinstance | ACTIVE | selfservice=172.16.1.173 | CentOS7 | myflavor |
+--------------------------------------+------------+--------+-----------------------------------------+---------+----------+

 

여기에 외부 IP 를 할당해줍니다.

아래 명령을 실행하면 provider 에 할당된 네트워크 범위에서 1개의 IP 를 자동 생성 시킵니다.

# openstack floating ip create provider
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| created_at          | 2023-07-17T06:16:01Z                 |
| description         |                                      |
| dns_domain          | None                                 |
| dns_name            | None                                 |
| fixed_ip_address    | None                                 |
| floating_ip_address | 115.68.142.86                        |
| floating_network_id | b536c267-4a33-4068-a0da-4748a1cbfc97 |
| id                  | dcc8088b-c577-41dd-ae40-d0bdd97865ed |
| name                | 115.68.142.86                        |
| port_details        | None                                 |
| port_id             | None                                 |
| project_id          | 677861619c5445368a353ebeb0bcba2b     |
| qos_policy_id       | None                                 |
| revision_number     | 0                                    |
| router_id           | None                                 |
| status              | DOWN                                 |
| subnet_id           | None                                 |
| tags                | []                                   |
| updated_at          | 2023-07-17T06:16:01Z                 |
+---------------------+--------------------------------------+

 

생성된 외부 IP 를 확인합니다.

# openstack floating ip list
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| ID                                   | Floating IP Address | Fixed IP Address | Port | Floating Network                     | Project                          |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| dcc8088b-c577-41dd-ae40-d0bdd97865ed | 115.68.142.86       | None             | None | b536c267-4a33-4068-a0da-4748a1cbfc97 | 677861619c5445368a353ebeb0bcba2b |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+

 

서버와 생생된 IP 를 연결해줍니다.

서버는 이름이나 ID 값 아무거나 넣어줘도 됩니다.

# openstack server add floating ip myinstance 115.68.142.86

 

IP 추가된것을 다시 확인합니다.
# openstack server list
+--------------------------------------+------------+--------+-----------------------------------------+---------+----------+
| ID                                   | Name       | Status | Networks                                | Image   | Flavor   |
+--------------------------------------+------------+--------+-----------------------------------------+---------+----------+
| a23ff754-668f-4f9e-b517-376ae41ddc42 | myinstance | ACTIVE | selfservice=172.16.1.173, 115.68.142.86 | CentOS7 | myflavor |
+--------------------------------------+------------+--------+-----------------------------------------+---------+----------+

 

참고로 ssh 로도 접속이 가능하지만 네트워크가 안될 경우 NoVNC 를 통해서 접근하는 방법은 아래와 같습니다.

# openstack console url show myinstance

+-------+-------------------------------------------------------------------------------------------+
| Field | Value                                                                                     |
+-------+-------------------------------------------------------------------------------------------+
| type  | novnc                                                                                     |
| url   | http://controller:6080/vnc_auto.html?path=%3Ftoken%3Ddd017af1-27f8-4f49-a611-fe36d5d34c01 |
+-------+-------------------------------------------------------------------------------------------+

 

URL 중 'controller' 는 접속이 가능한 도메인 또는 IP 로 대체하여 웹브라우저로 접속하면 컨트롤 가능한 콘솔 화면이 출력됩니다.

 

반응형

댓글()

PHP 소켓 (server.php, client.php) - 데이터 전달 예제

프로그래밍/PHP|2023. 7. 7. 12:47
반응형

PHP 를 이용해 Server 에서 소켓 파일을 만들어 실행한 상태에서 Client 가 데이터를 전달하는 예제입니다.

데이터 (Mac address) 를 보내면 Server 측에서 데이터 검증 후 출력하도록 작성하였습니다.

받은 데이터 로그는 /root/input_data.log 에 기록 됩니다.

 

# vi server.php

#!/usr/bin/php -q
<?php
set_time_limit(0);

define("_IP",    "0.0.0.0");
define("_PORT",  "80");

$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sSock, SOL_SOCKET, SO_REUSEADDR, 1);

socket_bind($sSock, _IP, _PORT);
socket_listen($sSock);

pcntl_signal(SIGCHLD, SIG_IGN); 

function msg($msg) {
    echo "SERVER >> ".$msg;
}

// 맥어드레스 형식 검증
function isMacAddress($str) {
    $pattern = '/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/';
    return preg_match($pattern, $str);
}

while($sock = socket_accept($sSock)) {
    socket_getpeername($sock, $sockIp, $sockPort);
    msg("Client connect : ".$sockIp.":".$sockPort."\n");

    // 자식 프로세스 생성
    $pid = pcntl_fork();
    if($pid == -1) {
        msg("fork failed\n");
        exit;
    }
    if($pid == 0) {
        $input = socket_read($sock, 4096);

        // 헤더와 데이터 분리
        list($header, $data) = explode("\r\n\r\n", $input, 2);
        msg("Mac address : " . $data . "\n");

        // 결과 응답 및 Client 연결 해제
        if ($input != "") {
            socket_write($sock, "Received it well");
            msg("Client disconnect : ".$sockIp.":".$sockPort."\n");
            socket_close($sock);
        }

        // 데이터 검증
        if (isMacAddress($data)) {
            $validation = "OK";
        } else {
            $validation = "NotOK";
        }

        // 로그 기록
        $now = date("Y-m-d H:i:s");
        shell_exec("echo \"$now\" \"$data\" \"$validation\" >> /root/input_data.log");
        exit;
    }
}
?> 

 

맨 윗줄 #!/usr/bin/php -q 에는 실제 php 실행파일 경로를 적어줘야 합니다.

 

root 만 사용할 수 있도록 권한을 변경합니다.

# chmod 700 server.php

 

파일을 실행하여 80 포트를 오픈하고 client 의 수신을 대기합니다.

# php server.php

 

Client 파일을 만듭니다.

# vi client.php

<?php
$url = 'http://www.sysdocu.kr';    // 접속할 호스트명
$data = '00:d8:61:13:2a:b8';       // 전달하고 싶은 데이터 (여기에서는 Mac address)

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
curl_close($ch);
?>

 

Server 측 소켓이 열린 상태에서 client.php 파일을 실행하면 미리 준비된 데이터가 전달 됩니다.

# php client.php

 

반응형

댓글()

오픈 클라우드 플랫폼 K-PaaS (구 PaaS-TA) 6.5 Container Platform 설치 (on Openstack)

리눅스/PaaS|2023. 7. 7. 08:54
반응형

현재는 오픈 클라우드 플랫폼 (K-PaaS) 이라는 이름으로 변경 되었지만, 이전에 사용하던 명칭 PaaS-TA 는 "Platform as a Service - 'Thank you' 의 속어인 'TA' 의 의미로, 한국지능정보사회진흥원 (NIA) 의 지원으로 다양한 국내 업체와 협업을 통해 만든 개방형 클라우드 플랫폼입니다. PaaS-TA 는 오픈소스 커뮤니티인 Cloud Foundry 를 기반으로 한 클라우드 플랫폼으로, 애플리케이션을 빠르고 쉽게 배포하고 실행할 수 있는 환경을 제공합니다. 그리고 다양한 기능과 서비스를 제공하여 개발자들이 애플리케이션을 효율적으로 구축하고 관리할 수 있도록 도와줍니다. 몇 가지 주요 기능은 다음과 같습니다.
- 애플리케이션 배포 및 관리 : 애플리케이션을 컨테이너화하여 배포하고, 애플리케이션 스케일링, 로드 밸런싱, 자동 복구 등을 관리할 수 있습니다. 개발자는 애플리케이션의 빌드, 배포, 롤백 등을 간편하게 수행할 수 있습니다.
- 서비스 관리 : 다양한 서비스를 제공하며, 데이터베이스, 메시징, 캐싱 등과 같은 백엔드 서비스를 애플리케이션에서 활용할 수 있습니다. 이를 통해 개발자는 별도의 서비스 구축 없이 필요한 기능을 활용할 수 있습니다.
- 스케줄링 및 자원 관리 : 애플리케이션의 스케줄링 및 자원 관리를 지원하여, 리소스의 효율적인 활용과 애플리케이션의 안정적인 운영을 도와줍니다.
- 모니터링 및 로깅 : 애플리케이션의 상태, 리소스 사용량, 로그 등을 모니터링하고 관리할 수 있는 기능을 제공합니다. 이를 통해 개발자는 애플리케이션의 성능과 안정성을 실시간으로 확인하고 문제를 해결할 수 있습니다.

PaaS-TA 는 오픈소스이므로 기업이나 개발자들은 소스 코드를 활용하여 자체적으로 구축하거나 커스터마이징 할 수 있습니다.

PaaS-TA CP (Container Platform) 설치 매뉴얼은 공식 문서를 기반으로 테스트하고 작성되었습니다.

- PaaS-TA Document : https://github.com/PaaS-TA/paas-ta-container-platform/blob/master/install-guide/Readme.md

- BOSH Document : http://bosh.io

- Cloud Foundry Document : https://docs.cloudfoundry.org

 

설치하는 PaaS-TA 버전은 6.5 이고, 서비스형 배포 방식이며, IaaS 환경은 Openstack 입니다.

Openstack 환경 구성은 아래 포스팅을 확인해주세요.

- Openstack 환경 구성 : https://sysdocu.tistory.com/1833

- VM 생성 : https://sysdocu.tistory.com/1836

 

[ 서버 준비 ]

1) Openstack 환경의 VM 4대를 준비합니다.

    - VM (최소) 사양 : 2 CPU / 8GB RAM

    - OS : Ubuntu 20.04

    - VM 4대 : Master node 1대 / Slave node 3대

2) VM 과 같은 내부 네트워크를 사용하는 곳에 NFS 서버를 추가로 준비합니다. (NFS 서버 설치 : 바로가기)

3) 모든 작업은 공식 Documents 에 안내되어 있는대로 ubuntu 계정을 사용합니다. 계정이 없거나 권한이 부족한 경우 아래절차로 설정해주세요.

- useradd -m -d /home/ubuntu -s /bin/bash -G sudo ubuntu
- echo "ubuntu:12345678@#" | chpasswd
- echo "ubuntu  ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
- mkdir /home/ubuntu/.ssh
- chown ubuntu.ubuntu /home/ubuntu/.ssh

 

 

1. Kubespray 설치

 

먼저, 설치가 잘 될 수 있도록 ufw 방화벽을 중지하고 OS 환경 업데이트를 진행합니다.

(모든 노드에서)

$ sudo systemctl disable --now ufw

$ sudo apt -y update

$ sudo apt -y upgrade

 

1) 설치 환경 구성

Kubespray 를 이용해 Kubernetes Cluster 를 쉽게 구성할 수 있습니다.

우선 각 서버를 지칭하고, 연결이 수월할 수 있도록 내부 IP 와 호스트명을 설정합니다.

 

(모든 노드에서)

$ sudo vi /etc/hosts

127.0.0.1 localhost
172.16.1.20 master
172.16.1.89 worker1
172.16.1.211 worker2
172.16.1.252 worker3
172.16.1.32 nfs

 

(각 노드에서)

$ sudo hostnamectl set-hostname master      // master 노드에서

$ sudo hostnamectl set-hostname worker1    // worker1 노드에서

$ sudo hostnamectl set-hostname worker2    // worker2 노드에서

$ sudo hostnamectl set-hostname worker3    // worker3 노드에서

$ sudo hostnamectl set-hostname nfs            // nfs 노드에서

 

Kubespray 설치를 위해 SSH Key 를 인벤토리의 모든 서버들에 복사합니다.

 

(Master 노드에서)

$ ssh-keygen -t rsa -m PEM
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): (엔터)
Enter passphrase (empty for no passphrase): (엔터)
Enter same passphrase again: (엔터)
Your identification has been saved in /home/ubuntu/.ssh/id_rsa
Your public key has been saved in /home/ubuntu/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:7F9X4w2PGnTkju37pueRdcYvZZcDDmci0+hhoEJeOqA ubuntu@master
The key's randomart image is:
+---[RSA 3072]----+
| . . . .         |
|. + o . . o      |
|E  = .   * + +.  |
|    o  .o + *o...|
|        S.  ..++X|
|       .   . =.OX|
|        .   + *++|
|         . . = .+|
|          . . +Bo|
+----[SHA256]-----+

 

아래 명령으로 출력된 공개키를 모든 Master node (본서버 포함), Worker node 에 복사합니다.

$ cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDA7lkRlLtIYjeVdLOBCe+jahcDKacVV/hZkAYKEj49pX0EQ2sLRVTdaEkrFws3rBp9MRwI1SeAj3LiqKzpOYeltbIM2v20z1G8EiJIooMdtqlDAbiPlJI4Dz2/UU3KkEOcvP1OLhx9Ctd6xCQTSUuDkb0XenufKHiMFlN0S+fQPeE5YFMe7hpbFuuVTVMqpt1Nev1d2LXfecSj240J7gTC/CysMrdOOG7cyFGdl5CzA8SWKfaI+2R8p19j7fUhc1rYJcJ6CtMuw/jTahSkN+R+6kPvE1+xcTtN/bHJQ/HupTFNXaKs2u6aWrHCUVHe3ghGbyBaAKNVlHxiI2IB1pF98BVsAjfRzDTj2qHv/wVuNTroE0ux0ayu8wDTjNn9Vv6ou2BvfnAoS2qgBdRnKkfnXHcz+eHWl93m+EjfQ2KoEOLD23O91SecU0+SWpWF7egecy/6H7wRsgOlNMeNKMbeRGk9xG0uqE1ip7bsrAOFYYAbQI89Zc5AbzgArVF/j00= ubuntu@master

 

위 내용을 복사하여 아래와 같이 모든 노드에 저장합니다.

(모든 노드에서 - 본 master 서버 포함)

$ vi .ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDA7lkRlLtIYjeVdLOBCe+jahcDKacVV/hZkAYKEj49pX0EQ2sLRVTdaEkrFws3rBp9MRwI1SeAj3LiqKzpOYeltbIM2v20z1G8EiJIooMdtqlDAbiPlJI4Dz2/UU3KkEOcvP1OLhx9Ctd6xCQTSUuDkb0XenufKHiMFlN0S+fQPeE5YFMe7hpbFuuVTVMqpt1Nev1d2LXfecSj240J7gTC/CysMrdOOG7cyFGdl5CzA8SWKfaI+2R8p19j7fUhc1rYJcJ6CtMuw/jTahSkN+R+6kPvE1+xcTtN/bHJQ/HupTFNXaKs2u6aWrHCUVHe3ghGbyBaAKNVlHxiI2IB1pF98BVsAjfRzDTj2qHv/wVuNTroE0ux0ayu8wDTjNn9Vv6ou2BvfnAoS2qgBdRnKkfnXHcz+eHWl93m+EjfQ2KoEOLD23O91SecU0+SWpWF7egecy/6H7wRsgOlNMeNKMbeRGk9xG0uqE1ip7bsrAOFYYAbQI89Zc5AbzgArVF/j00= ubuntu@master

 

그리고 모든 노드에 NFS Client 패키지를 설치합니다.

아래에서 NFS 를 마운트 하기위해 사용할 예정입니다.

$ sudo apt -y install nfs-common

 

(Master 노드에서 - 이제 Worker 노드에서의 추가 작업은 없음)

Kubespray 설치파일을 다운로드 받고 설치를 이어갑니다.

아래의 branch_v1.4.x 는 특정 버전을 적는것이 아니라 문자 그대로 x 를 입력해야 합니다.

$ git clone https://github.com/PaaS-TA/paas-ta-container-platform-deployment.git -b branch_v1.4.x
Cloning into 'paas-ta-container-platform-deployment'...
remote: Enumerating objects: 11524, done.
remote: Counting objects: 100% (11523/11523), done.
remote: Compressing objects: 100% (5862/5862), done.
remote: Total 11524 (delta 4535), reused 11330 (delta 4347), pack-reused 1
Receiving objects: 100% (11524/11524), 274.90 MiB | 20.39 MiB/s, done.
Resolving deltas: 100% (4535/4535), done.
Updating files: 100% (7807/7807), done.

 

설치 경로로 이동해서 환경변수 파일을 수정합니다. 변수명에 해당되는 값을 입력하면 됩니다.

worker node 의 수가 더 많을경우 행을 더 추가하여 입력할 수 있습니다.

$ cd paas-ta-container-platform-deployment/standalone/single_control_plane

$ vi cp-cluster-vars.sh

#!/bin/bash

export MASTER_NODE_HOSTNAME=master
export MASTER_NODE_PUBLIC_IP=115.68.142.67
export MASTER_NODE_PRIVATE_IP=172.16.1.20

## Worker Node Count Info
export WORKER_NODE_CNT=3

## Add Worker Node Info
export WORKER1_NODE_HOSTNAME=worker1
export WORKER1_NODE_PRIVATE_IP=172.16.1.89
export WORKER2_NODE_HOSTNAME=worker2
export WORKER2_NODE_PRIVATE_IP=172.16.1.211
export WORKER3_NODE_HOSTNAME=worker3
export WORKER3_NODE_PRIVATE_IP=172.16.1.252

## Storage Type Info (eg. nfs, rook-ceph)
export STORAGE_TYPE=nfs
export NFS_SERVER_PRIVATE_IP=172.16.1.32

 

2) 에러 사전 조치

설치 전, 몇가지 에러 방지를 위해 아래와 같은 작업을 진행합니다.

공식 Documents 에서는 아래 내용이 빠져 있으며, 그대로 설치 (deploy-cp-cluster.sh 실행) 할 경우, OS 환경에 따라 여러개의 에러가 발생하는데, 아래는 에러 일부를 사전에 조치하는 방법입니다.

추후, 배포되는 설치 소스가 업데이트 되면서 아래 내용이 필요없게 되거나, 또 다른 조치 방법이 필요할 수 있습니다.

 

(1) NFS 공유 디렉토리 설정

NFS 를 사용할 경우 아래 파일에서 공유 디렉토리 위치를 변경해줘야 합니다.

파일에 기본 설정된 값은 /home/share/nfs 이므로, 실제 NFS 서버내에 구성한 공유 디렉토리가 /data 일때 아래와 같이 변경합니다.

설치중 deployment.yaml.ori 파일이 deployment.yaml 파일로 복사되므로 deployment.yaml 파일을 수정하지 않도록 주의합니다.

$ sed -i 's/home\/share\/nfs/data/' ../applications/nfs-provisioner-4.0.0/deployment.yaml.ori

또는 아래와 같이 파일을 열어 직접 변경합니다.

$ vi ../applications/nfs-provisioner-4.0.0/deployment.yaml.ori

...

            - name: NFS_PATH # do not change
              value: /data            # path to nfs directory setup
...
         nfs:
           server: {NFS_SERVER_PRIVATE_IP}
           path: /data
...

 

(2) nf_conntrack 사용

리눅스 커널 4.18 이상의 버전에는 nf_conntrack_ipv4 이름이 nf_conntrack 으로 변경되었습니다. 설치 스크립트에서는 nf_conntrack_ipv4 를 찾지못해 'Module nf_conntrack_ipv4 not found' 메세지가 출력되므로, 모듈명을 수정해 주어야 합니다.

$ sed -i 's/nf_conntrack_ipv4/nf_conntrack/' extra_playbooks/roles/kubernetes/node/tasks/main.yml

$ sed -i 's/nf_conntrack_ipv4/nf_conntrack/' roles/kubernetes/node/tasks/main.yml

 

(3) Istio 설치 명령어 수정

아래 두개 파일에 잘못된 문자가 있는데 맨 뒤에 å 를 a 로 고쳐줘야 합니다.

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.11.4 TARGET_ARCH=x86_64 sh -å

$ sed -i 's/å/a/' extra_playbooks/roles/paasta-cp/istio/tasks/main.yml

$ sed -i 's/å/a/' roles/paasta-cp/istio/tasks/main.yml

 

3) 설치 및 확인

설치 스크립트를 실행해 설치를 진행합니다.

$ bash deploy-cp-cluster.sh

 

아래는 설치중 출력되는 에러 메세지 입니다.

에러가 발생하면 무시가 되면서 설치가 계속 진행됩니다.

혹시 방화벽 룰이 설정된 경우, 설치가 제대로 이루어지지 않거나 설치과정에서 멈추는 경우가 있으니 설치가 잘 되지 않는 분은 방화벽을 잠시 내리고 설치해보는 것도 좋습니다.

 

TASK [etcd : Get currently-deployed etcd version] **************
fatal: [master]: FAILED! => {"changed": false, "cmd": "/usr/local/bin/etcd --version", "msg": "[Errno 2] No such file or directory: b'/usr/local/bin/etcd'", "rc": 2, "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [kubernetes/control-plane : Check which kube-control nodes are already members of the cluster] **************
fatal: [master]: FAILED! => {"changed": false, "cmd": ["/usr/local/bin/kubectl", "get", "nodes", "--selector=node-role.kubernetes.io/control-plane", "-o", "json"], "delta": "0:00:00.046634", "end": "2023-07-20 23:35:05.782368", "msg": "non-zero return code", "rc": 1, "start": "2023-07-20 23:35:05.735734", "stderr": "The connection to the server localhost:8080 was refused - did you specify the right host or port?", "stderr_lines": ["The connection to the server localhost:8080 was refused - did you specify the right host or port?"], "stdout": "", "stdout_lines": []}
...ignoring

 

TASK [network_plugin/calico : Calico | Get existing FelixConfiguration] *************
fatal: [master]: FAILED! => {"changed": false, "cmd": ["/usr/local/bin/calicoctl.sh", "get", "felixconfig", "default", "-o", "json"], "delta": "0:00:00.060760", "end": "2023-07-24 05:55:32.486934", "msg": "non-zero return code", "rc": 1, "start": "2023-07-24 05:55:32.426174", "stderr": "resource does not exist: FelixConfiguration(default) with error: felixconfigurations.crd.projectcalico.org \"default\" not found", "stderr_lines": ["resource does not exist: FelixConfiguration(default) with error: felixconfigurations.crd.projectcalico.org \"default\" not found"], "stdout": "null", "stdout_lines": ["null"]}
...ignoring


TASK [network_plugin/calico : Calico | Get existing calico network pool] **************
fatal: [master]: FAILED! => {"changed": false, "cmd": ["/usr/local/bin/calicoctl.sh", "get", "ippool", "default-pool", "-o", "json"], "delta": "0:00:00.042520", "end": "2023-07-20 23:36:36.320521", "msg": "non-zero return code", "rc": 1, "start": "2023-07-20 23:36:36.278001", "stderr": "resource does not exist: IPPool(default-pool) with error: ippools.crd.projectcalico.org \"default-pool\" not found", "stderr_lines": ["resource does not exist: IPPool(default-pool) with error: ippools.crd.projectcalico.org \"default-pool\" not found"], "stdout": "null", "stdout_lines": ["null"]}
...ignoring

TASK [network_plugin/calico : Calico | Get existing BGP Configuration] ***************
fatal: [master]: FAILED! => {"changed": false, "cmd": ["/usr/local/bin/calicoctl.sh", "get", "bgpconfig", "default", "-o", "json"], "delta": "0:00:00.034705", "end": "2023-07-20 23:36:37.450199", "msg": "non-zero return code", "rc": 1, "start": "2023-07-20 23:36:37.415494", "stderr": "resource does not exist: BGPConfiguration(default) with error: bgpconfigurations.crd.projectcalico.org \"default\" not found", "stderr_lines": ["resource does not exist: BGPConfiguration(default) with error: bgpconfigurations.crd.projectcalico.org \"default\" not found"], "stdout": "null", "stdout_lines": ["null"]}
...ignoring

TASK [kubernetes-apps/ansible : Kubernetes Apps | Register coredns deployment annotation `createdby`] ***************
fatal: [master]: FAILED! => {"changed": false, "cmd": ["/usr/local/bin/kubectl", "--kubeconfig", "/etc/kubernetes/admin.conf", "get", "deploy", "-n", "kube-system", "coredns", "-o", "jsonpath={ .spec.template.metadata.annotations.createdby }"], "delta": "0:00:00.059931", "end": "2023-07-20 23:37:11.974466", "msg": "non-zero return code", "rc": 1, "start": "2023-07-20 23:37:11.914535", "stderr": "Error from server (NotFound): deployments.apps \"coredns\" not found", "stderr_lines": ["Error from server (NotFound): deployments.apps \"coredns\" not found"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [kubernetes-apps/ansible : Kubernetes Apps | Register coredns service annotation `createdby`] *****************
fatal: [master]: FAILED! => {"changed": false, "cmd": ["/usr/local/bin/kubectl", "--kubeconfig", "/etc/kubernetes/admin.conf", "get", "svc", "-n", "kube-system", "coredns", "-o", "jsonpath={ .metadata.annotations.createdby }"], "delta": "0:00:00.061244", "end": "2023-07-20 23:37:12.300058", "msg": "non-zero return code", "rc": 1, "start": "2023-07-20 23:37:12.238814", "stderr": "Error from server (NotFound): services \"coredns\" not found", "stderr_lines": ["Error from server (NotFound): services \"coredns\" not found"], "stdout": "", "stdout_lines": []}
...ignoring

 

에러가 발생해도 자동으로 넘어가면서 설치가 완료되었습니다. 설치가 잘 되었는지 확인합니다.

$ kubectl get nodes
NAME      STATUS   ROLES           AGE   VERSION
master    Ready    control-plane   16m   v1.25.6
worker1   Ready    <none>          15m   v1.25.6
worker2   Ready    <none>          15m   v1.25.6
worker3   Ready    <none>          15m   v1.25.6

 

$ kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS      AGE
calico-kube-controllers-75748cc9fd-5k46h   1/1     Running   0             16m
calico-node-7ldrx                          1/1     Running   0             16m
calico-node-f48sv                          1/1     Running   0             16m
calico-node-nxspr                          1/1     Running   0             16m
calico-node-zb9c2                          1/1     Running   0             16m
coredns-588bb58b94-2bbtm                   1/1     Running   0             15m
coredns-588bb58b94-5prkj                   1/1     Running   0             15m
dns-autoscaler-5b9959d7fc-6qzsr            1/1     Running   0             15m
kube-apiserver-master                      1/1     Running   1             17m
kube-controller-manager-master             1/1     Running   2 (14m ago)   17m
kube-proxy-89x74                           1/1     Running   0             16m
kube-proxy-8nfnp                           1/1     Running   0             16m
kube-proxy-bt478                           1/1     Running   0             16m
kube-proxy-v8hjh                           1/1     Running   0             16m
kube-scheduler-master                      1/1     Running   2 (14m ago)   17m
metrics-server-64c4c5ddbc-t6qq5            1/1     Running   0             15m
nginx-proxy-worker1                        1/1     Running   0             16m
nginx-proxy-worker2                        1/1     Running   0             16m
nginx-proxy-worker3                        1/1     Running   0             16m
nodelocaldns-74st7                         1/1     Running   0             15m
nodelocaldns-9dk9v                         1/1     Running   0             15m
nodelocaldns-c2d5f                         1/1     Running   0             15m
nodelocaldns-rv6cf                         1/1     Running   0             15m

 

설치 또는 실행이 중지된 Pod 가 있는지 확인합니다.

아무런 결과가 나오지 않아야 합니다.

$ kubectl get pods -A |grep Pending
The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port?

이와 같은 메세지가 출력될 경우 조금 기다렸다가 다시 확인해보세요. 클러스터 구성이 모두 정상 가동되려면 약간의 시간이 필요합니다.

 

* 참고 : Kubespray 삭제

$ bash reset-cp-cluster.sh

...

Are you sure you want to reset cluster state? Type 'yes' to reset your cluster. [no]: yes

...

그리고 NFS 서버 공유 디렉토리에 있던 데이터를 모두 지워줍니다.

(NFS 서버에서)

# rm -rf /data/*

 

 

2. 컨테이너 플랫폼 포털 설치

 

컨테이너 플랫폼 포털 (대시보드) 을 이용해 관리자 및 이용자가 쉽게 응용프로그램 등을 생성하고 관리할 수 있습니다.

설치 방법을 알아봅니다.

 

1) 컨테이너 플랫폼 포털 Deployment 파일 다운로드

(Master 노드에서)

포털 배포 파일 다운로드 경로를 생성합니다.
$ mkdir -p ~/workspace/container-platform
$ cd ~/workspace/container-platform

포털 배포 파일을 다운로드하고 압축을 해제합니다.
$ wget --content-disposition https://nextcloud.paas-ta.org/index.php/s/WtNQn2agk6epFHC/download
$ tar xvzf cp-portal-deployment-v1.4.0.tar.gz

* 참고 : Deployment 파일 디렉토리 구성
├── script                # 컨테이너 플랫폼 포털 배포 관련 변수 및 스크립트 파일 위치
├── images             # 컨테이너 플랫폼 포털 이미지 파일 위치
├── charts               # 컨테이너 플랫폼 포털 Helm Charts 파일 위치
├── values_orig      # 컨테이너 플랫폼 포털 Helm Charts values.yaml 파일 위치
└── keycloak_orig   # 컨테이너 플랫폼 포털 사용자 인증 관리를 위한 Keycloak 배포 관련 파일 위치

2) 컨테이너 플랫폼 포털 변수 정의

$ cd cp-portal-deployment/script

$ vi cp-portal-vars.sh

# COMMON VARIABLE (Please change the values of the four variables below.)
K8S_MASTER_NODE_IP="115.68.142.67"            # Kubernetes master 서버의 공인 IP
HOST_CLUSTER_IAAS_TYPE="OPENSTACK"    # Host cluster IaaS type ('AWS' or 'OPENSTACK')
PROVIDER_TYPE="standalone"                            # Container Platform Portal Provider Type ('standalone' or 'service')

...

 

3) 컨테이너 플랫폼 포털 설치

설치를 하기 전에 root 사용자로 변경합니다.

설치를 반복해보니 컨테이너 플랫폼 포털은 root 사용자로 설치가 잘 되는것을 확인했습니다.

$ sudo su -

# cd /home/ubuntu/workspace/container-platform/cp-portal-deployment/script

 

파일에 실행권한을 주고 실행합니다.

# chmod +x deploy-cp-portal.sh

# ./deploy-cp-portal.sh 

 

컨테이너 플랫폼 포털 관련 리소스가 정상적으로 배포되었는지 확인합니다.
리소스 Pod 의 경우 Node 에 바인딩 및 컨테이너 생성 후 Error 또는 Pending 상태에서 시간이 지나 Running 상태로 전환되기도 하므로 시간을 갖고 기다려봅니다.

 

Harbor 리소스 조회

# kubectl get all -n harbor

>> 정상

 

MariaDB 리소스 조회

# kubectl get all -n mariadb

>> 정상

 

Keycloak 리소스 조회

# kubectl get all -n keycloak

>> 정상

 

컨테이너 플랫폼 포털 리소스 조회

# kubectl get all -n cp-portal

>> 정상

 

혹시 설치가 잘 안되는 경우 아래 '컨테이너 플랫폼 포털 리소스 삭제' 방법대로 설치된 파일을 삭제한 다음에, deploy-cp-portal.sh 설치 스크립트 파일의 내용을 부분적으로 실행해 서 에러 원인을 찾고 조치하면 문제가 되는 부분이 어디인지 확인을 할 수 있습니다.

 

4) 컨테이너 플랫폼 포털 접속

컨테이너 플랫폼 포털은 아래 주소와 같이 Master node 의 IP 와 포트 32703 으로 접속 가능합니다.

보안 강화를 위해 로그인 후 제일 먼저 패스워드 변경하는 것이 좋습니다.

http://115.68.142.67:32703

ID : admin

PW : admin

 

Harbor 오픈 소스 컨테이너 이미지 레지스트리의 대시보드 URL 과 기본 계정입니다.

이것도 마찬가지로 처음 로그인 후 패스워드를 변경하는 것이 좋습니다.

http://115.68.142.84:30002

ID : admin

PW : Harbor12345

 

Keycloak 소스 싱글 사인온 (Single Sign-On, SSO) 솔루션 대시보드 URL 과 기본 계정입니다.

http://115.68.142.84:32710

ID : admin

PW : admin

 

* 참고 : 컨테이너 플랫폼 포털 리소스 삭제

# chmod +x uninstall-cp-portal.sh
# ./uninstall-cp-portal.sh

Are you sure you want to delete the container platform portal? <y/n> y

...

# sudo rm -rf ../keycloak

 

반응형

댓글()

1. Openstack 환경 구성 (Victoria 버전)

리눅스/OpenStack|2023. 7. 5. 13:15
반응형

설치 과정중 추가 정보가 필요한 경우 아래 공식 문서를 참조해주세요.

* Openstack Documents : https://docs.openstack.org/ko_KR/

* 본 매뉴얼은 다음 포스팅을 참고하여 재작성 하였습니다. : https://yumserv.tistory.com/294

* 서버 구성 : Controller, Neutron, Compute, Storage 각 한대씩 준비하였고 OS 환경은 Ubuntu 20.04 입니다.

- Controller : 115.68.142.99

- Neutron : 115.68.142.100

- Compute : 115.68.142.101

- Storage : 115.68.142.102 // 추가 디스크 장착 (/dev/sdb)

 

 

1. 기본 환경 구성

 

1) 호스트네임 설정

(모든 노드에서)

# vi /etc/hosts

127.0.0.1 localhost localhost.localdomain
115.68.142.99 controller
115.68.142.100 neutron
115.68.142.101 compute
115.68.142.102 storage

 

(각 노드에서)

# hostnamectl set-hostname controller    // 컨트롤러 서버에서

# hostnamectl set-hostname neutron      // 뉴트론 서버에서

# hostnamectl set-hostname compute     // 컴퓨트 서버에서

# hostnamectl set-hostname storage     // 스토리지 서버에서

 

2) time 서버 설정

(모든 서버에서)

# vi /etc/systemd/timesyncd.conf

[Time]
NTP=time.bora.net

 

# systemctl restart systemd-timesyncd

 

3) Openstack 리포지토리 추가

(모든 서버에서)

# apt -y install software-properties-common
# add-apt-repository cloud-archive:victoria

# apt -y update
# apt -y upgrade
# apt -y install python3-openstackclient

 

4) SQL 설치

(Controller 서버에서)

# apt-get -y install mariadb-server

# mysql_secure_installation

Enter current password for root (enter for none): (그냥 엔터)

Set root password? [Y/n] y

New password: (사용할 root 비밀번호 입력)
Re-enter new password: (사용할 root 비밀번호 입력)

Remove anonymous users? [Y/n] y

Disallow root login remotely? [Y/n] y

Remove test database and access to it? [Y/n] y

Reload privilege tables now? [Y/n] y

 

MariaDB 설정 파일을 생성합니다.

# vi /etc/mysql/mariadb.conf.d/99-openstack.cnf

[mysqld]
bind-address = 115.68.142.99    // 접근 허용할 IP (본 Controller 서버 IP)
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

데몬을 재시작하여 설정을 적용합니다.

# systemctl restart mysqld

 

5) 메세지큐 설치

각 서버간 통신을 위해 메세지큐가 필요합니다.

 

(Controller 서버에서)

패키지를 설치합니다.

# apt-get -y install rabbitmq-server

 

rabbitmq 사용자 계정을 추가해줍니다. (설정, 쓰기, 읽기 모두 허용)
# rabbitmqctl add_user openstack 12345678
Adding user "openstack" ...

 

# rabbitmqctl set_permissions openstack "." "." ".*"
Setting permissions for user "openstack" in vhost "/" ...   

 

6) memcached 설치

(Controller 서버에서)

# apt-get -y install memcached

# sed -i 's/127.0.0.1/0.0.0.0/' /etc/memcached.conf

# systemctl restart memcached

 

방화벽을 사용하고 있다면 memcached 데몬 포트 (TCP 11211) 를 허용해 주세요.

 

 

2. Keystone 설치

 

(Controller 서버에서)

1) Keystone 데이터베이스 및 계정 생성

# mysql -p

MariaDB [(none)]> create database keystone;
MariaDB [(none)]> grant all privileges on keystone.* to keystone@'localhost' identified by '12345678';
MariaDB [(none)]> grant all privileges on keystone.* to keystone@'%' identified by '12345678';
MariaDB [(none)]> flush privileges;

 

2) Keystone 패키지 설치 및 설정

# apt-get -y install keystone python3-openstackclient apache2 libapache2-mod-wsgi-py3 python3-oauth2client 
# vi /etc/keystone/keystone.conf

[DEFAULT]
log_dir = /var/log/keystone

[database]
connection = mysql+pymysql://keystone:12345678@controller/keystone

[token]
provider = fernet

 

Keystone 관리 명령어 glance-manage 를 통해 Keystone 데이터베이스에 필요한 테이블을 생성합니다.

# su -s /bin/bash keystone -c "keystone-manage db_sync"

 

keystone-manage 를 이용하여 fernet 키 저장소를 초기화 합니다.

# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

 

keystone-manage bootstrap 을 사용해 사용자, 프로젝트, 역할을 생성하고 새로 생성된 프로젝트 사용자에게 부여합니다.

# keystone-manage bootstrap --bootstrap-password 12345678 \
    --bootstrap-admin-url http://controller:5000/v3/ \
    --bootstrap-internal-url http://controller:5000/v3/ \
    --bootstrap-public-url http://controller:5000/v3/ \
    --bootstrap-region-id AZ1

 

여기에서 AZ1 은 가용존을 구분하기 위해 입력된 값입니다.

방화벽을 사용하고 있다면 Keystone 데몬 포트 (TCP 5000, TCP 35357) 를 허용해 주세요.

 

3) Apache 웹 서버 설정

# echo "ServerName controller" >> /etc/apache2/apache2.conf

# systemctl restart apache2

 

4) 관리자 환경변수 설정

# vi admin-openrc

export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=12345678
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export OS_AUTH_TYPE=password

 

# source admin-openrc

 

Openstack 관리 명령어는 admin 환경 변수를 설정해야 실행이 가능합니다.

보통 controller 서버 로그인 시, 적용 해주는 것이 일반적이며, 이후에 관리 명령이 실행되지 않을 경우 해당 환경 변수 설정이 누락 되었는지 확인해보시기 바랍니다.

환경 변수가 잘 적용되었는지 확인하기 위해 token 정보를 조회해 봅니다.

# openstack token issue

+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2023-07-06T00:29:30+0000                                                                                                                                                                |
| id         | gAAAAABkpfzaysyUUIKuSEBP7g4KGHip6yuFrGK2LYtXiYTq5NT1j9Mha_vxESc7_a3Xc69Rx3ID56kn1oyxs0ZJ0iK46qEGqUoxL7S4ZbfK2uSC24iSrwIJ1W9D0bQ5pv6m3YhBht6gK04n1pXaoD9ahM6cS3wKl8osJhUshRyd-GrJ6Cg8pM8 |
| project_id | 677861619c5445368a353ebeb0bcba2b                                                                                                                                                        |
| user_id    | 7ffedad885e1490e9f5598081077f5a8                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

 

5) 프로젝트, 사용자, 역할 생성

 

# openstack project create --domain default --description "Service Project" service

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 38f4f6c42e614625a309679c45db8a08 |
| is_domain   | False                            |
| name        | service                          |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+

 

생성된 프로젝트를 확인합니다.

# openstack project list

+----------------------------------+---------+
| ID                               | Name    |
+----------------------------------+---------+
| 38f4f6c42e614625a309679c45db8a08 | service |
| 677861619c5445368a353ebeb0bcba2b | admin   |
+----------------------------------+---------+

 

 

3. Glance 설치

 

(Controller 서버에서)

1) 데이터베이스 생성

Glance DB 패스워드 생성시 특수문자를 인식하지 못하는 경우가 있다고 하니 주의하시기 바랍니다.

(참고 : https://bugs.launchpad.net/glance/+bug/1695299)

# mysql -p
MariaDB [(none)]> create database glance;
MariaDB [(none)]> grant all privileges on glance.* to 'glance'@'localhost' identified by '12345678';
MariaDB [(none)]> grant all privileges on glance.* to 'glance'@'%' identified by '12345678';
MariaDB [(none)]> flush privileges;

 

2) Glance 사용자, 서비스, 엔드포인트 생성

# openstack user create --domain default --password 12345678 glance

+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 41d916460e594a6996a779821f7aaaa9 |
| name                | glance                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

 

# openstack role add --project service --user glance admin

 

서비스 glance 를 생성합니다.

# openstack service create --name glance --description 'OpenStack Image' image

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Image                  |
| enabled     | True                             |
| id          | 8b63b37cb389408cbc0c9596c54351f3 |
| name        | glance                           |
| type        | image                            |
+-------------+----------------------------------+

 

image 서비스를 사용할 endpoint 를 생성합니다. public, internal, admin 환경 세군데에서 진행합니다.

# openstack endpoint create --region AZ1 image public http://controller:9292

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 7d4985792d104e7689028b448cdcd9e7 |
| interface    | public                           |
| region       | AZ1                              |
| region_id    | AZ1                              |
| service_id   | 8b63b37cb389408cbc0c9596c54351f3 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

 

# openstack endpoint create --region AZ1 image internal http://controller:9292

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | edba45a5976140d1826b5fbeb61cb8ba |
| interface    | internal                         |
| region       | AZ1                              |
| region_id    | AZ1                              |
| service_id   | 8b63b37cb389408cbc0c9596c54351f3 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

 

# openstack endpoint create --region AZ1 image internal http://controller:9292

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 276c3f3e3dd641b3bac59e78c5cbf86f |
| interface    | internal                         |
| region       | AZ1                              |
| region_id    | AZ1                              |
| service_id   | 8b63b37cb389408cbc0c9596c54351f3 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

 

Glance 서비스가 생성된 것을 확인합니다.

# openstack service list
+----------------------------------+----------+----------+
| ID                               | Name     | Type     |
+----------------------------------+----------+----------+
| 8b63b37cb389408cbc0c9596c54351f3 | glance   | image    |
| ffbd73da330946528c15f9db34380078 | keystone | identity |
+----------------------------------+----------+----------+

 

Endpoint 가 생성된 것을 확인합니다.

# openstack endpoint list
+----------------------------------+--------+--------------+--------------+---------+-----------+----------------------------+
| ID                               | Region | Service Name | Service Type | Enabled | Interface | URL                        |
+----------------------------------+--------+--------------+--------------+---------+-----------+----------------------------+
| 276c3f3e3dd641b3bac59e78c5cbf86f | AZ1    | glance       | image        | True    | internal  | http://controller:9292     |
| 529ebbd795334185b45b6bb43ffabfac | AZ1    | keystone     | identity     | True    | internal  | http://controller:5000/v3/ |
| 776e98c8e99e4f65acab76d0d06a58a5 | AZ1    | keystone     | identity     | True    | admin     | http://controller:5000/v3/ |
| 7d4985792d104e7689028b448cdcd9e7 | AZ1    | glance       | image        | True    | public    | http://controller:9292     |
| e204698c2a504534b962a36fbacc73eb | AZ1    | keystone     | identity     | True    | public    | http://controller:5000/v3/ |
| edba45a5976140d1826b5fbeb61cb8ba | AZ1    | glance       | image        | True    | internal  | http://controller:9292     |
+----------------------------------+--------+--------------+--------------+---------+-----------+----------------------------+

 

3) Glance 패키지 설치

# apt-get -y install glance

 

4) Glance 설정파일 수정

glance-api.conf 파일은 Glance 서비스가 클라이언트로부터 API 요청을 받아들이기 위해 사용됩니다.

 

# vi /etc/glance/glance-api.conf

[DEFAULT]
show_image_direct_url = True
[database]
connection = mysql+pymysql://glance:12345678@controller/glance
backend = sqlalchemy

[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password =  12345678

[paste_deploy]
flavor = keystone

[glance_store]
stores = file,http default_store = file
filesystem_store_datadir = /var/lib/glance/images/

[image_format]
disk_formats = ami,ari,aki,vhd,vhdx,vmdk,raw,qcow2,vdi,iso,ploop.root-tar

 

설정 파일의 권한을 변경합니다.

# chmod 640 /etc/glance/glance-api.conf
# chown root:glance /etc/glance/glance-api.conf

 

glance 관리 명령어 glance-manage 를 통해 glance 데이터베이스에 필요한 테이블을 생성합니다.

# su -s /bin/bash glance -c "glance-manage db_sync"

 

설정한 파일을 적용하기 위해 데몬을 재시작 합니다.

# systemctl restart glance-api

 

방화벽을 사용하고 있다면 glance-api, glance-registry 데몬 포트 (TCP 9191, TCP 9292) 를 허용해 주세요.

 

5) 검증 방법

cirros OS 이미지를 다운로드 받고, admin 환경에서 이미지를 생성합니다.

# wget http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img

# openstack image create "cirros" --file cirros-0.3.5-x86_64-disk.img --disk-format qcow2 --container-format bare --public

+------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| Field            | Value                                                                                                                                      |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| container_format | bare                                                                                                                                       |
| created_at       | 2023-07-06T00:22:42Z                                                                                                                       |
| disk_format      | qcow2                                                                                                                                      |
| file             | /v2/images/5cee962f-6018-4cf3-9027-3b03257d7d0f/file                                                                                       |
| id               | 5cee962f-6018-4cf3-9027-3b03257d7d0f                                                                                                       |
| min_disk         | 0                                                                                                                                          |
| min_ram          | 0                                                                                                                                          |
| name             | cirros                                                                                                                                     |
| owner            | 677861619c5445368a353ebeb0bcba2b                                                                                                           |
| properties       | os_hidden='False', owner_specified.openstack.md5='', owner_specified.openstack.object='images/cirros', owner_specified.openstack.sha256='' |
| protected        | False                                                                                                                                      |
| schema           | /v2/schemas/image                                                                                                                          |
| status           | queued                                                                                                                                     |
| tags             |                                                                                                                                            |
| updated_at       | 2023-07-06T00:22:42Z                                                                                                                       |
| visibility       | public                                                                                                                                     |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------+

 

이미지 생성된 것을 확인합니다.

# openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 5cee962f-6018-4cf3-9027-3b03257d7d0f | cirros | active |
+--------------------------------------+--------+--------+

 

 

4. Nova 설치

 

(Controller 서버에서)

1) 데이터베이스 및 계정 생성

nova_cell0 데이터 베이스는 nova-api, nova-conductor, nova-compute 서비스에 의해 사용되며 스케줄링에 실패한 인스턴스의 정보를 저장합니다.
placement 의 경우, 인스턴스 생성에 필요한 자원, 나머지 자원, 전체 사용량에 대한 정보를 저장하기 위해 사용됩니다.

 

# mysql -p

MariaDB [(none)]> create database nova;
MariaDB [(none)]> grant all privileges on nova.* to nova@'localhost' identified by '12345678';
MariaDB [(none)]> grant all privileges on nova.* to nova@'%' identified by '12345678';
MariaDB [(none)]> create database nova_api;
MariaDB [(none)]> grant all privileges on nova_api.* to nova@'localhost' identified by '12345678';
MariaDB [(none)]> grant all privileges on nova_api.* to nova@'%' identified by '12345678';
MariaDB [(none)]> create database nova_cell0;
MariaDB [(none)]> grant all privileges on nova_cell0.* to nova@'localhost' identified by '12345678';
MariaDB [(none)]> grant all privileges on nova_cell0.* to nova@'%' identified by '12345678';
MariaDB [(none)]> create database placement;
MariaDB [(none)]> grant all privileges on placement.* to placement@'localhost' identified by '12345678';
MariaDB [(none)]> grant all privileges on placement.* to placement@'%' identified by '12345678';
MariaDB [(none)]> flush privileges;

 

2) Nova 사용자, 서비스, 엔드포인트 생성

nova 사용자를 생성하고 role 을 추가합니다.

# openstack user create --domain default --project service --password 12345678 nova

+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| default_project_id  | 38f4f6c42e614625a309679c45db8a08 |
| domain_id           | default                          |
| enabled             | True                             |
| id                  | f50cd8f1bb594da68697b7bd5893fdf7 |
| name                | nova                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

 

# openstack role add --project service --user nova admin

 

placement 사용자를 생성하고 role 을 추가합니다.

# openstack user create --domain default --project service --password 12345678 placement

+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| default_project_id  | 38f4f6c42e614625a309679c45db8a08 |
| domain_id           | default                          |
| enabled             | True                             |
| id                  | c51301d9aabc47af86673f151cd5532c |
| name                | placement                        |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

 

# openstack role add --project service --user placement admin

 

nova 및 placement 서비스를 생성합니다.

# openstack service create --name nova --description "OpenStack Compute service" compute

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Compute service        |
| enabled     | True                             |
| id          | 27e1df36ca7d49938bfd9d60550462b5 |
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+

 

# openstack service create --name placement --description "Openstack Compute Placement service" placement

+-------------+-------------------------------------+
| Field       | Value                               |
+-------------+-------------------------------------+
| description | Openstack Compute Placement service |
| enabled     | True                                |
| id          | e5c63604451544fc9313069c6f8056ad    |
| name        | placement                           |
| type        | placement                           |
+-------------+-------------------------------------+

 

nova 및 placement 엔드포인트를 생성합니다.

# openstack endpoint create --region AZ1 compute public http://controller:8774/v2.1/%\(tenant_id\)s

+--------------+-------------------------------------------+
| Field        | Value                                     |
+--------------+-------------------------------------------+
| enabled      | True                                      |
| id           | f6c634f7903d40cdbb93d72acc4175d0          |
| interface    | public                                    |
| region       | AZ1                                       |
| region_id    | AZ1                                       |
| service_id   | 27e1df36ca7d49938bfd9d60550462b5          |
| service_name | nova                                      |
| service_type | compute                                   |
| url          | http://controller:8774/v2.1/%(tenant_id)s |
+--------------+-------------------------------------------+

 

# openstack endpoint create --region AZ1 compute internal http://controller:8774/v2.1/%\(tenant_id\)s

+--------------+-------------------------------------------+
| Field        | Value                                     |
+--------------+-------------------------------------------+
| enabled      | True                                      |
| id           | 1196854aa45f437dacddcb7757f8229c          |
| interface    | internal                                  |
| region       | AZ1                                       |
| region_id    | AZ1                                       |
| service_id   | 27e1df36ca7d49938bfd9d60550462b5          |
| service_name | nova                                      |
| service_type | compute                                   |
| url          | http://controller:8774/v2.1/%(tenant_id)s |
+--------------+-------------------------------------------+

 

# openstack endpoint create --region AZ1 compute admin http://controller:8774/v2.1/%\(tenant_id\)s

+--------------+-------------------------------------------+
| Field        | Value                                     |
+--------------+-------------------------------------------+
| enabled      | True                                      |
| id           | 4ad6b5fb561f44b18b485c90c31dd7d6          |
| interface    | admin                                     |
| region       | AZ1                                       |
| region_id    | AZ1                                       |
| service_id   | 27e1df36ca7d49938bfd9d60550462b5          |
| service_name | nova                                      |
| service_type | compute                                   |
| url          | http://controller:8774/v2.1/%(tenant_id)s |
+--------------+-------------------------------------------+

 

# openstack endpoint create --region AZ1 placement public http://controller:8778

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 43655df1d7514d8d8e33d1de68e6ffcf |
| interface    | public                           |
| region       | AZ1                              |
| region_id    | AZ1                              |
| service_id   | e5c63604451544fc9313069c6f8056ad |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+

 

# openstack endpoint create --region AZ1 placement internal http://controller:8778

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 20364072c19e42be973e175227057bb3 |
| interface    | internal                         |
| region       | AZ1                              |
| region_id    | AZ1                              |
| service_id   | e5c63604451544fc9313069c6f8056ad |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+

 

# openstack endpoint create --region AZ1 placement admin http://controller:8778

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | f5b2f83c4dc74adbbcae3242485c5ba5 |
| interface    | admin                            |
| region       | AZ1                              |
| region_id    | AZ1                              |
| service_id   | e5c63604451544fc9313069c6f8056ad |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+

 

3) Nova 패키지 설치 및 설정

# apt-get -y install nova-api nova-conductor nova-scheduler nova-novncproxy placement-api python3-novaclient

# vi /etc/nova/nova.conf

[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:12345678@controller
my_ip = 115.68.142.99
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver

[api_database]
connection = mysql+pymysql://nova:12345678@controller/nova_api

[database]
connection = mysql+pymysql://nova:12345678@controller/nova
[api]
auth_strategy = keystone

[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = 12345678

[vnc]
enabled = true
vncserver_listen = 115.68.142.99
vncserver_proxyclient_address = 115.68.142.99

[glance]
api_servers = http://controller:9292

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

[placement]
os_region_name = AZ1
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = 12345678

[wsgi]
api_paste_config = /etc/nova/api-paste.ini

[quota]
instances = -1
cores = -1
ram = -1
floating_ips = -1
fixed_ips = -1

 

* quota 섹션의 -1 값은 사용할 수 있는 자원의 최대치 (무한대) 를 뜻합니다.

 

설정파일의 권한을 변경합니다.

# chmod 640 /etc/nova/nova.conf

# chgrp nova /etc/nova/nova.conf

 

# vi /etc/placement/placement.conf

[DEFAULT]
debug = false

[api]
auth_strategy = keystone

[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = placement
password = 12345678

[placement_database]
connection = mysql+pymysql://placement:12345678@controller/placement

 

설정파일의 권한을 변경합니다.

# chmod 640 /etc/placement/placement.conf

# chgrp placement /etc/placement/placement.conf

 

4) 데이터베이스 추가

# su -s /bin/bash placement -c "placement-manage db sync"
# su -s /bin/bash nova -c "nova-manage api_db sync"
# su -s /bin/bash nova -c "nova-manage cell_v2 map_cell0"
# su -s /bin/bash nova -c "nova-manage db sync"
# su -s /bin/bash nova -c "nova-manage cell_v2 create_cell --name cell0"

 

5) 서비스 재시작

# systemctl restart apache2

# systemctl restart nova-api
# systemctl restart nova-conductor
# systemctl restart nova-scheduler
# systemctl restart nova-novncproxy

# openstack compute service list
+----+----------------+------------+----------+---------+-------+----------------------------+
| ID | Binary         | Host       | Zone     | Status  | State | Updated At                 |
+----+----------------+------------+----------+---------+-------+----------------------------+
|  8 | nova-conductor | controller | internal | enabled | up    | 2023-07-06T01:09:31.000000 |
| 14 | nova-scheduler | controller | internal | enabled | up    | 2023-07-06T01:09:30.000000 |
+----+----------------+------------+----------+---------+-------+----------------------------+

 

방화벽을 사용하고 있다면 nova 관련 데몬 포트 (TCP 6080, TCP 8774, TCP 8775, TCP 8778) 를 허용해 주세요.

 

6) Nova 패키지 설치

지금까지 Controller 에서 설치, 설정을 진행했는데, Compute 서버와 통신하고 정상 동작하기 위해 Compute 서버에서도 패키지를 설치하고 설정을 해주어야 합니다.

(Compute 서버에서)

# apt-get -y install nova-compute nova-compute-kvm

# vi /etc/nova/nova.conf

[DEFAULT]
lock_path = /var/lock/nova
state_path = /var/lib/nova
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:12345678@controller
my_ip = 115.68.142.101
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver

[api]
auth_strategy = keystone

[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = 12345678

[vnc]
enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = 115.68.142.101
novncproxy_base_url = http://controller:6080/vnc_auto.html

[glance]
api_servers = http://controller:9292

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

[placement]
os_region_name = AZ1
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = 12345678

 

가상화 모듈이 지원 가능한지 확인합니다.

# lsmod | grep kvm
kvm_intel             282624  0
kvm                   663552  1 kvm_intel

 

# systemctl restart nova-compute libvirtd

 

Controller 서버에서 compute 노드를 확인합니다.

(Controller 서버에서)

# su -s /bin/bash nova -c "nova-manage cell_v2 discover_hosts"

# openstack compute service list

+----+----------------+------------+----------+---------+-------+----------------------------+
| ID | Binary         | Host       | Zone     | Status  | State | Updated At                 |
+----+----------------+------------+----------+---------+-------+----------------------------+
|  8 | nova-conductor | controller | internal | enabled | up    | 2023-07-06T01:36:37.000000 |
| 14 | nova-scheduler | controller | internal | enabled | up    | 2023-07-06T01:36:39.000000 |
| 22 | nova-compute   | compute    | nova     | enabled | up    | 2023-07-06T01:36:37.000000 |
+----+----------------+------------+----------+---------+-------+----------------------------+

 

새로운 compute 노드를 추가할 때 controller 서버에서 nova-manage cell_v2 discover_hosts 를 꼭 실행해야 합니다.

또는 /etc/nova/nova.conf 에서 적절한 interval 을 설정 할 수 있습니다.

[scheduler]
discover_hosts_in_cells_interval = 300

 

 

5. Horizon 설치

 

(Controller 서버에서)

1) Horizon 패키지 설치

# apt-get -y install openstack-dashboard

# vi /etc/openstack-dashboard/local_settings.py

...

:99번째줄 (IP 수정)
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '115.68.142.99:11211',
    },
}

:112번째줄 추가 (Memcached 섹션 저장 서비스 구성)
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"

:126번째줄 (Controller IP 로 수정, Identity API 버전3 활성화)
OPENSTACK_HOST = "115.68.142.99"
OPENSTACK_KEYSTONE_URL = "http://controller:5000/v3"

:131번째줄 (표준시간 설정)
TIME_ZONE = "Asia/Seoul"

: 맨아래 추가 (Default 를 대시보드를 통해 사용자에 대한 디폴트 도메인으로 구성)
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'

 

# systemctl restart apache2

 

2) 대시보드 접속

웹브라우저에서 Controller 서버 IP 뒤에 /horizon 을 추가하여 접속하면 대시보드가 출력됩니다.

http://115.68.142.99/horizon

 

 

6. Neutron 설치

 

(Controller 서버에서)

1) Neutron 데이터베이스 및 사용자를 생성

# mysql -p

MariaDB [(none)]> create database neutron;
MariaDB [(none)]> grant all privileges on neutron.* to neutron@'localhost' identified by '12345678';
MariaDB [(none)]> grant all privileges on neutron.* to neutron@'%' identified by '12345678';
MariaDB [(none)]> flush privileges;

 

2) Neutron 사용자, 서비스, 엔드포인트 생성

# openstack user create --domain default --project service --password 12345678 neutron

+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| default_project_id  | 38f4f6c42e614625a309679c45db8a08 |
| domain_id           | default                          |
| enabled             | True                             |
| id                  | d62dec54e0384ef0b2b61c09a1fe2161 |
| name                | neutron                          |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

 

# openstack role add --project service --user neutron admin

# openstack service create --name neutron --description "Openstack Networking service" network

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Openstack Networking service     |
| enabled     | True                             |
| id          | 6e80e82fa3294924a38cbb032ac8a04b |
| name        | neutron                          |
| type        | network                          |
+-------------+----------------------------------+

 

# openstack endpoint create --region AZ1 network public http://controller:9696

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 414f06489a1345f88aaf7af3754c4fc5 |
| interface    | public                           |
| region       | AZ1                              |
| region_id    | AZ1                              |
| service_id   | 6e80e82fa3294924a38cbb032ac8a04b |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+

 

# openstack endpoint create --region AZ1 network internal http://controller:9696

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 9a44b4b468db496793b786a1a73ad8b6 |
| interface    | internal                         |
| region       | AZ1                              |
| region_id    | AZ1                              |
| service_id   | 6e80e82fa3294924a38cbb032ac8a04b |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+

 

# openstack endpoint create --region AZ1 network admin http://controller:9696

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 86b8980507f84e71b41dcaf57c9bcb96 |
| interface    | admin                            |
| region       | AZ1                              |
| region_id    | AZ1                              |
| service_id   | 6e80e82fa3294924a38cbb032ac8a04b |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+

 

3) Neutron 패키지 설치 및 설정

# apt-get -y install neutron-server

# vi /etc/neutron/neutron.conf

[DEFAULT]
core_plugin = ml2

service_plugins = router
allow_overlapping_ips = true
transport_url = rabbit://openstack:12345678@controller
auth_strategy = keystone
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
network_auto_schedule = True
router_auto_schedule = True
allow_automatic_dhcp_failover = True
allow_automatic_l3agent_failover = True
agent_down_time = 60
allow_automatic_lbaas_agent_failover = true
#global_physnet_mtu = 1550
use_syslog = True
syslog_log_facility = LOG_LOCAL1
#dhcp_agents_per_network = 3

[oslo_messaging_rabbit]
#pool_max_size = 50
#pool_max_overflow = 50
#pool_timeout = 30

[agent]
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf

[database]
connection = mysql+pymysql://neutron:12345678@controller/neutron
max_pool_size = 50
retry_interval = 10
max_overflow = 50

[keystone_authtoken]
auth_url = http://controller:5000/v3
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 12345678

[nova]
auth_url = http://controller:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = AZ1
project_name = service
username = nova
password = 12345678

 

ml2.conf 파일을 수정 합니다.

ml2 플러그인은 인스턴스에게 Layer2 가상 네트워크 인프라를 제공하는 리눅스 브리지 기술입니다.

# vi /etc/neutron/plugins/ml2/ml2_conf.ini

[DEFAULT]
[ml2]
type_drivers = flat,vlan,vxlan,gre
tenant_network_types = vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security
#path_mtu = 1550

[ml2_type_flat]
flat_networks = provider
[ml2_type_vxlan]
vni_ranges = 1:1000
[securitygroup]
enable_ipset = True

 

nova.conf 파일에 Neutron 내용을 추가합니다.

# vi /etc/nova/nova.conf

[DEFAULT]
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver

[neutron]
url = http://controller:9696
auth_url = http://controller:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = AZ1
project_name = service
username = neutron
password = 12345678
service_metadata_proxy = True
metadata_proxy_shared_secret = 12345678

 

# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

 

4) 데이터베이스 테이블 추가 및 Neutron 재시작

# su -s /bin/bash neutron -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini upgrade head"

# systemctl restart neutron-server

 

방화벽을 사용하고 있다면 neutron 데몬 포트 (TCP 9696) 를 허용해 주세요.

 

5) Nuetron 패키지 설치

지금까지 Controller 에서 설치, 설정을 진행했는데, Neutron 서버와 통신하고 정상 동작하기 위해 Neutron 서버에서도 패키지를 설치하고 설정을 해주어야 합니다.

 

(Neutron 서버에서)

IP4 포워딩 내용을 아래 파일에 추가하고 적용합니다.

# vi /etc/sysctl.conf

...
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.ip_forward = 0

 

# sysctl -p
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.ip_forward = 0

 

패키지를 설치하고 파일을 설정합니다.

# apt-get -y install neutron-openvswitch-agent neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent neutron-plugin-ml2

# vi /etc/neutron/neutron.conf

[DEFAULT]
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = true
transport_url = rabbit://openstack:12345678@controller
auth_strategy = keystone
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
use_syslog = True
syslog_log_facility = LOG_LOCAL1

[oslo_messaging_rabbit]
pool_max_size = 50
pool_max_overflow = 50
pool_timeout = 30

[agent]
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf

[keystone_authtoken]
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 12345678

 

openvswitch_agent.ini 파일을 수정합니다.

이 파일은 openvswitch 플러그인을 사용하기 위한 용도로 쓰입니다.

# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini

[DEFAULT]

[agent]
tunnel_types = vxlan
l2_population = True
ovsdb_monitor_respawn_interval = 30

[ovs]
bridge_mappings = provider:br0
local_ip = 115.68.142.100

[securitygroup]
firewall_driver = openvswitch
enable_security_group = false
enable_ipset = true

 

metadata_agent.ini 파일을 수정합니다.

이 파일은 metadata 에이전트가 사용하는 파일로써 인증정보와 같은 설정정보를 인스턴스에게 제공합니다.

# vi /etc/neutron/metadata_agent.ini

[DEFAULT]
nova_metadata_host = controller
metadata_proxy_shared_secret = 12345678

 

dhcp_agent.ini 파일을 수정합니다.

이 파일은 dhcp 에이전트가 사용하는 파일로써 가상네트워크에 dhcp 서비스를 제공합니다.

# vi /etc/neutron/dhcp_agent.ini

[DEFAULT]
interface_driver = openvswitch
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
enable_metadata_network = True
force_metadata = True

[ovs]
ovsdb_timeout = 600

 

l3_agent.ini 파일을 수정합니다.

이 파일은 L3 에이전트가 사용하는 파일로써 셀프서비스 가상 네트워크에 라우팅과 NAT서비스를 제공하는 역할을 합니다.

# vi /etc/neutron/l3_agent.ini

[DEFAULT]
interface_driver = openvswitch
external_network_bridge =
verbose = True
[ovs]

 

지금까지 설정했던 Neutron 관련 데몬을 재시작 하여 설정을 적용합니다.

# systemctl restart neutron-dhcp-agent
# systemctl restart neutron-l3-agent
# systemctl restart neutron-metadata-agent
# systemctl restart neutron-openvswitch-agent
# systemctl restart openvswitch-switch

 

6) 인터페이스 ovs 설정 및 rc.local 설정

기본 설치되어 있는 netplan 을 사용하지 말고 되도록 ifupdown 패키지를 이용합니다.

# apt-get -y install ifupdown

# vi /etc/network/interfaces

...

auto eno1
iface eno1 inet manual

auto br0
iface br0 inet static
address 115.68.142.100
netmask 255.255.255.224
gateway 115.68.142.97

 

서버가 부팅될때 아래내용이 자동으로 실행될 수 있도록 합니다.

아래 파일을 생성하여 내용을 작성합니다.

# vi /etc/rc.local

#!/bin/bash

ovs-vsctl del-br br0
ovs-vsctl add-br br0
ovs-vsctl add-port br0 eno1

systemctl restart neutron-openvswitch-agent neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent
systemctl restart networking

exit 0

 

파일 내용이 실행될 수 있는 권한을 줍니다.

# chmod 755 /etc/rc.local

 

서비스 실행파일에 아래와 같이 내용 추가후 부팅시 활성화 될 수 있도록 합니다.

# vi /lib/systemd/system/rc-local.service

...

[Install]
WantedBy=multi-user.target

 

# systemctl enable --now rc-local

 

Netplan 을 부팅시 사용하지 않도록 비활성화 하고, 설정을 읽을 수 없도록 /etc/netplan 디렉토리 내의 모든 netplan 설정 파일 이름을 변경합니다.

# systemctl disable systemd-networkd

# mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak

# mv /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak


ifupdown 을 부팅시 사용하도록 활성화 합니다.
# systemctl enable networking

 

부팅시 resolv.conf 파일이 초기화 되지 않도록 합니다.

# apt-get -y install resolvconf

# echo "nameserver 8.8.8.8" >> /etc/resolvconf/resolv.conf.d/head

# resolvconf -u


현재까지의 네트워크 설정을 재부팅하여 적용하고 잘 동작하는지 확인합니다.
# reboot

 

7) Neutron 패키지 설치 및 설정

지금까지 Controller, Neutron 에서 설치, 설정을 진행했는데, Compute 서버와 통신하고 정상 동작하기 위해 Compute 서버에서도 패키지를 설치하고 설정을 해주어야 합니다.

 

(Compute 서버에서)

# apt-get -y install neutron-server openvswitch-switch neutron-openvswitch-agent neutron-l3-agent

# vi /etc/neutron/neutron.conf

[DEFAULT]
core_plugin = ml2
transport_url = rabbit://openstack:12345678@controller
auth_strategy = keystone
syslog_log_facility = LOG_LOCAL1
use_syslog = True
rpc_response_timeout=1200

[agent]
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf

[keystone_authtoken]
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 12345678

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp

 

# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini

[DEFAULT]
[agent]
tunnel_types = vxlan
l2_population = True
ovsdb_monitor_respawn_interval = 30

[ovs]
local_ip = 115.68.142.101
bridge_mappings = provider:br0

[securitygroup]
firewall_driver = openvswitch
enable_security_group = false
enable_ipset = true

 

# vi /etc/neutron/l3_agent.ini

[DEFAULT]
interface_driver = openvswitch
external_network_bridge =
verbose = True

 

# vi /etc/nova/nova.conf

...

[neutron]
url = http://controller:9696
auth_url = http://controller:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = AZ1
project_name = service
username = neutron
password = 12345678

 

지금까지 설정했던 Neutron 관련 데몬을 재시작 하여 설정을 적용합니다.

# systemctl restart neutron-server

# systemctl restart nova-compute

 

8) 인터페이스 ovs 설정 및 rc.local 설정

기본 설치되어 있는 netplan 을 사용하지 말고 되도록 ifupdown 패키지를 이용합니다.

# apt-get -y install ifupdown

# vi /etc/network/interfaces

...

auto eno1
iface eno1 inet manual

auto br0
iface br0 inet static
address 115.68.142.101
netmask 255.255.255.224
gateway 115.68.142.97

 

서버가 부팅될때 아래내용이 자동으로 실행될 수 있도록 합니다.

아래 파일을 생성하여 내용을 작성합니다.

# vi /etc/rc.local

#!/bin/bash

ovs-vsctl del-br br0
ovs-vsctl add-br br0
ovs-vsctl add-port br0 eno1

systemctl restart openvswitch-switch neutron-openvswitch-agent
systemctl restart networking
sleep 10
systemctl restart neutron-openvswitch-agent nova-compute

exit 0

 

파일 내용이 실행될 수 있는 권한을 줍니다.

# chmod 755 /etc/rc.local

 

서비스 실행파일에 아래와 같이 내용 추가후 부팅시 활성화 될 수 있도록 합니다.

# vi /lib/systemd/system/rc-local.service

...

[Install]
WantedBy=multi-user.target

 

# systemctl enable --now rc-local

 

Netplan 을 부팅시 사용하지 않도록 비활성화 하고, 설정을 읽을 수 없도록 /etc/netplan 디렉토리 내의 모든 netplan 설정 파일 이름을 변경합니다.

# systemctl disable systemd-networkd

# mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak

# mv /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak


ifupdown 을 부팅시 사용하도록 활성화 합니다.
# systemctl enable networking

 

부팅시 resolv.conf 파일이 초기화 되지 않도록 합니다.

# apt-get -y install resolvconf

# echo "nameserver 8.8.8.8" >> /etc/resolvconf/resolv.conf.d/head

# resolvconf -u


현재까지의 네트워크 설정을 재부팅하여 적용하고 잘 동작하는지 확인합니다.
# reboot

 

(Controller 서버에서)

Neutron 설정이 잘 되었는지 컨트롤러 서버에서 확인합니다.

# openstack network agent list

+--------------------------------------+--------------------+---------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host    | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+---------+-------------------+-------+-------+---------------------------+
| 015f70db-ed34-48f0-89aa-c46628f53c23 | Metadata agent     | compute | None              | :-)   | UP    | neutron-metadata-agent    |
| 08c999e6-d746-4267-8113-3db128625588 | L3 agent           | compute | nova              | :-)   | UP    | neutron-l3-agent          |
| 9b1fdb08-e982-4811-a956-541d1022e751 | Open vSwitch agent | neutron | None              | :-)   | UP    | neutron-openvswitch-agent |
| b390e1e8-0c69-4bc5-8bd5-37dda5eed35f | Metadata agent     | neutron | None              | :-)   | UP    | neutron-metadata-agent    |
| f51b1e0e-d00e-427c-9c67-56ad9f7292cd | DHCP agent         | neutron | nova              | :-)   | UP    | neutron-dhcp-agent        |
+--------------------------------------+--------------------+---------+-------------------+-------+-------+---------------------------+

 

Controller 서버와 VM 서버의 IP 통신이 가능하면 관리가 편리하므로 미리 Controller 서버에서도 사설 대역을 추가해줍니다.

(나중에 VM 에 공인 IP 로 192.168.0.x 를 추가할 예정 : https://sysdocu.tistory.com/1836)

 

(Controller 서버에서)

기본 설치되어 있는 netplan 을 사용하지 말고 되도록 ifupdown 패키지를 이용합니다.

# apt-get -y install ifupdown

# vi /etc/network/interfaces

...

auto eno1
iface eno1 inet static
    address 115.68.142.99
    netmask 255.255.255.224
    gateway 115.68.142.97

iface eno1 inet static
    address 192.168.0.10
    netmask 255.255.255.0

 

Netplan 을 부팅시 사용하지 않도록 비활성화 하고, 설정을 읽을 수 없도록 /etc/netplan 디렉토리 내의 모든 netplan 설정 파일 이름을 변경합니다.

# systemctl disable systemd-networkd

# mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak

# mv /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak


ifupdown 을 부팅시 사용하도록 활성화 합니다.
# systemctl enable networking

 

부팅시 resolv.conf 파일이 초기화 되지 않도록 합니다.

# apt-get -y install resolvconf

# echo "nameserver 8.8.8.8" >> /etc/resolvconf/resolv.conf.d/head

# resolvconf -u


현재까지의 네트워크 설정을 재부팅하여 적용하고 잘 동작하는지 확인합니다.
# reboot

 

 

7. Cinder 설치

 

(Controller 서버에서)

1) Cinder 데이터베이스 및 계정 생성

# mysql -p

MariaDB [(none)]> create database cinder;

MariaDB [(none)]> grant all privileges on cinder.* to cinder@'localhost' identified by '12345678';
MariaDB [(none)]> grant all privileges on cinder.* to cinder@'%' identified by '12345678';
MariaDB [(none)]> flush privileges;

 

2) Cinder 사용자 및 서비스 등록
# openstack user create --domain default --password 12345678 cinder

+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | c1833292afec47658596f7a3771337b8 |
| name                | cinder                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+


# openstack role add --project service --user cinder admin
# openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Block Storage          |
| enabled     | True                             |
| id          | eb4c53c170a643a08068485439f32a83 |
| name        | cinderv2                         |
| type        | volumev2                         |
+-------------+----------------------------------+


# openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Block Storage          |
| enabled     | True                             |
| id          | 3263f76988c04a84814c62cce4b4ce6f |
| name        | cinderv3                         |
| type        | volumev3                         |
+-------------+----------------------------------+

 

# openstack endpoint create --region AZ1 volumev2 public http://controller:8776/v2/%\(project_id\)s

+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 0c3040f43f404434b04b96d9986d1e3e         |
| interface    | public                                   |
| region       | AZ1                                      |
| region_id    | AZ1                                      |
| service_id   | eb4c53c170a643a08068485439f32a83         |
| service_name | cinderv2                                 |
| service_type | volumev2                                 |
| url          | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+

 

# openstack endpoint create --region AZ1 volumev2 internal http://controller:8776/v2/%\(project_id\)s

+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | f2fce6f293da42fa87f31c93ad85fd9c         |
| interface    | internal                                 |
| region       | AZ1                                      |
| region_id    | AZ1                                      |
| service_id   | eb4c53c170a643a08068485439f32a83         |
| service_name | cinderv2                                 |
| service_type | volumev2                                 |
| url          | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+


# openstack endpoint create --region AZ1 volumev2 admin http://controller:8776/v2/%\(project_id\)s

+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | b9edd3f7f1664a0aab6bdfb357a4a2a2         |
| interface    | admin                                    |
| region       | AZ1                                      |
| region_id    | AZ1                                      |
| service_id   | eb4c53c170a643a08068485439f32a83         |
| service_name | cinderv2                                 |
| service_type | volumev2                                 |
| url          | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+


# openstack endpoint create --region AZ1 volumev3 public http://controller:8776/v3/%\(project_id\)s

+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 595deda044bc40378148f61a9849ee7e         |
| interface    | public                                   |
| region       | AZ1                                      |
| region_id    | AZ1                                      |
| service_id   | 3263f76988c04a84814c62cce4b4ce6f         |
| service_name | cinderv3                                 |
| service_type | volumev3                                 |
| url          | http://controller:8776/v3/%(project_id)s |
+--------------+------------------------------------------+

 

# openstack endpoint create --region AZ1 volumev3 internal http://controller:8776/v3/%\(project_id\)s

+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | f38d56eb94d94b05a16707b04e0ee446         |
| interface    | internal                                 |
| region       | AZ1                                      |
| region_id    | AZ1                                      |
| service_id   | 3263f76988c04a84814c62cce4b4ce6f         |
| service_name | cinderv3                                 |
| service_type | volumev3                                 |
| url          | http://controller:8776/v3/%(project_id)s |
+--------------+------------------------------------------+

 

# openstack endpoint create --region AZ1 volumev3 admin http://controller:8776/v3/%\(project_id\)s
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 28dd03c124d04dc19490cd5499f36048         |
| interface    | admin                                    |
| region       | AZ1                                      |
| region_id    | AZ1                                      |
| service_id   | 3263f76988c04a84814c62cce4b4ce6f         |
| service_name | cinderv3                                 |
| service_type | volumev3                                 |
| url          | http://controller:8776/v3/%(project_id)s |
+--------------+------------------------------------------+


3) 패키지 설치 및 환경설정
# apt-get -y install cinder-api cinder-scheduler
# vi /etc/cinder/cinder.conf

[DEFAULT]
transport_url = rabbit://openstack:12345678@controller
auth_strategy = keystone
my_ip = 115.68.142.99

[database]
connection = mysql+pymysql://cinder:12345678@controller/cinder

[keystone_authtoken]
www_authenticate_url = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = 12345678

[oslo_concurrency]
lock_path = /var/lib/cinder/tmp


데이터베이스 테이블을 생성합니다.
# su -s /bin/sh -c "cinder-manage db sync" cinder

 

Nova 설정 파일에 Cinder 섹션을 추가 합니다.

# vi /etc/nova/nova.conf

...

[cinder]
os_region_name = AZ1


데몬을 재시작하여 설정한 내용을 반영합니다.
# systemctl restart nova-api
# systemctl restart cinder-scheduler
# systemctl restart apache2

4) Storage 서버 설정

지금까지 Controller 에서 설치, 설정을 진행했는데, Storage 서버와 통신하고 정상 동작하기 위해 Storage 서버에서도 패키지를 설치하고 설정을 해주어야 합니다.

(Storage 서버에서)
# apt-get -y install lvm2 thin-provisioning-tools

이미지를 저장할 두번째 하드 디스크가 필요한데, 장착 후에 파티션을 생성하지 않은 상태에서 아래와 같이 실행합니다.

# pvcreate /dev/sdb

  Physical volume "/dev/sdb" successfully created.

 

# vgcreate cinder-volumes /dev/sdb

  Volume group "cinder-volumes" successfully created

 

# pvdisplay

  --- Physical volume ---
  PV Name               /dev/sdb
  VG Name               cinder-volumes
  PV Size               <232.89 GiB / not usable <3.18 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              59618
  Free PE               59618
  Allocated PE          0
  PV UUID               BnFfxK-A80q-HCPm-upNP-FCit-4wQt-iJxhOK

 

# vgdisplay

  --- Volume group ---
  VG Name               cinder-volumes
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               232.88 GiB
  PE Size               4.00 MiB
  Total PE              59618
  Alloc PE / Size       0 / 0   
  Free  PE / Size       59618 / 232.88 GiB
  VG UUID               UIE0CZ-iI3n-bSTC-zMGj-VZFX-EwNs-hbgNyi

# vi /etc/lvm/lvm.conf

...

devices {
        ...
        filter = [ "a/sdb/", "r/.*/" ]
        ...
}

...

 

위에서 sdb 는 디스크 장치명입니다.

 

# apt-get -y install cinder-volume

# vi /etc/cinder/cinder.conf

[DEFAULT]
rootwrap_config = /etc/cinder/rootwrap.conf
api_paste_confg = /etc/cinder/api-paste.ini
iscsi_helper = tgtadm
volume_name_template = volume-%s
volume_group = cinder-volumes
verbose = True
auth_strategy = keystone
state_path = /var/lib/cinder
lock_path = /var/lock/cinder
volumes_dir = /var/lib/cinder/volumes
enabled_backends = lvm
transport_url = rabbit://openstack:12345678@controller
my_ip = 115.68.142.99
glance_api_servers = http://controller:9292

[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
[database]
connection = mysql+pymysql://cinder:12345678@controller/cinder

[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = 12345678

[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
target_protocol = iscsi
target_helper = tgtadm

 

# systemctl restart cinder-volume

# systemctl restart tgt

 

Controller 서버에서 볼륨 서비스를 확인합니다.

(Controller 서버에서)

# openstack volume service list
+------------------+-------------+------+---------+-------+----------------------------+
| Binary           | Host        | Zone | Status  | State | Updated At                 |
+------------------+-------------+------+---------+-------+----------------------------+
| cinder-scheduler | controller  | nova | enabled | up    | 2023-07-06T22:53:51.000000 |
| cinder-volume    | storage@lvm | nova | enabled | up    | 2023-07-06T22:53:53.000000 |
+------------------+-------------+------+---------+-------+----------------------------+

 

반응형

댓글()

[MySQL] AUTO_INCREMENT 초기화

리눅스/MySQL|2023. 7. 4. 16:27
반응형

[ 현재 auto_increment 확인 ]

 

아래 예제는 list 테이블의 auto_increment 값을 확인하는 쿼리이며, Auto_increment 컬럼에서 다음 순번을 확인할 수 있습니다.

 

mysql> show table status like 'list';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation          | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
| list | InnoDB |      10 | Dynamic    |    0 |              0 |       16384 |               0 |        32768 |         0 |        3855011 | 2023-01-17 08:29:02 | NULL        | NULL       | utf8mb3_general_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+

 

 

[ auto_increment 초기화 ]

 

mysql> alter table [테이블명] auto_increment='1';

 

설정 후, 다음 insert 쿼리의 값은 1 번으로 입력됩니다.

 

반응형

댓글()

oc get co/dns 실행 에러 DNS "default" reports Progressing=True: "Have 4 available DNS pods, want 5."

리눅스/OpenShift|2023. 6. 30. 10:24
반응형

원인 파악 도중 특정 노드에 원격접속이 되지 않아 결국 리부팅으로 해결하여 절차만 기록해두었습니다.

 

아래와 같은 에러가 발생했을때

# oc get co/dns
NAME   VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
dns    4.12.0    True        True          False      49d     DNS "default" reports Progressing=True: "Have 4 available DNS pods, want 5."

 

DNS Pod 를 확인합니다.

# oc get pod -n openshift-dns
NAME                  READY   STATUS             RESTARTS       AGE
dns-default-d88tp     2/2     Running            0              49d
dns-default-jk4gh     0/2     CrashLoopBackOff   988 (7s ago)   49d
dns-default-lklsh     2/2     Running            0              49d
dns-default-svtxz     2/2     Running            0              49d
dns-default-z2plz     2/2     Running            0              49d
node-resolver-8m85h   1/1     Running            0              49d
node-resolver-h6g59   1/1     Running            0              49d
node-resolver-nchv9   1/1     Running            0              49d
node-resolver-s927r   1/1     Running            0              49d
node-resolver-xwltt   1/1     Running            0              49d

 

dns-default 이름의 Pod 는 노드의 개수만큼 존재 하는데, master node, worker node 가 모두 5개인데, 4개만 사용 가능하다고 출력되고 있습니다.

문제가 발생한 Pod 는 어느 노드의 Pod 인지 확인합니다.

# oc get pod dns-default-jk4gh -n openshift-dns -o wide

NAME                READY   STATUS             RESTARTS           AGE   IP           NODE                      NOMINATED NODE   READINESS GATES
dns-default-jk4gh   0/2     CrashLoopBackOff   1001 (3m47s ago)   49d   10.131.0.6   worker01.az1.sysdocu.kr   <none>           <none>

 

worker01 임을 확인하였습니다.

해당 Pod 의 로그를 확인합니다.

# oc logs dns-default-jk4gh -n openshift-dns
Defaulted container "dns" out of: dns, kube-rbac-proxy
open exec fifo /proc/self/fd/5: too many open files in system

 

좀 더 자세한 문제 확인을 위해 worker01 서버에 접속합니다.

# ssh core@115.68.142.104
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

 

접근 불가가 확인되었습니다. 참고로 다른 노드로는 원격접속이 원활히 진행되었습니다.

worker01 노드에 원격접근 자체가 불가능하여 해당 서버를 리부팅 하였고, 그 이후 dns-default 가 정상으로 돌아왔습니다.

# oc get pod dns-default-jk4gh -n openshift-dns -o wide
NAME                READY   STATUS    RESTARTS   AGE   IP            NODE                      NOMINATED NODE   READINESS GATES
dns-default-jk4gh   2/2     Running   1007       49d   10.131.0.13   worker01.az1.sysdocu.kr   <none>           <none>

 

# oc get co/dns
NAME   VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
dns    4.12.0    True        False         False      49d  

 

콘솔에서 worker01 노드에 로그인이 가능하도록 root 패스워드 설정을 해놓으면 원인을 파악할 수 있던 상황이였는데 core 계정으로 네트워크 로그인만 가능하도록 되어 있어 어쩔수 없이 리부팅하였으며, 이를 계기로 모든 노드에 root 패스워드 설정을 진행하였습니다.

 

참고로, dns 에러 외에 oc get co 명령으로 보였던 몇가지 항목의 에러가 위 조치로 인해 모두 해결되었습니다.

 

image-registry                             4.12.0    True        True          False      49d     Progressing: The registry is ready...


ingress                                    4.12.0    True        True          True       49d     The "default" ingress controller reports Degraded=True: DegradedConditions: One or more other status conditions indicate a degraded state: DeploymentReplicasAllAvailable=False (DeploymentReplicasNotAvailable: 1/2 of replicas are available)

 

monitoring                                 4.12.0    False       True          True       42h     reconciling Prometheus Operator Admission Webhook Deployment failed: updating Deployment object failed: waiting for DeploymentRollout of openshift-monitoring/prometheus-operator-admission-webhook: got 1 unavailable replicas

 

network                                    4.12.0    True        True          False      49d     DaemonSet "/openshift-network-diagnostics/network-check-target" is not available (awaiting 1 nodes)...

 

반응형

댓글()

Openshift / Kubernetes 파드 (Pod) 스케쥴링 - Affinity 옵션

리눅스/OpenShift|2023. 6. 23. 11:41
반응형

Replicas 또는 ReplicaSet 구성후 운영중인 Pod 가 삭제될때, 가용성을 따져보아 다른 worker node 로 재생성되기도 하는데, 여기에서는 Affinity 기능을 이용해 같은 worker node 로 재생성 되도록 하는 방법을 알아봅니다. Affinity 는 worker node 에 Pod 를 배치할때 사용하는 옵션입니다.

 

우선 노드 선택이 가능하도록 노드에 라벨을 추가하여, 키와 값을 입력합니다.

현재 아래와 같이 worker node 가 두개 있는데, 이 노드에 키와 값을 입력해주겠습니다.

# oc get nodes
NAME                      STATUS   ROLES                  AGE   VERSION
master01.az1.sysdocu.kr   Ready    control-plane,master   43d   v1.25.4+77bec7a
master02.az1.sysdocu.kr   Ready    control-plane,master   43d   v1.25.4+77bec7a
master03.az1.sysdocu.kr   Ready    control-plane,master   43d   v1.25.4+77bec7a
worker01.az1.sysdocu.kr   Ready    worker                 42d   v1.25.4+77bec7a
worker02.az1.sysdocu.kr   Ready    worker                 42d   v1.25.4+77bec7a

 

# oc label nodes worker01.az1.sysdocu.kr choice=ALL choicesub=wnode1
node/worker01.az1.sysdocu.kr labeled

- Group 용도로 'choice:ALL' 생성

- 노드 전용으로 'choicesub:wnode1' 생성

 

# oc label nodes worker02.az1.sysdocu.kr choice=ALL choicesub=wnode2

node/worker02.az1.sysdocu.kr labeled

- Group 용도로 'choice:ALL' 생성

- 노드 전용으로 'choicesub:wnode2' 생성

 

* 참고

라벨 삭제 방법입니다. 라벨명 (예: choicesub) 뒤에 - 를 꼭 붙여야 삭제됩니다.

# oc label node <노드명> <라벨명>-

 

설정된 상태를 확인합니다.

# oc get node -L choice,choicesub
NAME                      STATUS   ROLES                  AGE   VERSION           CHOICE   CHOICESUB
master01.az1.sysdocu.kr   Ready    control-plane,master   49d   v1.25.4+77bec7a            
master02.az1.sysdocu.kr   Ready    control-plane,master   49d   v1.25.4+77bec7a            
master03.az1.sysdocu.kr   Ready    control-plane,master   49d   v1.25.4+77bec7a            
worker01.az1.sysdocu.kr   Ready    worker                 49d   v1.25.4+77bec7a   ALL      wnode1
worker02.az1.sysdocu.kr   Ready    worker                 49d   v1.25.4+77bec7a   ALL      wnode2

 

아래와 같이 Deployment yaml 파일을 작성 합니다.

# vi deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      containers:
      - name: app
        image: default-route-openshift-image-registry.apps.az1.sysdocu.kr:5000/project412/python
        ports:
        - containerPort: 80
          protocol: TCP
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: ["ALL"]
          runAsNonRoot: true
      imagePullSecrets:
      - name: sysdocu

      # affinity 사용 옵션
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms: 
            - matchExpressions:   # 특정 Label 의 node 에 Pod 를 생성
              - key: choicesub
                operator: In
                values:
                -
wnode1

 

Affinity 는 Node Affinity 와 Pod Affinity 가 있는데, 어느것을 기준으로 하는지에 따라 다릅니다.

- Node Affinity : 생성된 Pod 를 특정 worker node 에서 가동

- Pod Affinity : Replicas 로 생성된 동일한 Pod 를 같은 worker node 에서 가동
- Pod AntiAffinity : Replicas 로 생성된 동일한 Pod 를 다른 worker node 에서 가동

 

operator 는 Node Affinity 규칙에 사용되는 연산자를 지정하는 필드입니다.

- In : 특정 키 (key) 의 값을 포함하는 경우에 매치. 즉, 값 (values) 이 키에 포함되어 있는 경우 해당 노드에 Pod 를 생성
- Exists : 특정 키 (key) 가 존재하는 경우에 매치. 값 (values) 에 관계없이 키가 존재하면 해당 노드에 Pod 를 생성
- Gt (Greater than) : 특정 키 (key) 의 값이 지정한 값 (values) 보다 큰 경우에 매치. 주로 숫자 값을 비교할 때 사용
- Lt (Less than) : 특정 키 (key) 의 값이 지정한 값 (values) 보다 작은 경우에 매치. 역시 숫자 값을 비교할 때 사용
- NotIn : 특정 키 (key) 의 값을 포함하지 않는 경우에 매치. 값 (values) 이 키에 포함되지 않은 경우 해당 노드에 Pod 를 생성
- DoesNotExist : 특정 키 (key) 가 존재하지 않는 경우에 매치. 값 (values) 에 관계없이 키가 존재하지 않으면 해당 노드에 Pod 를 생성

 

작성한 yaml 파일을 적용하여 Pod 를 생성합니다.

참고로, Kubernetes 사용자는 아래 oc 명령대신 kuberctl 을 사용하면 됩니다.

# oc apply -f deployment.yaml

 

Pod 가 어느 worker node 에 생성되었는지 확인합니다.

# oc get pod -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE                      NOMINATED NODE   READINESS GATES
app-5f86cc794b-656dg   1/1     Running   0          27s   10.131.0.13   worker01.az1.sysdocu.kr   <none>           <none>

 

Affinity 옵션값의 노드 라벨을 다른 노드로 변경하고, apply 명령으로 적용하면 곧바로 기존 Pod 는 삭제되고, 지정한 노드에 Pod 가 생성됩니다.

원래 Pod 는 스케쥴링 되는 노드 (worker node) 의 가용성 체크 뒤, Round-Robin 방식으로 분배 생성되지만 Affinity 적용 후에는 지정한 노드로만 생성되는것을 확인 할 수 있습니다.

 

노드를 변경하고 (wnode1 -> wnode2)

# sed -i 's/wnode1/wnode2/' deployment.yaml

 

적용합니다.

# oc apply -f deployment.yaml

 

Pod 상태를 확인해보면 지정한 노드에 Pod 가 생성되어진 것을 볼 수 있습니다.
# oc get pod -o wide
NAME                   READY   STATUS        RESTARTS   AGE    IP             NODE                      NOMINATED NODE   READINESS GATES
app-54f888586f-xbmlj   1/1     Running       0          11s    10.128.3.242   worker02.az1.sysdocu.kr   <none>           <none>
app-5f86cc794b-656dg   1/1    Terminating   0          12m   10.131.0.13   worker01.az1.sysdocu.kr   <none>           <none>

 

반응형

댓글()

dd 명령어로 파일 생성하기

리눅스/OS 일반|2023. 6. 20. 16:13
반응형

# dd if=/dev/zero of=sysdocu.bin bs=100M count=10

 

위와 같이 실행시 1GB (100MB * 10) 짜리 sysdocu.bin 파일이 생성됩니다.

 

반응형

댓글()