16. 파일 및 블록 스토리지 클러스터 부트스트랩

예상 소요 시간: 3시간

작동 가능한 구성요소 소유자: FILE

기술 프로필: 배포 엔지니어

이 페이지에서는 NetApp ONTAP를 사용하여 클러스터의 파일 및 블록 스토리지를 설정하는 방법을 설명합니다.

16.1. ONTAP 클러스터 스위치 구성

  1. 비밀번호 switch-xx-ad-stgesw01-adminswitch-xx-ad-stgesw02-admin를 확인합니다 (값이 동일함). 비밀번호가 없으면 사용자 인증 정보를 초기화하고 새 무작위 비밀번호를 생성합니다. 콘솔을 통해 스위치에 로그인하여 관리자 비밀번호를 설정합니다.

    # configure terminal
    # username ADMIN_USER password PASSWORD
    # exit
    # copy running-config startup-config
    
  2. 사용자 인증 정보를 보안 비밀에 저장하고 cell.yaml에 추가

    apiVersion: v1
    kind: Secret
    metadata:
      name: netapp-ontap-cluster-switch-credential
      namespace: gpc-system
    type: Opaque
    stringData:
      username: ADMIN_USER
      password: PASSWORD
    
  3. 다음 명령어를 실행하여 스토리지 스위치의 이름을 가져옵니다.

    kubectl get storageswitch -n gpc-system
    

    다음과 비슷한 출력이 표시됩니다.

    NAME             AGE   MANAGEMENTIP
    kb-ab-stgesw01   10d   192.0.2.0
    kb-ab-stgesw02   10d   192.0.2.1
    

    각 스위치에 대해 다음 단계를 수행하고 스위치 이름을 사용합니다.

  4. 다음 명령어를 실행하여 switchstaticconfig CR에서 스위치 구성을 가져옵니다.

    kubectl get switchstaticconfigs -n gpc-system $SWITCH_NAME-static-config -o yaml | /root/release/scripts/yq_linux_amd64 '.spec.config'
    

    다음과 비슷한 출력이 표시됩니다.

    banner motd !
    ******************************************************************************
    * NetApp Reference Configuration File (RCF)
    *
    * Switch   : Nexus N9K-C9336C-FX2
    * Filename : Nexus-9336C-RCF-v1.8-Cluster.txt
    * Date     : 11-01-2021
    * Version  : v1.8
    *
    * Port Usage:
    * Ports  1- 3: Breakout mode (4x10G) Intra-Cluster/HA Ports, int e1/1/1-4, e1/2/1-4, e1/3/1-4
    * Ports  4- 6: Breakout mode (4x25G) Intra-Cluster/HA Ports, int e1/4/1-4, e1/5/1-4, e1/6/1-4
    * Ports  7-34: 40/100GbE Intra-Cluster/HA Ports, int e1/7-34
    * Ports 35-36: Intra-Cluster ISL Ports, int e1/35-36
    *
    * Dynamic breakout commands:
    * 10G: interface breakout module 1 port <range> map 10g-4x
    * 25G: interface breakout module 1 port <range> map 25g-4x
    *
    * Undo breakout commands and return interfaces to 40/100G configuration in config mode:
    * no interface breakout module 1 port <range> map 10g-4x
    * no interface breakout module 1 port <range> map 25g-4x
    * interface Ethernet <interfaces taken out of breakout mode>
    * inherit port-profile CLUSTER
    * priority-flow-control mode auto
    * service-policy type qos type input ROCE_QOS
    * exit
    *
    * This RCF supports Clustering, HA, RDMA, and DCTCP using a single port profile.
    *
    ******************************************************************************
    !
    conf t
    !
    interface breakout module 1 port 1-3 map 10g-4x
    interface breakout module 1 port 4-6 map 25g-4x
    !
    feature lacp
    feature lldp
    feature ssh
    feature sftp-server
    feature scp-server
    !
    vlan 17,18
    exit
    !
    cdp enable
    cdp advertise v1
    cdp timer 5
    system default switchport
    no system default switchport shutdown
    snmp-server community cshm1! group network-operator
    errdisable recovery interval 30
    port-channel load-balance src-dst ip-l4port-vlan
    no ip domain-lookup
    logging console 1
    !
    !
    class-map type qos match-any HA
    match dscp 40
    match cos 5
    !
    class-map type qos match-any RDMA
    match dscp 16
    match cos 2
    !
    class-map type qos match-any CT
    match dscp 0
    match cos 0
    !
    policy-map type qos ROCE_QOS
    class type qos HA
      set qos-group 5
    class type qos RDMA
      set qos-group 2
    class type qos class-default
      set qos-group 0
    !
    class-map type network-qos HA_NETQOS
    match qos-group 5
    !
    class-map type network-qos RDMA_NETQOS
    match qos-group 2
    !
    class-map type network-qos CT_NETQOS
    match qos-group 0
    !
    policy-map type queuing ROCE_QUEUING
    class type queuing c-out-8q-q7
      priority level 1
    class type queuing c-out-8q-q6
      bandwidth remaining percent 0
    class type queuing c-out-8q-q5
      bandwidth remaining percent 43
      random-detect threshold burst-optimized ecn
    class type queuing c-out-8q-q4
      bandwidth remaining percent 0
    class type queuing c-out-8q-q3
      bandwidth remaining percent 0
    class type queuing c-out-8q-q2
      random-detect threshold burst-optimized ecn
      bandwidth remaining percent 28
    class type queuing c-out-8q-q1
      bandwidth remaining percent 0
    class type queuing c-out-8q-q-default
      bandwidth remaining percent 28
      random-detect threshold burst-optimized ecn
    !
    policy-map type network-qos NETQOS
    class type network-qos HA_NETQOS
      pause pfc-cos 5
      mtu 9216
    class type network-qos RDMA_NETQOS
      pause pfc-cos 2
      mtu 9216
    class type network-qos CT_NETQOS
      mtu 9216
    !
    system qos
    service-policy type network-qos NETQOS
    service-policy type queuing output ROCE_QUEUING
    !
    copp profile strict
    !
    !
    !********** Port Profiles **********
    !
    port-profile type ethernet CLUSTER
    description 10/25/40/1000GbE Intra-Cluster/HA Nodes
    switchport mode trunk
    switchport trunk allowed vlan 1,17-18
    spanning-tree port type edge trunk
    spanning-tree bpduguard enable
    mtu 9216
    state enabled
    exit
    !
    !
    !********** Interfaces **********
    !
    interface e1/1/1-4, e1/2/1-4, e1/3/1-4, e1/4/1-4, e1/5/1-4, e1/6/1-4, e1/7-34
    inherit port-profile CLUSTER
    priority-flow-control mode auto
    service-policy input ROCE_QOS
    exit
    !
    !********** Intra-Cluster ISL ports **********
    !
    interface Ethernet1/35
    description Intra-Cluster Switch ISL Port 1/35 (port channel)
    priority-flow-control mode auto
    switchport mode trunk
    switchport trunk allowed vlan 1
    mtu 9216
    channel-group 1 mode active
    no shutdown
    !
    interface Ethernet1/36
    description Intra-Cluster Switch ISL Port 1/36 (port channel)
    priority-flow-control mode auto
    switchport mode trunk
    switchport trunk allowed vlan 1
    mtu 9216
    channel-group 1 mode active
    no shutdown
    !
    interface port-channel1
    service-policy input ROCE_QOS
    priority-flow-control mode auto
    switchport mode trunk
    switchport trunk allowed vlan 1
    mtu 9216
    no shutdown
    !
    !********** Set management ip **********
    !
    interface mgmt0
    ip address 172.28.2.10/29
    !
    vrf context management
    ip route 0.0.0.0/0 mgmt0 172.28.2.9
    !
    hostname kb-ad-stgesw01
    !
    end
    !
    !********** Save config *******
    copy run start
    !
    
  5. 콘텐츠를 스위치에 복사하여 붙여넣어 직렬 케이블이나 콘솔 서버를 사용하여 획득한 스위치 구성을 스위치에 배포합니다.

    이 구성에서는 다음을 가정합니다.

    • A250: 스토리지 기기의 e0c/e0d가 브레이크아웃 케이블을 사용하여 포트 4~6에 연결됩니다.
    • A400: 스토리지 기기의 e3a/e3b가 40GbE 또는 100GbE (브레이크아웃 아님) 케이블을 사용하여 포트 7~34에 연결됩니다.
    • A800: 스토리지 기기의 e0a/e1a가 40GbE 또는 100GbE (브레이크아웃 아님) 케이블을 사용하여 포트 7~34에 연결됩니다.

    하지만 그렇지 않을 수도 있습니다. 많은 설치에서 기기가 A400 또는 A800인 경우에도 저장장치가 포트 4~6에 연결됩니다. A400 또는 A800이 포트 4~6에 연결된 경우 스위치 구성을 조정하여 다음 줄을 삭제한 후 적용합니다.

      interface breakout module 1 port 1-3 map 10g-4x
      interface breakout module 1 port 4-6 map 25g-4x
    

    그런 다음 이 줄을 다음으로 바꿉니다.

      interface e1/1/1-4, e1/2/1-4, e1/3/1-4, e1/4/1-4, e1/5/1-4, e1/6/1-4, e1/7-34
    

    다음과 같이 바꿉니다.

      interface e1/1-34
    

    이러한 변경사항으로 인해 포트 1~34가 모두 40GbE 또는 100GbE (브레이크아웃 아님) 케이블로 구성됩니다.

    또한 향후 혼동을 방지하기 위해 구성의 MOTD 배너 부분에서 다음 줄을 삭제합니다.

    
      * Ports  1- 3: Breakout mode (4x10G) Intra-Cluster/HA Ports, int e1/1/1-4, e1/2/1-4, e1/3/1-4
      * Ports  4- 6: Breakout mode (4x25G) Intra-Cluster/HA Ports, int e1/4/1-4, e1/5/1-4, e1/6/1-4
      * Ports  7-34: 40/100GbE Intra-Cluster/HA Ports, int e1/7-34
    

    이 줄을 다음으로 바꿉니다.

      * Ports  1-34: 40/100GbE Intra-Cluster/HA Ports, int e1/1-34
    
  6. ManagementSwitch 객체 CR을 확인합니다.

    부트스트랩 KIND 클러스터 ManagementSwitch 객체를 살펴보고 스토리지 기기를 보유하는 스위치를 나타내는 올바른 CR을 찾습니다. 관리 스위치에서 스토리지 스위치에 물리적으로 연결된 물리적 스위치 포트를 식별하고 이러한 연결이 lacpGroups의 ManagementSwitch CR에 있는지 확인합니다.

    예를 들어 스토리지 스위치에 대한 관리 연결이 관리 스위치의 포트 10과 11에 연결된 경우 다음 정보가 있는지 확인합니다.

    kind: ManagementSwitch
    spec:
      ...
      serverNetwork:
        ...
        lacpGroups:
        - - 10
        - - 11
    

    다음 명령어를 사용하여 lacpGroups를 가져옵니다.

    kubectl get ManagementSwitchinternal <switch-name> --namespace=gpc-system -o=jsonpath='{.spec.serverNetwork.lacpGroups}'
    

    다음과 같은 출력 예시를 통해 포트가 있는지 확인할 수 있습니다.

    [[1],[2],[3],[4],[5],[6]]
    

