TheKoguryo's 기술 블로그

 Version 2023.11.20

5.1.1 OCI Ingress Controller 설치하기

OKE에서 Kubernetes에서 사용가능한 여러가지 오픈 소스 ingress controller를 사용할 수 있습니다. 본 문서에서는 그중에서 가장 많이 사용되며, OKE 문서에서 예제로 설명하고 있는 nginx-ingress-controller를 테스트 해보겠습니다.

Step 1. OKE Cluster 생성

  1. 다음 설정으로 OKE Cluster를 생성합니다.
    • Kubernetes 1.26.2
    • OCI VCN-Native Pod Networking CNI
    • Node Pool 이미지로 Oracle Linux 7 사용

Step 2. Load Balancer를 위한 Security Rules 추가

OCI VCN-Native Pod Networking CNI를 사용하기 때문에 이후 OCI Load Balancer에서 Pod로 분배를 위해서는 Load Balancer에서 Pod의 OCI Private IP로 통신을 위한 보안 규칙을 Security Rule에 추가해 주어야 합니다. 이 부분은 매뉴얼하게 추가하는 것이 필요합니다. 이후 테스트 앱 설정에서 추가하도록 하겠습니다.

Step 3. 권한 부여를 위한 Dynamic Group 만들기

OCI Native Ingress Controller가 필요한 OCI 자원을 관리할 수 있도록 권한을 부여합니다. User Principal 또는 Instance Principal을 사용할 수 있습니다. 편의상 여기서는 Instance Principal을 사용합니다.

  1. OCI 콘솔에 로그인합니다.

  2. 좌측 상단 햄버거 메뉴에서 Identity & Security > Identity > Compartments로 이동합니다.

  3. OKE 클러스터가 있는 Compartment의 OCID를 확인합니다.

  4. 좌측 Dynamic Group 메뉴로 이동하여 아래 규칙을 가진 Dynamic Group을 만듭니다.

    • Name: 예, oke-native-ingress-controller-dyn-grp
    instance.compartment.id = '<compartment-ocid>'
    

Step 4. OCI Native Ingress Controller에 권한 부여하기

  1. OCI 콘솔에 로그인합니다.

  2. 좌측 상단 햄버거 메뉴에서 Identity & Security > Identity > Policies로 이동합니다.

  3. 아래 규칙을 가진 Policy를 만듭니다

    • Name: 예, oke-native-ingress-controller-policy
    • subject-name: 앞서 만든 dynamic group 이름, 예, oke-native-ingress-controller-dyn-grp
    • location: 대상 OKE Cluster가 위치한 compartment 이름
    Allow dynamic-group <subject-name> to manage load-balancers in compartment <compartment-name>   
    Allow dynamic-group <subject-name> to use virtual-network-family in compartment <compartment-name> 
    Allow dynamic-group <subject-name> to manage cabundles in compartment <compartment-name> 
    Allow dynamic-group <subject-name> to manage cabundle-associations in compartment <compartment-name> 
    Allow dynamic-group <subject-name> to manage leaf-certificates in compartment <compartment-name> 
    Allow dynamic-group <subject-name> to read leaf-certificate-bundles in compartment <compartment-name> 
    Allow dynamic-group <subject-name> to manage certificate-associations in compartment <compartment-name> 
    Allow dynamic-group <subject-name> to read certificate-authorities in compartment <compartment-name> 
    Allow dynamic-group <subject-name> to manage certificate-authority-associations in compartment <compartment-name> 
    Allow dynamic-group <subject-name> to read certificate-authority-bundles in compartment <compartment-name> 
    

Step 5. Cert-manager 설치하기

  1. 대상 OKE Cluster에 cert-managet를 설치합니다.

    kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml
    

Step 6. Helm CLI 설치하기

Helm CLI 설치 문서를 참고하여 사용할 수 있도록 클라이언트 환경에 설치합니다.

Step 7. OCI Native Ingress Controller 설치

  1. OCI Native Ingress Controller 리포지토리를 가져옵니다.

    git clone https://github.com/oracle/oci-native-ingress-controller
    
  2. oci-native-ingress-controller 폴더로 이동

  3. vi helm/oci-native-ingress-controller/values.yaml 파일을 수정합니다.

    1. compartment_id: OCI Load Balancer와 OCI Certificate이 생성될 Compartment ID를 지정합니다.

      compartment_id: "ocid1.compartment.oc1..aaaaaaaa______ddq" 
      
    2. subnet_id: 생성될 OCI Load Balancer가 위치할 Subnet의 ID를 지정합니다.

      subnet_id: "ocid1.subnet.oc1.iad.aaaaaaaa______dba" 
      
    3. authType: Instance Principal을 뜻하는 기본 instance 값을 그대로 사용합니다.

      authType: instance
      
    4. Ingress Controller의 Pod의 가용성을 늘리고 싶은 경우 replica를 늘립니다.

      replicaCount: 3
      
    5. 수정후 저장합니다.

  4. Helm CLI를 통해 설치합니다.

    helm install oci-native-ingress-controller helm/oci-native-ingress-controller
    
  5. 설치 결과를 확인합니다.

    kubectl get pods -n native-ingress-controller-system -o wide
    
    • 예시

      $ kubectl get pods -n native-ingress-controller-system -o wide
      NAME                                             READY   STATUS    RESTARTS   AGE    IP           NODE          NOMINATED NODE   READINESS GATES
      oci-native-ingress-controller-7666f768b6-452t6   1/1     Running   0          2m9s   10.0.40.26   10.0.10.213   <none>           <none>
      oci-native-ingress-controller-7666f768b6-722wk   1/1     Running   0          2m9s   10.0.40.57   10.0.10.93    <none>           <none>
      oci-native-ingress-controller-7666f768b6-ttr2c   1/1     Running   0          2m9s   10.0.40.81   10.0.10.156   <none>           <none>
      

