2.4. OpenStack에서 머신 세트 생성

Red Hat OpenStack Platform (RHOSP)의 OpenShift Container Platform 클러스터에서 특정 목적을 제공하기 위해 다른 머신 세트를 생성할 수 있습니다. 예를 들어, 지원되는 워크로드를 새 머신으로 이동할 수 있도록 인프라 머신 세트 및 관련 머신을 작성할 수 있습니다.

중요

머신 API가 작동하는 클러스터에서만 고급 머신 관리 및 스케일링 기능을 사용할 수 있습니다. 사용자 프로비저닝 인프라가 있는 클러스터에는 Machine API를 사용하려면 추가 검증 및 구성이 필요합니다.

인프라 플랫폼 유형의 클러스터가 Machine API를 사용할 수 없습니다. 이 제한은 클러스터에 연결된 컴퓨팅 시스템이 기능을 지원하는 플랫폼에 설치된 경우에도 적용됩니다. 이 매개변수는 설치 후 변경할 수 없습니다.

클러스터의 플랫폼 유형을 보려면 다음 명령을 실행합니다.

$ oc get infrastructure cluster -o jsonpath='{.status.platform}'

2.4.1. 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.2. 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

1 5
각 포트의 네트워크 UUID를 입력합니다.
2 6
각 포트의 서브넷 UUID를 입력합니다.
3 7
vnicType 매개 변수의 값은 각 포트에 대해 direct이어야 합니다.
4 8
portSecurity 매개변수 값은 각 포트에 대해 false 여야 합니다.

포트 보안이 비활성화되면 포트에 대해 보안 그룹 및 허용되는 주소 쌍을 설정할 수 없습니다. 인스턴스에서 보안 그룹을 설정하면 그룹이 연결된 모든 포트에 적용됩니다.

9
configDrive 매개변수 값은 true 여야 합니다.
참고

네트워크 및 서브넷 목록의 항목을 통해 생성된 포트에 대해 트렁킹이 활성화됩니다. 이러한 목록에서 생성된 포트의 이름은 <machine_name>-<nameSuffix> 패턴을 따릅니다. nameSuffix 필드는 포트 정의에 필요합니다.

각 포트에 대해 트렁킹을 활성화할 수 있습니다.

선택적으로 태그 목록의 일부로 포트에 tags를 추가할 수 있습니다.

2.4.3. 포트 보안이 비활성화된 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

1
API 및 수신 포트에 허용되는 주소 쌍을 지정합니다.
2 3
시스템 네트워크 및 서브넷을 지정합니다.
4
컴퓨팅 시스템 보안 그룹을 지정합니다.
참고

네트워크 및 서브넷 목록의 항목을 통해 생성된 포트에 대해 트렁킹이 활성화됩니다. 이러한 목록에서 생성된 포트의 이름은 <machine_name>-<nameSuffix> 패턴을 따릅니다. nameSuffix 필드는 포트 정의에 필요합니다.

각 포트에 대해 트렁킹을 활성화할 수 있습니다.

선택적으로 태그 목록의 일부로 포트에 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.4. 머신 세트 만들기

설치 프로그램에서 생성한 컴퓨팅 머신 세트 외에도 고유한 머신 세트를 생성하여 선택한 특정 워크로드의 머신 컴퓨팅 리소스를 동적으로 관리할 수 있습니다.

사전 요구 사항

  • OpenShift Container Platform 클러스터를 배포합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 oc에 로그인합니다.

절차

  1. 머신 세트 CR(사용자 지정 리소스) 샘플이 포함된 이름이 <file_name>.yaml인 새 YAML 파일을 만듭니다.

    <clusterID><role> 매개 변수 값을 설정해야 합니다.

  2. 선택 사항: 특정 필드에 설정할 값이 확실하지 않은 경우 클러스터에서 기존 컴퓨팅 머신 세트를 확인할 수 있습니다.

    1. 클러스터의 컴퓨팅 머신 세트를 나열하려면 다음 명령을 실행합니다.

      $ 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

    2. 특정 컴퓨팅 머신 세트 CR(사용자 정의 리소스)의 값을 보려면 다음 명령을 실행합니다.

      $ oc get machineset <machineset_name> \
        -n openshift-machine-api -o yaml

      출력 예

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        labels:
          machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1
        name: <infrastructure_id>-<role> 2
        namespace: openshift-machine-api
      spec:
        replicas: 1
        selector:
          matchLabels:
            machine.openshift.io/cluster-api-cluster: <infrastructure_id>
            machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>
        template:
          metadata:
            labels:
              machine.openshift.io/cluster-api-cluster: <infrastructure_id>
              machine.openshift.io/cluster-api-machine-role: <role>
              machine.openshift.io/cluster-api-machine-type: <role>
              machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>
          spec:
            providerSpec: 3
              ...

      1
      클러스터 인프라 ID입니다.
      2
      기본 노드 레이블입니다.
      참고

      사용자 프로비저닝 인프라가 있는 클러스터의 경우 컴퓨팅 머신 세트는 작업자 및 인프라 유형 머신만 생성할 수 있습니다.

      3
      컴퓨팅 머신 세트 CR의 &lt ;providerSpec > 섹션에 있는 값은 플랫폼에 따라 다릅니다. CR의 &lt ;providerSpec > 매개변수에 대한 자세한 내용은 공급자의 샘플 컴퓨팅 머신 세트 CR 구성을 참조하십시오.
  3. 다음 명령을 실행하여 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

    새 머신 세트가 사용 가능한 경우DESIREDCURRENT 값이 일치합니다. 머신 세트를 사용할 수 없는 경우 몇 분 후에 명령을 다시 실행합니다.