TheKoguryo's 기술 블로그

 Version 2023.11.20

7.4 Multicluster에 애플리케이션 배포하기

Helidon 예제 애플리케이션 배포하기

Helidon 프레임워크를 사용해서 개발한 Java 애플리케이션을, Open Application Model을 사용해서 Verrazzano에서 배포하는 것을 앞서 확인하였습니다. 단일 Kubernetes 클러스터에 대해서 배포하는 것을 확인했습니다.

이번에는 멀티 클러스터 환경에서 배포하는 것을 확인해 보겠습니다. Verrazzano가 배포된 3개의 클러스터를 기준으로 확인해 봅니다.

  • Admin Cluster
    • admin-cluster
  • Managed Cluster
    • managed-cluster-1
    • managed-cluster-2
애플리케이션 배포
  1. namespace 생성

    • 단일 클러스터 기준 (참고)

      앞서 예제에서 배포할 namespace를 생성하고 라벨을 사전에 설정해야 했습니다.

      kubectl create namespace hello-helidon
      kubectl label namespace hello-helidon verrazzano-managed=true istio-injection=enabled
      
    • 멀티 클러스터를 위해 namespace를 생성(즉, Project를 생성)

      • 애플리케이션이 배포될 멀티클러스터에 걸쳐있는 namespace를 관리하기 위해서 VerrazzanoProject 유형을 제공합니다. Admin Cluster에 다음 명령을 수행하면, Admin Cluster 및 대상 Managed Cluster에 해당 namespace가 생성되면 verrazzano에서 관리하게 됩니다.
      • 아래 설정을 admin-cluster에 배포합니다.
      apiVersion: clusters.verrazzano.io/v1alpha1
      kind: VerrazzanoProject
      metadata:
        name: hello-helidon
        namespace: verrazzano-mc
      spec:
        template:
          namespaces:
            - metadata:
                name: hello-helidon
        placement:
          clusters:
            - name: managed-cluster-1
            - name: managed-cluster-2      
      
    • 결과 확인

      VerrazzanoProject 만들면 아래와 같이 대상 클러스터들에 namespace가 만들어지고 자동으로 라벨이 부여됩니다.

      [opc@bastion-host ~ ( )]$ kubectl config use-context admin-cluster
      Switched to context "admin-cluster".
      [opc@bastion-host ~ (|admin-cluster:default)]$ kubectl get ns hello-helidon --show-labels
      NAME            STATUS   AGE     LABELS
      hello-helidon   Active   4m50s   istio-injection=enabled,verrazzano-managed=true
      [opc@bastion-host ~ (|admin-cluster:default)]$ kubectl config use-context managed-cluster-1
      Switched to context "managed-cluster-1".
      [opc@bastion-host ~ (|managed-cluster-1:default)]$ kubectl get ns hello-helidon --show-labels
      NAME            STATUS   AGE     LABELS
      hello-helidon   Active   4m50s   istio-injection=enabled,verrazzano-managed=true
      [opc@bastion-host ~ (|managed-cluster-1:default)]$ kubectl config use-context managed-cluster-2
      Switched to context "managed-cluster-2".
      [opc@bastion-host ~ (|managed-cluster-2:default)]$ kubectl get ns hello-helidon --show-labels
      NAME            STATUS   AGE    LABELS
      hello-helidon   Active   5m3s   istio-injection=enabled,verrazzano-managed=true
      
  2. Component 배포

    단일 클러스터, 멀티 클러스터 차이가 없습니다. 설정 파일은 이전과 동일하고 대신 admin-cluster에 배포합니다.

    kubectl apply -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.1.0/examples/hello-helidon/hello-helidon-comp.yaml
    
  3. Application Configuration 배포

    • 멀티 클러스터 배포를 위한 YAML 예시

      멀티 클러스터 배포시에는 MultiClusterApplicationConfiguration 유형을 사용합니다. 기존 ApplicationConfiguration에서 정의된 부분이 MultiClusterApplicationConfiguration의 하위 spec으로 들어간 것을 알 수 있습니다. 또한 멀티클러스터 배포를 위한 placement 구문이 추가됩니다.

      apiVersion: clusters.verrazzano.io/v1alpha1
      kind: MultiClusterApplicationConfiguration
      metadata:
        name: hello-helidon-appconf
        namespace: hello-helidon
      spec:
        template:
          metadata:
            annotations:
              version: v1.0.0
              description: "Hello Helidon application"
          spec:
            components:
              - componentName: hello-helidon-component
                traits:
                  ...
      
        placement:
          clusters:
            - name: managed-cluster-1
      
    • 멀티 클러스터 배포용 Application Configuration을 각자 placement에 맞게 수정하여 배포합니다.

      wget https://raw.githubusercontent.com/verrazzano/verrazzano/v1.1.0/examples/multicluster/hello-helidon/mc-hello-helidon-app.yaml
      # placement 수정
      kubectl apply -f mc-hello-helidon-app.yaml
      
      • 필요하면 이전 단일클러스터 배포시 사용한 아래 파일과 직접 비교해봅니다.

        https://raw.githubusercontent.com/verrazzano/verrazzano/v1.1.0/examples/hello-helidon/hello-helidon-app.yaml
        
  4. 배포결과

    admin-cluster에 Componet와 Application을 배포하면, 아래 결과에서 보듯이 placement로 지정한 클러스터에 배포되는 것을 알 수 있습니다.

    [opc@bastion-host ~ (|admin-cluster:default)]$ kubectl apply -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.1.0/examples/hello-helidon/hello-helidon-comp.yaml
    component.core.oam.dev/hello-helidon-component created
    [opc@bastion-host ~ (|admin-cluster:default)]$ kubectl apply -f mc-hello-helidon-app.yaml
    multiclusterapplicationconfiguration.clusters.verrazzano.io/hello-helidon-appconf created
    [opc@bastion-host ~ (|admin-cluster:default)]$ kubectl get multiclusterapplicationconfigurations,component,deployment -n hello-helidon
    NAME                                                                                AGE
    multiclusterapplicationconfiguration.clusters.verrazzano.io/hello-helidon-appconf   11m
    
    NAME                                             WORKLOAD-KIND               AGE
    component.core.oam.dev/hello-helidon-component   VerrazzanoHelidonWorkload   17m
    
    [opc@bastion-host ~ (|admin-cluster:default)]$ kubectl config use-context managed-cluster-1
    Switched to context "managed-cluster-1".
    [opc@bastion-host ~ (|managed-cluster-1:default)]$ kubectl get multiclusterapplicationconfigurations,component,deployment -n hello-helidon
    NAME                                                                                AGE
    multiclusterapplicationconfiguration.clusters.verrazzano.io/hello-helidon-appconf   11m
    
    NAME                                             WORKLOAD-KIND               AGE
    component.core.oam.dev/hello-helidon-component   VerrazzanoHelidonWorkload   11m
    
    NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/hello-helidon-deployment   1/1     1            1           11m
    
    [opc@bastion-host ~ (|managed-cluster-1:default)]$ kubectl config use-context managed-cluster-2
    Switched to context "managed-cluster-2".
    [opc@bastion-host ~ (|managed-cluster-2:default)]$ kubectl get multiclusterapplicationconfigurations,component,deployment -n hello-helidon
    No resources found in hello-helidon namespace.
    
  5. 배포된 앱의 istio를 통해 등록된 ingress DNS 확인

    kubectl get gateway hello-helidon-hello-helidon-appconf-gw \
        -n hello-helidon \
        -o jsonpath='{.spec.servers[0].hosts[0]}'
    
  6. 실행예시

    $ kubectl get gateway hello-helidon-hello-helidon-appconf-gw \
    >     -n hello-helidon \
    >     -o jsonpath='{.spec.servers[0].hosts[0]}'
    hello-helidon-appconf.hello-helidon.mc-1.thekoguryo.ml
    
  7. 애플리케이션 테스트

    확인된 https://{ingress DNS 주소}/greet 주소로 정상 호출되는 것을 알 수 있습니다.

    image-20220105180344437