16.2. ONTAP 어플라이언스 초기화

AFF 250/400/800 시스템의 각 컨트롤러에 대해 다음 단계를 반복합니다. 각 시스템에는 컨트롤러 또는 노드가 두 개 있습니다.

  1. 직렬 콘솔과 기본 사용자 이름 admin를 사용하여 스토리지 컨트롤러 노드에 연결합니다.

  2. NetApp ONTAP 시스템의 버전을 확인합니다.

    • version 명령어를 실행합니다.
    • NetApp ONTAP 시스템 버전은 9.15.1이어야 합니다. 버전이 9.15.1 이전인 경우 조직 관리자 클러스터 부트스트랩 전에 노드를 9.15.1로 업그레이드합니다. 자세한 내용은 업그레이드 가이드를 참고하세요.
  3. 클러스터 상호 연결 IP 인터페이스 주소를 설정합니다.

    먼저 cellcfg에서 현재 StorageNode의 예상 .spec.network.clusterInterconnectIP 값을 찾습니다.

    # Note, this command relies on yq, which can be downloaded from https://github.com/mikefarah/yq.
    # If you do not want to install yq, you can manually inspect cellcfg/*-storage.yaml to determine the IPs.
    cat cellcfg/*-storage.yaml | /root/release/scripts/yq_linux_amd64 'select(.kind == "StorageNode") | (.metadata.name, .spec.network.clusterInterconnectIP)'
    

    위 명령어를 실행하면 모든 StorageNode의 이름과 .spec.network.clusterInterconnectIP 값이 출력됩니다. 예를 들면 다음과 같습니다.

    aa-ad-stge01-01
    169.254.0.1
    ---
    aa-ad-stge01-02
    169.254.0.3
    ---
    aa-ad-stge02-01
    169.254.0.5
    ---
    aa-ad-stge02-02
    169.254.0.7
    ---
    aa-ad-stge03-01
    169.254.0.9
    ---
    aa-ad-stge03-02
    169.254.0.11
    

    위의 예에서 노드 aa-ad-stge03-01의 경우 다음 단계에서 IP 169.254.0.9169.254.0.10가 사용됩니다. 이는 169.254.0.9가 노드 aa-ad-stge03-01의 cellcfg에 정의된 IP이고 169.254.0.10169.254.0.9 다음 IP (숫자)이기 때문입니다.

    그런 다음 현재 노드의 실제 클러스터 상호 연결 IP 값을 확인합니다.

    network interface show
    

    다음 출력과 같이 169.254로 시작하는 네트워크 인터페이스가 두 개 표시됩니다.

    ::> net int show
       (network interface show)
                 Logical    Status     Network            Current       Current Is
     Vserver     Interface  Admin/Oper Address/Mask       Node          Port    Home
     ----------- ---------- ---------- ------------------ ------------- ------- ----
     Cluster
                 clus1        up/up    169.254.19.166/16  localhost     e3a     true
                 clus2        up/up    169.254.19.167/16  localhost     e3b     true
    

    clus1 인터페이스의 주소가 cellcfg에 정의된 값과 일치하고 clus2 인터페이스의 주소가 clus1 주소 (숫자) 다음 IP인 경우 이 단계의 나머지를 건너뛰고 다음 단계로 진행하면 됩니다.

    클러스터 vserver의 인터페이스가 1개만 표시되면 net port show를 실행하여 두 번째 포트가 작동하는지 확인합니다. 이 경우 인터페이스 중 하나를 누락한 것이므로 다음 두 가지 옵션으로 수정할 수 있습니다.

    • 옵션 1: 다음 명령어를 사용하여 인터커넥트 IP를 수동으로 추가합니다.

        net interface create -vserver Cluster -lif clus2 -role cluster -address <interconnect-ip> -netmask 255.255.0.0 -home-node localhost -home-port <port>
      
      • interconnect-ip: 현재 노드의 cellcfg에 지정된 클러스터 상호 연결 IP 다음 IP (숫자 순서)를 선택합니다. 예를 들어 현재 노드의 cellcfg에 지정된 클러스터 상호 연결 IP가 169.254.0.3인 경우 169.254.0.4을 선택합니다.

      • 포트: ONTAP 모델에 따라 포트가 다를 수 있습니다. 이전 출력에 인터페이스가 표시되지 않는 포트를 선택해야 합니다.

        • A250의 경우 e0c와 e0d 중에서 선택합니다.
        • A400의 경우 e3a와 e3b 중에서 선택합니다.
        • A800: e0a와 e1a 중에서 선택합니다.
    • 옵션 2: ONTAP 노드를 공장 초기화합니다 (ONTAP 부팅 메뉴에서 구성 9a 및 9b가 포함됨). 재설정 후 명령어를 다시 실행하여 IP가 2개 있는지 확인합니다. 옵션 1을 먼저 시도하고 문제가 발생할 경우에만 옵션 2로 대체하는 것이 좋습니다.

    그런 다음 clus1 상호 연결 IP를 cellcfg에서 현재 노드에 지정된 clusterInterconnectIP 값으로 업데이트합니다.

    net int modify -vserver Cluster -lif clus1 -address <interconnect-ip>
    
    • interconnect-ip: 현재 노드의 cellcfg에 지정된 clusterInterconnectIP 값입니다.

    다음으로 clus2 상호 연결 IP가 cellcfg에서 현재 노드에 지정된 clusterInterconnectIP 값 다음의 IP (숫자)가 되도록 업데이트합니다.

    net int modify -vserver Cluster -lif clus2 -address <next-interconnect-ip>
    
    • next-interconnect-ip: 현재 노드의 cellcfg에 지정된 클러스터 상호 연결 IP 다음의 IP (숫자 순서)를 선택합니다. 예를 들어 현재 노드의 cellcfg에 지정된 클러스터 상호 연결 IP가 169.254.0.3인 경우 169.254.0.4을 선택합니다.

    마지막으로 현재 노드의 실제 클러스터 상호 연결 IP 값이 cellcfg에서 예상되는 값과 일치하는지 확인합니다.

    network interface show
    

    다음 출력과 같이 169.254로 시작하는 네트워크 인터페이스 두 개가 표시됩니다. clus1 인터페이스의 주소는 cellcfg에 정의된 값과 일치해야 합니다. clus2 인터페이스의 주소는 clus1 주소 (숫자) 다음 IP여야 합니다.

    ::> net int show
       (network interface show)
                 Logical    Status     Network            Current       Current Is
     Vserver     Interface  Admin/Oper Address/Mask       Node          Port    Home
     ----------- ---------- ---------- ------------------ ------------- ------- ----
     Cluster
                 clus1        up/up    169.254.0.1/16  localhost     e3a     true
                 clus2        up/up    169.254.0.2/16  localhost     e3b     true
    

    선택사항: 클러스터 간 연결을 확인합니다.

    ping -lif clus2 -vserver Cluster -destination <interconnect-ip-other-node>
    

    interconnect-ip-other-node: 다른 노드에서 클러스터 간 IP를 선택합니다. 연결이 있으면 핑이 응답해야 합니다.

  4. 관리자 비밀번호를 설정합니다 (모든 노드에서 동일해야 하며 비밀번호를 입력할 때 사용됨). 비밀번호가 복잡성 요구사항을 충족하는지 확인하세요. 그렇지 않으면 정책을 준수하지 않는 사용자 계정에 관한 경고가 표시됩니다.

     ::> security login password
    
     Enter your current password: Current password is empty, press Enter
     Enter a new password: Enter NEW_PASSWORD
     Enter it again: Enter NEW_PASSWORD
    
  5. 관리 IP와 게이트웨이를 설정합니다. 필요한 정보를 얻는 방법은 아래 안내를 참고하세요.

    ::> cluster setup
    
    Type yes to confirm and continue: yes
    Enter the node management interface port: e0M
    Enter the node management interface IP address: IP_ADDRESS
    for this node
    Enter the node management interface netmask: NETMASK for
    this IP
    Enter the node management interface default gateway:
    GATEWAY
    

    ctrl+c를 입력하여 기본 게이트웨이를 설정한 후 클러스터 설정 마법사를 종료합니다.

    다음 명령어를 실행하여 서브넷 정보를 가져옵니다.

    # cat cellcfg/*-storage.yaml | /root/release/scripts/yq_linux_amd64 'select(.kind == "StorageCluster") | (.spec.network.clusterManagement.netmask)'
    

    다음과 비슷한 출력이 표시됩니다.

    203.0.113.0
    

    다음 명령어를 실행하여 게이트웨이 정보를 가져옵니다.

    kubectl get subnetclaim -n root kb-ad-mgmtsw01-stge-os-subnet -o jsonpath={.status.ipv4SubnetStatus.gateway} ; echo
    

    다음과 비슷한 출력이 표시됩니다.

    203.0.113.1
    

    다음은 IP 정보를 가져오는 예시입니다.

    # cat cellcfg/*-storage.yaml | /root/release/scripts/yq_linux_amd64 'select(.kind == "StorageNode") | (.metadata.name, .spec.network.managementIP)'
    kb-ad-stge01-01
    203.0.113.0
    ---
    kb-ad-stge01-02
    203.0.113.0
    ---
    kb-ad-stge02-01
    203.0.113.0
    ---
    kb-ad-stge02-02
    203.0.113.0
    
  6. 관리자 사용자에 대해 SSH를 사용 설정합니다.

      security login create -user-or-group-name admin -application ssh -authentication-method password -role admin
    
  7. 노드 이름을 cell.yaml에 지정된 이름으로 바꿉니다.

    system node rename -node localhost -newname NODE_NAME
    
  8. 디스크가 올바르게 구성되었는지 확인합니다.

    1. storage aggregate show -fields uses-shared-disks를 실행하고 aggr0가 true를 반환하는지 확인합니다. 출력 예시:

      ::> storage aggregate show -fields uses-shared-disks
      aggregate uses-shared-disks
      --------- -----------------
      aggr0     true
      
    2. run -node * sysconfig -r를 실행하고 P3로 끝나는 기기 이름이 있는지 확인합니다. 이는 디스크에 파티션이 3개 있는지 확인하기 위한 것입니다. 출력 예시:

      ::> run -node * sysconfig -r
      1 entry was acted on.
      
      Node: localhost
      Aggregate aggr0 (online, raid_dp) (block checksums)
        Plex /aggr0/plex0 (online, normal, active, pool0)
          RAID group /aggr0/plex0/rg0 (normal, block checksums)
      
            RAID Disk Device  HA  SHELF BAY CHAN Pool Type  RPM  Used (MB/blks)    Phys (MB/blks)
            --------- ------  ------------- ---- ---- ---- ----- --------------    --------------
            dparity   0n.18P3 0n    0   18         0 SSD-NVM   N/A 63849/16345536    63857/16347584
            parity    0n.19P3 0n    0   19         0 SSD-NVM   N/A 63849/16345536    63857/16347584
            data      0n.20P3 0n    0   20         0 SSD-NVM   N/A 63849/16345536    63857/16347584
            data      0n.21P3 0n    0   21         0 SSD-NVM   N/A 63849/16345536    63857/16347584
            data      0n.22P3 0n    0   22         0 SSD-NVM   N/A 63849/16345536    63857/16347584
      
    3. run -node local disk show -n를 실행하여 디스크 파티션이 Not Owned이고 2 * <number of disks> 파티션이 있는지 확인합니다. 이 예에서는 디스크 12개의 소유되지 않은 파티션 24개를 보여줍니다.

      ::> run -node local disk show -n
        DISK       OWNER                    POOL   SERIAL NUMBER         HOME                    DR HOME
      ------------ -------------            -----  -------------         -------------           -------------
      0n.21P1      Not Owned                  NONE   S5Y0NA0T100941NP001
      0n.21P2      Not Owned                  NONE   S5Y0NA0T100941NP002
      0n.22P1      Not Owned                  NONE   S5Y0NA0T100944NP001
      0n.22P2      Not Owned                  NONE   S5Y0NA0T100944NP002
      0n.18P1      Not Owned                  NONE   S5Y0NA0T101588NP001
      0n.18P2      Not Owned                  NONE   S5Y0NA0T101588NP002
      0n.20P1      Not Owned                  NONE   S5Y0NA0T100947NP001
      0n.20P2      Not Owned                  NONE   S5Y0NA0T100947NP002
      0n.3P1       Not Owned                  NONE   S5Y0NA0T100942NP001
      0n.3P2       Not Owned                  NONE   S5Y0NA0T100942NP002
      0n.1P1       Not Owned                  NONE   S5Y0NA0T100943NP001
      0n.1P2       Not Owned                  NONE   S5Y0NA0T100943NP002
      0n.5P1       Not Owned                  NONE   S5Y0NA0T101314NP001
      0n.5P2       Not Owned                  NONE   S5Y0NA0T101314NP002
      0n.2P1       Not Owned                  NONE   S5Y0NA0T100946NP001
      0n.2P2       Not Owned                  NONE   S5Y0NA0T100946NP002
      0n.23P1      Not Owned                  NONE   S5Y0NA0T100939NP001
      0n.23P2      Not Owned                  NONE   S5Y0NA0T100939NP002
      0n.19P1      Not Owned                  NONE   S5Y0NA0T101608NP001
      0n.19P2      Not Owned                  NONE   S5Y0NA0T101608NP002
      0n.0P1       Not Owned                  NONE   S5Y0NA0T100873NP001
      0n.0P2       Not Owned                  NONE   S5Y0NA0T100873NP002
      0n.4P1       Not Owned                  NONE   S5Y0NA0T101609NP001
      0n.4P2       Not Owned                  NONE   S5Y0NA0T101609NP002
      
    4. 이 단계 중 하나라도 실패하면 시스템을 초기화하세요.

16.3. 네트워크 시간 프로토콜 설정

부트스트랩 클러스터에서 실행되는 NTP 릴레이의 NTP 서버 IP를 가져옵니다.

  kubectl get ntpservers -n ntp-system -o jsonpath='{.items[*].status.managementIP}{"\n"}'

각 NTP 서버에 대해 첫 번째 ONTAP 노드에서 다음 명령어를 실행합니다.

  cluster time-service ntp server create -server NTP_SERVER_IP

예를 들어 ONTAP 노드가 kb-ad-stge01-01, kb-ad-stge01-02, kb-ad-stge02-01, kb-ad-stge02-02인 경우 kb-ad-stge01-01 노드에서 명령어를 실행합니다.

16.4. cellcfg 폴더 확인

파일 저장소의 저장소 사용자 이름 및 비밀번호 값을 검색하려면 저장소 전용 하드웨어 공급업체 파일을 사용하세요(예: WO15_SO7100911835-2_GDCH-4d-A250-A400_DD-010223.xlsx).

16.4.1. 관리자 비밀번호 확인

StorageCluster.spec.adminSecretName 다음에 나오는 /CELLCFG/file-storage.yaml에서 참조되는 ONTAP 보안 비밀 이름을 찾습니다.

해당 보안 비밀을 찾아 값이 채워져 있는지 확인합니다. 그렇지 않은 경우 관리자 사용자 이름과 비밀번호를 바꿉니다.

  apiVersion: v1
  kind: Secret
  metadata:
    name: SECRET_NAME
    namespace: gpc-system
  type: Opaque
  stringData:
    netapp_username: admin
    netapp_password: PASSWORD

16.4.2. ONTAP 라이선스 확인

ONTAP 소프트웨어 라이선스는 하드웨어 공급업체에서 제공해야 합니다.

/cellcfg/af-storage.yaml 폴더에서 StorageCluster.spec.licenses 필드를 찾아 라이선스가 채워져 있는지 확인합니다. 그렇지 않은 경우 라이선스를 사용하여 필드를 채웁니다.

  apiVersion: ontap.netapp.storage.private.gdc.goog/v1alpha1
  kind: StorageCluster
  metadata:
    creationTimestamp: null
    name: zl-stge-clus-01
    namespace: gpc-system
  spec:
  ...
    licenses:
      - LICENSE_1
      - LICENSE_2
      - LICENSE_3

참고로 라이선스 항목이 셀 구성에 표시되는 방식의 예는 다음과 같습니다.

  licenses:

  ABGITNWODUEVQELPECCAAAAAAAAA
  AHJJWYTTTXKZOFKVBTBAAAAAAAAA
  AHZTHBPQACAAAAKVBTBAAAAAAAAA
  ALTXOYXSVDDCMADPECCAAAAAAAAA
  ANWFPBPQACAAAAKVBTBAAAAAAAAA
  APLKENWODUEVQELPECCAAAAAAAAA
  ARIHVQFAHJMIWBDPECCAAAAAAAAA
  AXFTCRFAHJMIWBDPECCAAAAAAAAA

16.5. 실행 전 유효성 검사

유효성 검사 명령어를 실행합니다.

gdcloud system check-config --config PATH_TO_CELL_CONFIG --artifacts-directory PATH_TO_ARTIFACTS \
    --scenario FileBlockStorage

로그에 오류가 있으면 메시지에 따라 문제를 해결하고 유효성 검사를 다시 실행합니다.

16.5.1. 잠재적 문제

이 섹션에는 파일 블록 스토리지 어플라이언스의 사전 유효성 검사를 실행할 때 발생할 수 있는 문제가 포함되어 있습니다.

16.5.1.1. StorageAggregate의 NumDisks

잘못된 디스크 수에 대한 유효성 검사 실패는 무시하되 StorageAggregate CR에서 NumDisks 값을 수동으로 확인합니다. StorageAggregatexx-storage.yaml 파일에 정의되어 있습니다.

하나의 파일 블록 어플라이언스에 대해 StorageAggregates로 구성된 총 디스크 수는 어플라이언스에 표시된 디스크 수에서 예비 디스크 수를 뺀 수와 일치해야 합니다. 디스크 12개당 예비 디스크 1개를 예약하는 것이 좋습니다.

NumDisks 값을 계산하려면 다음 수식을 사용하세요.

NumDisks = (Total_Disks/2) - ceil(Total_Disks/12)

이 섹션에 설명된 (24/2) - ceil(24/12) 예시에 공식을 적용하면 NumDisks10과 같습니다.

16.6. 설치 실행

설치 명령어를 실행합니다.

  gdcloud system storage install -v 3 --config PATH_TO_CELL_CONFIG

이 명령어는 다음을 수행합니다.

  • NetApp 클러스터를 설정하고 사용 가능한 노드를 추가합니다.
  • 집계를 만듭니다.
  • 데이터 포트에서 LACP 및 VLAN을 설정합니다.
  • 라이선스 설정
  • 모니터링 구성
  • 외부 키 관리를 구성합니다.

작업이 완료되면 ONTAP 콘솔에서 node show를 실행하여 다음과 같은 경고가 없는지 확인합니다.

kb-stge-clus-01::> node show
Node      Health Eligibility Uptime        Model       Owner    Location
--------- ------ ----------- ------------- ----------- -------- ---------------
kb-ad-stge01-01
          true   true         5 days 02:49 AFF-A250
kb-ad-stge01-02
          true   true         6 days 18:24 AFF-A250
kb-ad-stge02-01
          true   true         5 days 01:52 AFF-A800
kb-ad-stge02-02
          true   true         5 days 01:52 AFF-A800
kb-ad-stge03-01
          true   true         7 days 00:15 AFF-A400
kb-ad-stge03-02
          true   true         7 days 00:26 AFF-A400

Warning: Cluster operation (cluster join) for node "kb-ad-stge03-01" is not complete and the node is not fully functional.
         Run "cluster join" on that node to complete the operation.
6 entries were displayed.

있는 경우 안내에 따라 이러한 노드에 로그인하고 해당 cluster join 명령어를 실행하여 작업 후 사라지는지 확인합니다.

16.7. 보안 설정 업데이트

  1. 로그인 배너를 설정합니다.

    security login banner modify -vserver <cluster name> -message "<banner>"
    
  2. CLI 세션 제한 시간을 10분으로 제한합니다.

    system timeout modify 10
    
  3. 관리자 역할에 비밀번호 복잡성 및 최대 로그인 시도 횟수를 적용합니다.

    security login role config modify -vserver CLUSTER_NAME -role admin -passwd-minlength 15 -passwd-min-special-chars 1 -passwd-min-lowercase-chars 1 -passwd-min-uppercase-chars 1 -passwd-min-digits 1 -disallowed-reuse 25 -max-failed-login-attempts 3
    
  4. UI 세션 시간 제한을 10분으로 제한합니다.

    ::> set diag
    
    Warning: These diagnostic commands are for use by NetApp personnel only.
    Do you want to continue? {y|n}: y
    
    ::> cluster application-record create -name sysmgr.inactivitytimeout -value 10 -vserver <cluster name>
    
  5. 사용자 잠금 설정을 조정합니다.

    ::> security login role config modify -vserver * -max-failed-login-attempts 3 -lockout-duration 1 -role *
    ::> security ssh modify -vserver * -max-authentication-retry-count 3
    
  6. USB 포트를 사용 중지합니다 (적용하려면 재부팅해야 함).

    ::> set diag
    ::*> system node usb-ports modify -node * -is-disabled-next-boot true
    
  7. 부트스트랩 인증서를 삭제합니다.

    1. bootstrap-web-ca 인증서를 찾습니다.

        ::> security certificate show-user-installed
      

      bootstrap-web-ca 인증서가 있으면 출력은 다음과 같습니다.

      Vserver    Serial Number   Certificate Name                       Type
      ---------- --------------- -------------------------------------- ------------
      aa-aa-stge01
                45B86E1B5CF1CC144B874C80A39D2A99
                                bootstrap-web-ca                       server-ca
          Certificate Authority: bootstrap-web-ca
                Expiration Date: Mon Feb 19 22:55:03 2029
      
  8. 노드를 재부팅하려면 다음 명령어를 사용하여 한 번에 하나씩 재부팅합니다.

    ::> system node reboot -node <node-name> -inhibit-takeover true
    

16.8. 긴급 액세스 사용자 저장

설정 중에 4개의 비상 계정이 자동으로 생성되고 다음과 같은 Kubernetes 비밀로 저장됩니다.

  • storage-root-level1
  • storage-root-level1-backup
  • storage-root-level2
  • storage-root-level2-backup

storage-root-level2storage-root-level2-backup의 경우 규정에 따라 사용자 인증 정보를 종이에 저장하고 안전하게 보관하세요.

  1. 다음 명령어를 사용하여 보안 비밀에서 사용자 이름과 비밀번호를 가져옵니다. 이때 SECRET_NAME을 사용할 보안 비밀로 바꿉니다.

    kubectl get secret -n gpc-system SECRET_NAME -o jsonpath='{.data.username}' | base64 --decode
    kubectl get secret -n gpc-system SECRET_NAME -o jsonpath='{.data.password}' | base64 --decode
    
  2. ONTAP 클러스터의 이름을 가져옵니다.

      ::> cluster identity show
    
  3. 관리자 권한이 있는 예상치 못한 사용자가 있는지 확인합니다.

      ::> useradmin user list
    
    1. 선택사항: 인프라 운영자의 승인을 받아 삭제합니다. 항상 프로덕션 및 고객 워크로드에서 다음을 실행합니다.
          ::> security login delete -user-or-group-name <username> -vserver <Cluster Name> -authentication-method password -application amqp
    
          ::> security login delete -user-or-group-name <username> -vserver <Cluster Name> -authentication-method password -application console
    
          ::> security login delete -user-or-group-name <username> -vserver <Cluster Name> -authentication-method password -application http
    
          ::> security login delete -user-or-group-name <username> -vserver <Cluster Name> -authentication-method password -application ontapi
    
          ::> security login delete -user-or-group-name <username> -vserver <Cluster Name> -authentication-method password -application service-processor
    
          ::> security login delete -user-or-group-name <username> -vserver <Cluster Name> -authentication-method password -application ssh
      ```
    
  4. 이전 단계에서 만든 NetApp 관리 사용자를 삭제합니다.

        ::> security login delete -user-or-group-name admin -vserver <Cluster Name> -authentication-method password -application amqp
    
        ::> security login delete -user-or-group-name admin -vserver <Cluster Name> -authentication-method password -application console
    
        ::> security login delete -user-or-group-name admin -vserver <Cluster Name> -authentication-method password -application http
    
        ::> security login delete -user-or-group-name admin -vserver <Cluster Name> -authentication-method password -application ontapi
    
        ::> security login delete -user-or-group-name admin -vserver <Cluster Name> -authentication-method password -application service-processor
    
        ::> security login delete -user-or-group-name admin -vserver <Cluster Name> -authentication-method password -application ssh
    
  5. 리드 인프라 운영자 (IO)는 각 어플라이언스의 사용자 이름과 비밀번호를 별도의 종이에 알아보기 쉽게 적습니다. 내용이 보이지 않도록 서류를 접고 'TOR 스위치 1의 루트 사용자 인증 정보'와 같이 서류에 라벨을 지정한 후 안전하게 보관할 수 있도록 L1 엔지니어에게 전달합니다.

  6. 리드 IO가 지켜보는 가운데 L1 엔지니어가 서류를 물리적 금고에 보관합니다.

  7. IO는 보안 비밀에 주석을 추가하여 보안 비밀이 안전에 저장되었음을 표시합니다.

    kubectl annotate secrets storage-root-level2 -n gpc-system disk.gdc.goog/persisted=''
    

    16.9. NTP 서버 업데이트

관리자 클러스터를 설치한 후 다음 단계를 실행합니다.

  1. 관리자 클러스터에서 실행되는 NTP 릴레이의 새 NTP 서버 IP를 가져옵니다.

    kubectl get ntpservers -n gpc-system
    
  2. ONTAP에서 기존 NTP 서버를 모두 삭제합니다.

    cluster time-service ntp server show
    cluster time-service ntp server delete -server NTP_SERVER_IP
    
  3. ONTAP에 새 NTP 서버를 추가합니다.

    cluster time-service ntp server create -server NTP_SERVER_IP