OCI Native Ingress 자원 만들기

OCI Native Ingress Controller를 사용하기 위해서는 몇가지 쿠버네티스 자원을 만들어야 합니다.

  • IngressClassParameters: OCI Native Ingress Controller를 통해 OCI Load Balancer를 만들기 위한 기본 정보를 입력합니다.
  • IngressClass: 실제 OCI Load Balancer를 만드는데 사용됩니다. IngressClassParameters에 정의된 정보를 기반으로 OCI Load Balancer를 생성합니다.
  • Ingress: OCI Load Balancer로 들어오는 외부 요청을 Pod Backend로 분배할 규칙을 정의합니다.

이전에 테스트한 Nginx Ingress Controller와 동일한 순서로 진행하기 위해서, 여기서는 IngressClass까지만 만들겠습니다.

IngressClassParameters 만들기
  1. 설정 가능 항목은 아래와 같습니다.

    • 생성할 OCI Load Balancer가 위치할 서브넷, Shape, Public/Private 여부, 이름 등을 입력할 수 있습니다.
    apiVersion: "ingress.oraclecloud.com/v1beta1"
    kind: IngressClassParameters
    metadata:
      name: <icp-name>
      namespace: <ns-name>
    spec:
      compartmentId: "<compartment-ocid>"
      subnetId: "<subnet-ocid>"
      loadBalancerName: "<lb-name>"
      isPrivate: false
      maxBandwidthMbps: <max-bw>
      minBandwidthMbps: <min-bw>
    
  2. 아래와 배포 파일을 작성합니다.

    • 파일명: 예, native-ic-ingress-params.yaml
    • OCI Native Ingress Controller 설치시 지정한 서브넷을 그대로 사용하는 경우, 아래와 같이 최소 필요한 정보로 배포합니다.
      • OCI Load Balancer의 서브넷을 Helm 배포시 정할시, IngressClassParameters에 입력할지는 관리할 편한 쪽으로 할 필요가 있습니다.
    apiVersion: ingress.oraclecloud.com/v1beta1
    kind: IngressClassParameters
    metadata:
      name: native-ic-ingress-params
      namespace: native-ingress-controller-system
    spec:
      loadBalancerName: "native-ingress-controller-lb"
      isPrivate: false
      minBandwidthMbps: 100
      maxBandwidthMbps: 400
    
  3. 대상 클러스터에 배포합니다.

    kubectl apply -f native-ic-ingress-params.yaml
    
IngressClass 만들기
  1. 설정 가능 항목은 아래와 같습니다.

    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: <ic-name>
      annotations:
        ingressclass.kubernetes.io/is-default-class: "<true|false>"
    spec:
      controller: oci.oraclecloud.com/native-ingress-controller
      parameters:
        scope: Namespace
        namespace: <ns-name>
        apiGroup: ingress.oraclecloud.com
        kind: ingressclassparameters
        name: <icp-name>
    
  2. 아래와 배포 파일을 작성합니다.

    • 파일명: 예, native-ic-ingress-class.yaml
    • OCI Native Ingress Controller 사용하고, IngressClassParameters를 앞서 만든 자원으로 지정해 줍니다.
    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: native-ic-ingress-class
      annotations:
        ingressclass.kubernetes.io/is-default-class: "true"
    spec:
      controller: oci.oraclecloud.com/native-ingress-controller
      parameters:
        scope: Namespace
        namespace: native-ingress-controller-system
        apiGroup: ingress.oraclecloud.com
        kind: ingressclassparameters
        name: native-ic-ingress-params
    
  3. 대상 클러스터에 배포합니다.

    kubectl apply -f native-ic-ingress-class.yaml
    
  4. 배포 결과를 확인합니다.

    • 생성된 IngressClass를 조회하면, Annotation에서 생성된 OCI Load Balancer의 ID를 확인할 수 있습니다.
    $ kubectl describe IngressClass native-ic-ingress-class
    Name:         native-ic-ingress-class
    Labels:       <none>
    Annotations:  ingressclass.kubernetes.io/is-default-class: true
                  oci-native-ingress.oraclecloud.com/id: ocid1.loadbalancer.oc1.ap-chuncheon-1.aaaaaaaa_______________________________________________gbfpa              
    Controller:   oci.oraclecloud.com/native-ingress-controller
    Parameters:
      APIGroup:  ingress.oraclecloud.com
      Kind:      ingressclassparameters
      Name:      native-ic-ingress-params
    Events:      <none>
    
Load Balancer IP 확인
  1. OCI 콘솔에 로그인합니다.

  2. 좌측 상단 햄버거 메뉴에서 Networking > Load Balancers > Load Balancer로 이동합니다.

  3. IngressClassParameters에서 지정한 이름으로 Load Balancer가 생성된 것을 확인할 수 있습니다.

    • 아직 라우팅할 Backend가 설정되어 있지 않기 때문에 Pending 상태입니다.
    • 여기서 Load Balancer IP를 확인할 수 있습니다. 쿠버네티스에서 이후 Ingress 규칙을 생성하게 되면, kubectl 명령으로 확인할 수 있습니다.

    image-20230612173401157



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 9 Jun 2023