모니터링

Verrazzano 콘솔
  1. Verrazzano Console에 로그인합니다.

    예) https://verrazzano.myenv.thekoguryo.ml

    • 접속 유저: verrazzano
    • 암호: 설치시 초기화한 암호
  2. 왼쪽 Resources 항목에서 Application과 Component 항목에서 배포된 앱 정보를 확인할 수 있습니다.

    image-20220105181018438

로그 모니터링(Elasticsearch / Kibana)
  1. Verrazzano 콘솔에서 Kibana 링크를 클릭합니다. SSO 구성이 되어 추가 로그인은 필요없습니다.

  2. 단일 클러스터와 배포시와 동일한 방법으로 verrazzano-namespace-hello-helidon 네임스페이스로 인덱스 패턴을 생성합니다.

  3. 생성한 인덱스 패턴에 대해 수집된 로그, 대상 namespace 상의 전체 수집된 로그가 보입니다. admin-cluster는 등록된 Managed Cluster 모두의 로그를 수집합니다. 앞서 배포된 앱는 managed-cluster-1에만 배포했기 때문에 실제 수집된 로그도 동일함을 알수 있습니다.

    image-20220105181629947

메트릭 모니터링(Prometheus / Grafana)
  1. Verrazzano 콘솔에서 Grafana 링크를 클릭합니다. SSO 구성이 되어 추가 로그인은 필요없습니다.

  2. 기본 제공하고 있는 대쉬보드 중에 Helidon 대쉬보드를 선택합니다.

  3. Helidon 대쉬보드에서 앞서 배포한 앱의 상태를 확인할 수 있습니다. 모든 클러스터에 수집된 메트릭을 볼 수 있으면, 실제 managed-cluster-1에 있기 때문에 수집된 데이터 기준으로 보이게 됩니다.

    image-20220105182115650

