일반적으로 DevOps 엔지니어가 vSphere IaaS control plane 환경에서 VM을 프로비저닝하는 경우 OVF 템플릿에는 기본 네트워크 구성과 같은 하드 코딩된 세부 정보가 포함됩니다. 하지만 VM CR이 생성될 때까지 IPAM 제공 네트워크 데이터와 같은 특정 값을 알지 못하고 VM의 OVF 속성에 할당할 수 없는 경우가 많습니다. 템플릿 문자열이 지원되면 네트워크 정보를 미리 알 필요가 없습니다. Golang 기반 템플릿을 사용하여 OVF 속성 값을 채우고 VM의 네트워크 스택을 구성할 수 있습니다.

프로시저

  1. 구성할 모든 속성에 대해 OVF 파일에 ovf:userConfigurable="true" 항목이 포함되어 있는지 확인합니다.
    이 항목을 통해 시스템은 데이터가 수집된 후 네트워킹 값 자리 표시자(예: nameservers 및 management IP)를 실제 데이터로 대체할 수 있습니다.
    다음 예를 사용합니다.
    <Property ovf:key="hostname" ovf:type="string" ovf:userConfigurable="true" ovf:value="ubuntuguest">
          <Description>Specifies the hostname for the appliance</Description>
    </Property>
    <Property ovf:key="nameservers" ovf:type="string" ovf:userConfigurable="true" ovf:value="1.1.1.1, 1.0.0.1">
          <Label>2.2. DNS</Label>
          <Description>A comma-separated list of IP addresses for up to three DNS servers</Description>
    </Property>
    <Property ovf:key="management_ip" ovf:type="string" ovf:userConfigurable="true">
          <Label>2.3. Management IP</Label>
          <Description>The static IP address for the appliance on the Management Port Group in CIDR format (Eg. ip/subnet mask bits). This cannot be DHCP.</Description>
    </Property>
  2. 템플릿 문자열을 사용하여 VM YAML 파일을 생성합니다.
    부트스트랩 리소스에 대한 템플릿 문자열은 OVF 속성 값을 채우는 데 필요한 데이터를 수집합니다.
    다음 방법 중 하나를 사용하여 템플릿 문자열을 구성할 수 있습니다.
    • vm-operator-api를 사용합니다.

      자세한 내용은 GitHub의 https://github.com/vmware-tanzu/vm-operator/blob/main/api/v1alpha2/virtualmachinetempl_types.go 페이지를 참조하십시오.

      다음은 샘플 YAML 파일입니다.
      apiVersion: vmoperator.vmware.com/v1alpha2
      kind: VirtualMachine
      metadata:
        name: template-vm
        namespace: test-ns
        annotations:
          vmoperator.vmware.com/image-supported-check: disable
      spec:
        className: best-effort-xsmall
        imageName: vmi-xxxx0000
        powerState: poweredOn
        storageClass: wcpglobal-storage-profile
        vmMetadata:
          configMapName: template-vm-1
          transport: vAppConfig
        
      ---
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: template-vm-1
        namespace: test-ns
      data:
        nameservers: "{{ (index .v1alpha2.Net.Nameservers 0) }}"
        hostname: "{{ .v1alpha2.VM.Name }} "                  
        management_ip: "{{ (index (index .v1alpha2.Net.Devices 0).IPAddresses 0) }}"
        management_gateway: "{{ (index .v1alpha2.Net.Devices 0).Gateway4 }}"
    • 다음 함수를 사용합니다.
      함수 이름 서명 설명
      V1alpha2_FirstIP func () string 첫 번째 NIC에서 첫 번째 비루프백 IP를 가져옵니다.
      V1alpha2_FirstIPFromNIC func (index int) string i번째 NIC에서 비루프백 IP 주소를 가져옵니다. 인덱스가 범위를 벗어나면 템플릿 문자열이 구문 분석되지 않습니다.
      V1alpha2_FormatIP func (IP string, netmask string) string 네트워크 길이로 IP 주소 형식을 지정합니다. 넷마스크는 길이(예: /24)이거나 십진수 표기법(예: 255.255.255.0)일 수 있습니다.

      입력된 넷마스크가 유효하지 않거나 기본 마스크와 다르면 구문 분석되지 않습니다.

      V1alpha2_FormatNameservers func (count int, delimiter string) string 특정 구분 기호를 사용하여 처음 발생한 네임서버 수의 형식을 지정합니다. count가 음수이면 모든 네임서버를 의미합니다.
      V1alpha2_IP func(IP string) string 기본 넷마스크 CIDR을 사용하여 정적 IP 주소 형식을 지정합니다.

      IP가 유효하지 않으면 템플릿 문자열이 구문 분석되지 않습니다.

      V1alpha2_IPsFromNIC func (index int) []string i번째 NIC의 모든 IP를 나열합니다.

      인덱스가 범위를 벗어나면 템플릿 문자열이 구문 분석되지 않습니다.

      함수를 사용하는 경우 YAML 파일은 다음과 같습니다.
      apiVersion: vmoperator.vmware.com/v1alpha2
      kind: VirtualMachine
      metadata:
        name: template-vm
        namespace: test-ns
      spec:
        className: best-effort-xsmall
        imageName: vmi-xxxx0000
        powerState: poweredOn
        storageClass: wcpglobal-storage-profile
        vmMetadata:
          configMapName: template-vm-2
          transport: vAppConfig
        
      ---
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: template-vm-2
        namespace: test-ns
      data:
        nameservers: "{{ V1alpha2_FormatNameservers 2 \",\" }}"
        hostname: "{{ .v1alpha2.VM.Name }} "                  
        management_ip: "{{ V1alpha2_FormatIP \"192.168.1.10\" \"255.255.255.0\" }}"
        management_gateway: "{{ (index .v1alpha2.Net.Devices 0).Gateway4 }}"
  3. VM을 배포합니다.
    kubectl apply -f file_name.yaml

다음에 수행할 작업

사용자 지정이 실패하고 VM이 IP 주소를 가져오지 하면 vSphere VM 웹 콘솔을 사용하여 VM을 검사합니다. vSphere VM 웹 콘솔을 사용하여 VM 문제 해결의 내용을 참조하십시오.