2.4. OpenStack에서 머신 세트 생성
Red Hat OpenStack Platform (RHOSP)의 OpenShift Container Platform 클러스터에서 특정 목적을 제공하기 위해 다른 머신 세트를 생성할 수 있습니다. 예를 들어, 지원되는 워크로드를 새 머신으로 이동할 수 있도록 인프라 머신 세트 및 관련 머신을 작성할 수 있습니다.
이 프로세스는 수동으로 프로비저닝된 시스템이 있는 클러스터에는 적용되지 않습니다. 머신 API가 작동하는 클러스터에서만 고급 머신 관리 및 스케일링 기능을 사용할 수 있습니다.
2.4.1. Machine API 개요
Machine API는 업스트림 Cluster API 프로젝트 및 사용자 정의 OpenShift Container Platform 리소스를 기반으로 하는 주요 리소스의 조합입니다.
OpenShift Container Platform 4.8 클러스터의 경우 Machine API는 클러스터 설치가 완료된 후 모든 노드 호스트 프로비저닝 관리 작업을 수행합니다. 이 시스템으로 인해 OpenShift Container Platform 4.8은 퍼블릭 또는 프라이빗 클라우드 인프라에 더하여 탄력적이고 동적인 프로비저닝 방법을 제공합니다.
두 가지 주요 리소스는 다음과 같습니다.
- Machine
-
노드의 호스트를 설명하는 기본 단위입니다. 머신에는
providerSpec
사양이 있으며 이는 다른 클라우드 플랫폼에 제공되는 컴퓨팅 노드 유형을 설명합니다. 예를 들어 AWS(Amazon Web Services)의 작업자 노드에 대한 머신 유형은 특정 머신 유형과 필요한 메타 데이터를 정의할 수 있습니다. - 머신 세트
MachineSet
리소스는 머신 그룹입니다. 머신 세트는 머신에 연관되어 있고 복제본 세트는 pod에 연관되어 있습니다. 더 많은 머신이 필요하거나 규모를 줄여야 하는 경우 컴퓨터 요구 사항에 맞게 머신 세트의 replicas 필드를 변경합니다.주의컨트롤 플레인 시스템은 머신 세트에서 관리할 수 없습니다.
다음 사용자 지정 리소스는 클러스터에 더 많은 기능을 추가할 수 있습니다.
- 머신 자동 스케일러
-
MachineAutoscaler
리소스는 클라우드에서 머신을 자동으로 확장합니다. 지정된 머신 세트에서 노드의 최소 및 최대 스케일링 경계를 설정할 수 있으며 머신 자동 스케일러는 해당 노드 범위를 유지합니다.MachineAutoscaler
객체는ClusterAutoscaler
객체를 설정한 후에 사용할 수 있습니다.ClusterAutoscaler
및MachineAutoscaler
리소스는 모두ClusterAutoscalerOperator
오브젝트에서 사용 가능합니다. - Cluster autoscaler
- 이 리소스는 업스트림 클러스터 자동 스케일러 프로젝트를 기반으로 합니다. OpenShift Container Platform 구현에서는 머신 세트 API를 확장하여 Machine API와 통합됩니다. 코어, 노드, 메모리, GPU 등과 같은 리소스의 클러스터 전체에서 확장 제한을 설정할 수 있습니다. 중요도가 낮은 Pod에 대해 새 노드가 온라인 상태가 되지 않도록 클러스터가 Pod에 우선 순위를 설정할 수 있습니다. 노드를 확장할 수는 있지만 축소할 수 없도록 확장 정책을 설정할 수도 있습니다.
- 머신 상태 점검
-
MachineHealthCheck
리소스는 머신의 비정상적인 상태를 감지하여 삭제한 후 지원되는 플랫폼에서 새 머신을 생성합니다.
OpenShift Container Platform 버전 3.11에서는 클러스터가 머신 프로비저닝을 관리하지 않았기 때문에 다중 영역 아키텍처를 쉽게 롤아웃할 수 없었습니다. OpenShift Container Platform 버전 4.1부터 이러한 프로세스가 더 쉬워졌습니다. 각 머신 세트의 범위는 단일 영역에서 지정되므로 설치 프로그램은 사용자를 대신하여 가용성 영역 전체에 머신 세트를 보냅니다. 또한 계산이 동적이고 영역 장애가 발생하여 머신을 재조정해야하는 경우 처리할 수 있는 영역을 확보할 수 있습니다. Autoscaler는 클러스터의 수명 기간 동안 최적의 균형을 유지합니다.
2.4.2. RHOSP에서 머신 세트 사용자 정의 리소스의 샘플 YAML
이 샘플 YAML은 RHOSP(Red Hat OpenStack Platform)에서 실행되는 머신 세트를 정의하고 node-role.kubernetes.io/<role>: ""
로 레이블이 지정된 노드를 생성합니다.
이 샘플에서 <infrastructure_id>
는 클러스터를 프로비저닝할 때 설정한 클러스터 ID를 기반으로 하는 인프라 ID 레이블이며 <role>
은 추가할 노드 레이블입니다.
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1 machine.openshift.io/cluster-api-machine-role: <role> 2 machine.openshift.io/cluster-api-machine-type: <role> 3 name: <infrastructure_id>-<role> 4 namespace: openshift-machine-api spec: replicas: <number_of_replicas> selector: matchLabels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> 5 machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role> 6 template: metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> 7 machine.openshift.io/cluster-api-machine-role: <role> 8 machine.openshift.io/cluster-api-machine-type: <role> 9 machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role> 10 spec: providerSpec: value: apiVersion: openstackproviderconfig.openshift.io/v1alpha1 cloudName: openstack cloudsSecret: name: openstack-cloud-credentials namespace: openshift-machine-api flavor: <nova_flavor> image: <glance_image_name_or_location> serverGroupID: <optional_UUID_of_server_group> 11 kind: OpenstackProviderSpec networks: 12 - filter: {} subnets: - filter: name: <subnet_name> tags: openshiftClusterID=<infrastructure_id> 13 primarySubnet: <rhosp_subnet_UUID> 14 securityGroups: - filter: {} name: <infrastructure_id>-worker 15 serverMetadata: Name: <infrastructure_id>-worker 16 openshiftClusterID: <infrastructure_id> 17 tags: - openshiftClusterID=<infrastructure_id> 18 trunk: true userDataSecret: name: worker-user-data 19 availabilityZone: <optional_openstack_availability_zone>
- 1 5 7 13 15 16 17 18
- 클러스터를 프로비저닝할 때 설정한 클러스터 ID를 기반으로 하는 인프라 ID를 지정합니다. OpenShift CLI 패키지가 설치되어 있으면 다음 명령을 실행하여 인프라 ID를 얻을 수 있습니다.
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
- 2 3 8 9 19
- 추가할 노드 레이블을 지정합니다.
- 4 6 10
- 인프라 ID 및 노드 레이블을 지정합니다.
- 11
- MachineSet의 서버 그룹 정책을 설정하려면, 서버 그룹 생성에서 반환된 값을 입력합니다. 대부분의 배포에는
anti-affinity
또는soft-anti-affinity
정책이 권장됩니다. - 12
- 여러 네트워크에 배포해야 합니다. 여러 네트워크를 지정하려면 네트워크 배열에 다른 항목을 추가합니다. 또한
primarySubnet
값으로 사용되는 네트워크를 포함해야 합니다. - 14
- 노드 엔드포인트를 게시할 RHOSP 서브넷을 지정합니다. 일반적으로 이 서브넷은
install-config.yaml
파일에서machineSubnet
값으로 사용되는 서브넷과 동일합니다.
2.4.3. RHOSP에서 SR-IOV를 사용하는 머신 세트 사용자 정의 리소스의 샘플 YAML
SR-IOV(Single-root I/O Virtualization)에 대해 클러스터를 구성하는 경우 해당 기술을 사용하는 머신 세트를 생성할 수 있습니다.
이 샘플 YAML은 SR-IOV 네트워크를 사용하는 머신 세트를 정의합니다. 생성된 노드에는 node-role.openshift.io/<node_role>: ""
로 레이블이 지정됩니다.
이 샘플에서 infrastructure_id
는 클러스터를 프로비저닝할 때 설정한 클러스터 ID를 기반으로 하는 인프라 ID 레이블이며 node_role
은 추가할 노드 레이블입니다.
이 샘플은 "radio" 및 "uplink"라는 두 개의 SR-IOV 네트워크를 가정합니다. 네트워크는 spec.template.spec.providerSpec.value.ports
목록의 포트 정의에 사용됩니다.
SR-IOV 배포와 관련된 매개변수만 이 샘플에 설명되어 있습니다. 더 일반적인 샘플을 검토하려면 "RHOS에서 머신 세트 사용자 정의 리소스의 샘플 YAML"을 참조하십시오.
SR-IOV 네트워크를 사용하는 머신 세트의 예
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machine-role: <node_role> machine.openshift.io/cluster-api-machine-type: <node_role> name: <infrastructure_id>-<node_role> namespace: openshift-machine-api spec: replicas: <number_of_replicas> selector: matchLabels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<node_role> template: metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machine-role: <node_role> machine.openshift.io/cluster-api-machine-type: <node_role> machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<node_role> spec: metadata: providerSpec: value: apiVersion: openstackproviderconfig.openshift.io/v1alpha1 cloudName: openstack cloudsSecret: name: openstack-cloud-credentials namespace: openshift-machine-api flavor: <nova_flavor> image: <glance_image_name_or_location> serverGroupID: <optional_UUID_of_server_group> kind: OpenstackProviderSpec networks: - subnets: - UUID: <machines_subnet_UUID> ports: - networkID: <radio_network_UUID> 1 nameSuffix: radio fixedIPs: - subnetID: <radio_subnet_UUID> 2 tags: - sriov - radio vnicType: direct 3 portSecurity: false 4 - networkID: <uplink_network_UUID> 5 nameSuffix: uplink fixedIPs: - subnetID: <uplink_subnet_UUID> 6 tags: - sriov - uplink vnicType: direct 7 portSecurity: false 8 primarySubnet: <machines_subnet_UUID> securityGroups: - filter: {} name: <infrastructure_id>-<node_role> serverMetadata: Name: <infrastructure_id>-<node_role> openshiftClusterID: <infrastructure_id> tags: - openshiftClusterID=<infrastructure_id> trunk: true userDataSecret: name: <node_role>-user-data availabilityZone: <optional_openstack_availability_zone> configDrive: true 9
네트워크 및 서브넷 목록의 항목을 통해 생성된 포트에 대해 트렁킹이 활성화됩니다. 이러한 목록에서 생성된 포트의 이름은 <machine_name>-<nameSuffix>
패턴을 따릅니다. nameSuffix
필드는 포트 정의에 필요합니다.
ports 목록에 정의된 포트에는 트렁킹이 활성화되지 않습니다.
선택적으로 태그 목록의 일부로 포트에 tags
를 추가할 수 있습니다.
2.4.4. 포트 보안이 비활성화된 SR-IOV 배포를 위한 샘플 YAML
포트 보안이 비활성화된 네트워크에서 SR-IOV(Single-root I/O Virtualization) 포트를 생성하려면 spec.template.spec.providerSpec.value.ports
목록의 항목으로 포트를 포함하는 머신 세트를 정의합니다. 표준 SR-IOV 머신 세트와 이러한 차이점은 네트워크 및 서브넷 인터페이스를 사용하여 생성된 포트에 대해 발생하는 자동 보안 그룹 및 허용되는 주소 쌍 구성 때문입니다.
머신 서브넷에 대해 정의한 포트에는 다음이 필요합니다.
- API 및 ingress 가상 IP 포트에 허용되는 주소 쌍
- 컴퓨팅 보안 그룹
- 머신 네트워크 및 서브넷에 연결
포트 보안이 비활성화된 SR-IOV 배포와 관련된 매개변수만 이 샘플에 설명되어 있습니다. 일반적인 샘플을 검토하려면 RHOSP에서 SR-IOV를 사용하는 머신 세트 사용자 정의 리소스의 샘플 YAML을 참조하십시오.
SR-IOV 네트워크를 사용하고 포트 보안이 비활성화된 머신 세트의 예
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machine-role: <node_role> machine.openshift.io/cluster-api-machine-type: <node_role> name: <infrastructure_id>-<node_role> namespace: openshift-machine-api spec: replicas: <number_of_replicas> selector: matchLabels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<node_role> template: metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machine-role: <node_role> machine.openshift.io/cluster-api-machine-type: <node_role> machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<node_role> spec: metadata: {} providerSpec: value: apiVersion: openstackproviderconfig.openshift.io/v1alpha1 cloudName: openstack cloudsSecret: name: openstack-cloud-credentials namespace: openshift-machine-api flavor: <nova_flavor> image: <glance_image_name_or_location> kind: OpenstackProviderSpec ports: - allowedAddressPairs: 1 - ipAddress: <API_VIP_port_IP> - ipAddress: <ingress_VIP_port_IP> fixedIPs: - subnetID: <machines_subnet_UUID> 2 nameSuffix: nodes networkID: <machines_network_UUID> 3 securityGroups: - <compute_security_group_UUID> 4 - networkID: <SRIOV_network_UUID> nameSuffix: sriov fixedIPs: - subnetID: <SRIOV_subnet_UUID> tags: - sriov vnicType: direct portSecurity: False primarySubnet: <machines_subnet_UUID> serverMetadata: Name: <infrastructure_ID>-<node_role> openshiftClusterID: <infrastructure_id> tags: - openshiftClusterID=<infrastructure_id> trunk: false userDataSecret: name: worker-user-data configDrive: True
네트워크 및 서브넷 목록의 항목을 통해 생성된 포트에 대해 트렁킹이 활성화됩니다. 이러한 목록에서 생성된 포트의 이름은 <machine_name>-<nameSuffix>
패턴을 따릅니다. nameSuffix
필드는 포트 정의에 필요합니다.
ports 목록에 정의된 포트에는 트렁킹이 활성화되지 않습니다.
선택적으로 태그 목록의 일부로 포트에 tags
를 추가할 수 있습니다.
클러스터가 Kuryr를 사용하고 RHOSP SR-IOV 네트워크에 포트 보안이 비활성화된 경우 컴퓨팅 머신의 기본 포트에는 다음이 있어야 합니다.
-
spec.template.spec.providerSpec.value.networks.portSecurityEnabled
매개변수의 값이false
로 설정됩니다. -
각 서브넷의
spec.template.spec.providerSpec.value.networks.portSecurityEnabled
매개변수 값이false
로 설정됩니다. -
spec.template.spec.providerSpec.value.securityGroups
값이 empty:[]
로 설정됩니다.
SR-IOV를 사용하고 포트 보안이 비활성화된 Kuryr에서 클러스터에 대한 머신 세트 섹션의 예
... networks: - subnets: - uuid: <machines_subnet_UUID> portSecurityEnabled: false portSecurityEnabled: false securityGroups: [] ...
이 경우 VM이 생성된 후 컴퓨팅 보안 그룹을 기본 VM 인터페이스에 적용할 수 있습니다. 예를 들어 명령줄에서 다음을 수행합니다.
$ openstack port set --enable-port-security --security-group <infrastructure_id>-<node_role> <main_port_ID>
2.4.5. 머신 세트 만들기
설치 프로그램에 의해 생성되는 것 이외에도 고유한 머신 세트를 만들어 선택한 특정 워크로드의 머신 컴퓨팅 리소스를 동적으로 관리할 수 있습니다.
사전 요구 사항
- OpenShift Container Platform 클러스터를 배포합니다.
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로oc
에 로그인합니다.
절차
머신 세트 CR(사용자 지정 리소스) 샘플이 포함된 이름이
<file_name>.yaml
인 새 YAML 파일을 만듭니다.<clusterID>
및<role>
매개 변수 값을 설정해야 합니다.특정 필드에 설정할 값이 확실하지 않은 경우 클러스터에서 기존 머신 세트를 확인할 수 있습니다.
$ oc get machinesets -n openshift-machine-api
출력 예
NAME DESIRED CURRENT READY AVAILABLE AGE agl030519-vplxk-worker-us-east-1a 1 1 1 1 55m agl030519-vplxk-worker-us-east-1b 1 1 1 1 55m agl030519-vplxk-worker-us-east-1c 1 1 1 1 55m agl030519-vplxk-worker-us-east-1d 0 0 55m agl030519-vplxk-worker-us-east-1e 0 0 55m agl030519-vplxk-worker-us-east-1f 0 0 55m
특정 머신 세트의 값을 확인합니다.
$ oc get machineset <machineset_name> -n \ openshift-machine-api -o yaml
출력 예
... template: metadata: labels: machine.openshift.io/cluster-api-cluster: agl030519-vplxk 1 machine.openshift.io/cluster-api-machine-role: worker 2 machine.openshift.io/cluster-api-machine-type: worker machine.openshift.io/cluster-api-machineset: agl030519-vplxk-worker-us-east-1a
새
MachineSet
CR을 만듭니다.$ oc create -f <file_name>.yaml
머신 세트 목록을 표시합니다.
$ oc get machineset -n openshift-machine-api
출력 예
NAME DESIRED CURRENT READY AVAILABLE AGE agl030519-vplxk-infra-us-east-1a 1 1 1 1 11m agl030519-vplxk-worker-us-east-1a 1 1 1 1 55m agl030519-vplxk-worker-us-east-1b 1 1 1 1 55m agl030519-vplxk-worker-us-east-1c 1 1 1 1 55m agl030519-vplxk-worker-us-east-1d 0 0 55m agl030519-vplxk-worker-us-east-1e 0 0 55m agl030519-vplxk-worker-us-east-1f 0 0 55m
새 머신 세트가 사용 가능한 경우
DESIRED
및CURRENT
값이 일치합니다. 머신 세트를 사용할 수 없는 경우 몇 분 후에 명령을 다시 실행합니다.