Helidon 예제 애플리케이션 배포 변경

애플리케이션 배포 위치 변경
  1. placement 항목을 통해 클러스터 위치를 변경할 수 있습니다. 변경할 placement 파일을 생성합니다.

    # patch.yaml
    spec:
      placement:
        clusters:
          - name: managed-cluster-2
    
  2. 배포 위치 변경

    kubectl patch MultiClusterApplicationConfiguration hello-helidon-appconf \
        -n hello-helidon \
        --type merge \
        --patch "$(cat patch.yaml)"
    
  3. 배포결과 확인

    앞서 managed-cluster-1에 배포되어 있던 앱이 managed-cluster-2로 위치가 변경된 것을 알 수 있습니다.

    [opc@bastion-host ~ (|admin-cluster:default)]$ kubectl patch MultiClusterApplicationConfiguration hello-helidon-appconf \
    >     -n hello-helidon \
    >     --type merge \
    >     --patch "$(cat patch.yaml)"
    multiclusterapplicationconfiguration.clusters.verrazzano.io/hello-helidon-appconf patched
    [opc@bastion-host ~ (|admin-cluster:default)]$ kubectl config use-context managed-cluster-1
    Switched to context "managed-cluster-1".
    [opc@bastion-host ~ (|managed-cluster-1:default)]$ kubectl get multiclusterapplicationconfigurations,component,deployment -n hello-helidon
    No resources found in hello-helidon namespace.
    [opc@bastion-host ~ (|managed-cluster-1:default)]$ kubectl config use-context managed-cluster-2
    Switched to context "managed-cluster-2".
    [opc@bastion-host ~ (|managed-cluster-2:default)]$ kubectl get multiclusterapplicationconfigurations,component,deployment -n hello-helidon
    NAME                                                                                AGE
    multiclusterapplicationconfiguration.clusters.verrazzano.io/hello-helidon-appconf   3m25s
    
    NAME                                             WORKLOAD-KIND               AGE
    component.core.oam.dev/hello-helidon-component   VerrazzanoHelidonWorkload   2m26s
    
    NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/hello-helidon-deployment   1/1     1            1           2m22s
    


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

Last updated on 5 Jan 2022