다른 네트워크에 앰비언트 멀티-프라이머리 설치하기

다른 네트워크에 앰비언트 멀티-프라이머리 설치하기 (Install ambient multi-primary on different networks)

이 가이드를 따라 cluster1과 cluster2 양쪽에 Istio 컨트롤 플레인을 설치해서 각각을 프라이머리 클러스터로 만들어 보세요 (이것이 현재 앰비언트 모드에서 지원하는 유일한 구성이에요). cluster1은 network1 네트워크에 있고, cluster2는 network2 네트워크에 있어요. 즉 클러스터 경계를 넘어 파드 간 직접 연결은 없어요.

출처: Istio 문서

본문

진행하기 전에 시작하기 전에 단계를 완료했는지 확인하세요.

이 구성에서 cluster1과 cluster2는 모두 각 클러스터의 API 서버를 관찰해서 엔드포인트를 얻어요.

클러스터 경계를 넘는 서비스 워크로드는 이스트-웨스트 트래픽용 전용 게이트웨이를 통해 간접적으로 통신해요. 각 클러스터의 게이트웨이는 다른 클러스터에서 도달할 수 있어야 해요.

cluster1의 기본 네트워크 설정하기 (Set the default network for cluster1)

istio-system 네임스페이스가 이미 생성되어 있다면, 그곳에 클러스터의 네트워크를 설정해야 해요:

$ kubectl --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1

cluster1을 프라이머리로 구성하기 (Configure cluster1 as a primary)

cluster1용 istioctl 구성을 생성하세요:

istioctl과 IstioOperator API를 사용해 cluster1에 Istio를 프라이머리로 설치하세요.

$ cat <<EOF > cluster1.yaml
apiVersion: insall.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: ambient
  components:
    pilot:
      k8s:
        env:
          - name: AMBIENT_ENABLE_MULTI_NETWORK
            value: "true"
          - name: AMBIENT_ENABLE_BAGGAGE
            value: "true"
  values:
    global:
      meshID: mesh1
      multiCluster:
        clusterName: cluster1
      network: network1
EOF

구성을 cluster1에 적용하세요:

$ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml

다음 Helm 명령으로 cluster1에 Istio를 프라이머리로 설치하세요:

cluster1에 base 차트를 설치하세요:

$ helm install istio-base istio/base -n istio-system --kube-context "${CTX_CLUSTER1}"

그다음, 다음 멀티클러스터 설정으로 cluster1에 istiod 차트를 설치하세요:

$ helm install istiod istio/istiod -n istio-system --kube-context "${CTX_CLUSTER1}" --set global.meshID=mesh1 --set global.multiCluster.clusterName=cluster1 --set global.network=network1 --set profile=ambient --set env.AMBIENT_ENABLE_MULTI_NETWORK="true" --set env.AMBIENT_ENABLE_BAGGAGE="true"

다음으로, 앰비언트 모드에서 CNI 노드 에이전트를 설치하세요:

$ helm install istio-cni istio/cni -n istio-system --kube-context "${CTX_CLUSTER1}" --set profile=ambient

마지막으로, ztunnel 데이터 플레인을 설치하세요:

$ helm install ztunnel istio/ztunnel -n istio-system --kube-context "${CTX_CLUSTER1}" --set multiCluster.clusterName=cluster1 --set global.network=network1

cluster1에 앰비언트 이스트-웨스트 게이트웨이 설치하기 (Install an ambient east-west gateway in cluster1)

앰비언트 이스트-웨스트 트래픽 전용 게이트웨이를 cluster1에 설치하세요. 쿠버네티스 환경에 따라 이 게이트웨이가 기본적으로 공개 인터넷에 배포될 수 있다는 점을 명심하세요. 운영 시스템은 외부 공격을 막기 위해 추가적인 접근 제한(예: 방화벽 규칙)이 필요할 수 있어요. 사용 가능한 옵션은 클라우드 공급자에게 확인하세요.

$ @samples/multicluster/gen-eastwest-gateway.sh@ \
    --network network1 \
    --ambient | \
    kubectl --context="${CTX_CLUSTER1}" apply -f -

다음 Gateway 정의를 사용해 cluster1에 이스트-웨스트 게이트웨이를 설치하세요:

$ cat <<EOF > cluster1-ewgateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
  name: istio-eastwestgateway
  namespace: istio-system
  labels:
    topology.istio.io/network: "network1"
spec:
  gatewayClassName: istio-east-west
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
    tls:
      mode: Terminate # represents double-HBONE
      options:
        gateway.istio.io/tls-terminate-mode: ISTIO_MUTUAL
EOF

구성을 cluster1에 적용하세요:

$ kubectl apply --context="${CTX_CLUSTER1}" -f cluster1-ewgateway.yaml

이스트-웨스트 게이트웨이에 외부 IP 주소가 할당될 때까지 기다리세요:

$ kubectl --context="${CTX_CLUSTER1}" get svc istio-eastwestgateway -n istio-system
NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
istio-eastwestgateway   LoadBalancer   10.80.6.124   34.75.71.237   ...       51s

cluster2의 기본 네트워크 설정하기 (Set the default network for cluster2)

istio-system 네임스페이스가 이미 생성되어 있다면, 그곳에 클러스터의 네트워크를 설정해야 해요:

$ kubectl --context="${CTX_CLUSTER2}" get namespace istio-system && \
  kubectl --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2

cluster2를 프라이머리로 구성하기 (Configure cluster2 as a primary)

cluster2용 istioctl 구성을 생성하세요:

istioctl과 IstioOperator API를 사용해 cluster2에 Istio를 프라이머리로 설치하세요.

$ cat <<EOF > cluster2.yaml
apiVersion: insall.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: ambient
  components:
    pilot:
      k8s:
        env:
          - name: AMBIENT_ENABLE_MULTI_NETWORK
            value: "true"
          - name: AMBIENT_ENABLE_BAGGAGE
            value: "true"
  values:
    global:
      meshID: mesh1
      multiCluster:
        clusterName: cluster2
      network: network2
EOF

구성을 cluster2에 적용하세요:

$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml

다음 Helm 명령으로 cluster2에 Istio를 프라이머리로 설치하세요:

cluster2에 base 차트를 설치하세요:

$ helm install istio-base istio/base -n istio-system --kube-context "${CTX_CLUSTER2}"

그다음, 다음 멀티클러스터 설정으로 cluster2에 istiod 차트를 설치하세요:

$ helm install istiod istio/istiod -n istio-system --kube-context "${CTX_CLUSTER2}" --set global.meshID=mesh1 --set global.multiCluster.clusterName=cluster2 --set global.network=network2 --set profile=ambient --set env.AMBIENT_ENABLE_MULTI_NETWORK="true" --set env.AMBIENT_ENABLE_BAGGAGE="true"

다음으로, 앰비언트 모드에서 CNI 노드 에이전트를 설치하세요:

$ helm install istio-cni istio/cni -n istio-system --kube-context "${CTX_CLUSTER2}" --set profile=ambient

마지막으로, ztunnel 데이터 플레인을 설치하세요:

$ helm install ztunnel istio/ztunnel -n istio-system --kube-context "${CTX_CLUSTER2}"  --set multiCluster.clusterName=cluster2 --set global.network=network2

cluster2에 앰비언트 이스트-웨스트 게이트웨이 설치하기 (Install an ambient east-west gateway in cluster2)

위에서 cluster1에 했던 것처럼, 이스트-웨스트 트래픽 전용 게이트웨이를 cluster2에도 설치하세요.

$ @samples/multicluster/gen-eastwest-gateway.sh@ \
    --network network2 \
    --ambient | \
    kubectl apply --context="${CTX_CLUSTER2}" -f -

다음 Gateway 정의를 사용해 cluster2에 이스트-웨스트 게이트웨이를 설치하세요:

$ cat <<EOF > cluster2-ewgateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
  name: istio-eastwestgateway
  namespace: istio-system
  labels:
    topology.istio.io/network: "network2"
spec:
  gatewayClassName: istio-east-west
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
    tls:
      mode: Terminate # represents double-HBONE
      options:
        gateway.istio.io/tls-terminate-mode: ISTIO_MUTUAL
EOF

구성을 cluster2에 적용하세요:

$ kubectl apply --context="${CTX_CLUSTER2}" -f cluster2-ewgateway.yaml

이스트-웨스트 게이트웨이에 외부 IP 주소가 할당될 때까지 기다리세요:

$ kubectl --context="${CTX_CLUSTER2}" get svc istio-eastwestgateway -n istio-system
NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
istio-eastwestgateway   LoadBalancer   10.0.12.121   34.122.91.98   ...       51s

엔드포인트 발견 활성화하기 (Enable Endpoint Discovery)

cluster1의 API 서버에 대한 접근을 제공하는 remote secret을 cluster2에 설치하세요:

$ istioctl create-remote-secret \
  --context="${CTX_CLUSTER1}" \
  --name=cluster1 | \
  kubectl apply -f - --context="${CTX_CLUSTER2}"

cluster2의 API 서버에 대한 접근을 제공하는 remote secret을 cluster1에 설치하세요:

$ istioctl create-remote-secret \
  --context="${CTX_CLUSTER2}" \
  --name=cluster2 | \
  kubectl apply -f - --context="${CTX_CLUSTER1}"

축하해요! 서로 다른 네트워크에 있는 여러 프라이머리 클러스터에 걸쳐 Istio 메시를 성공적으로 설치했어요!

다음 단계 (Next Steps)

이제 설치를 검증할 수 있어요.

정리 (Cleanup)

Istio를 설치한 메커니즘(istioctl 또는 Helm)과 동일한 방법으로 cluster1과 cluster2 양쪽에서 Istio를 제거하세요.

cluster1에서 Istio를 제거하세요:

$ istioctl uninstall --context="${CTX_CLUSTER1}" -y --purge
$ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"

cluster2에서 Istio를 제거하세요:

$ istioctl uninstall --context="${CTX_CLUSTER2}" -y --purge
$ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"

cluster1에서 Istio Helm 설치를 삭제하세요:

$ helm delete ztunnel -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istio-cni -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istiod -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istio-base -n istio-system --kube-context "${CTX_CLUSTER1}"

cluster1에서 istio-system 네임스페이스를 삭제하세요:

$ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"

cluster2에서 Istio Helm 설치를 삭제하세요:

$ helm delete ztunnel -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istio-cni -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istiod -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istio-base -n istio-system --kube-context "${CTX_CLUSTER2}"

cluster2에서 istio-system 네임스페이스를 삭제하세요:

$ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"

(선택사항) Istio가 설치한 CRD를 삭제하세요:

CRD를 삭제하면 클러스터에서 생성한 모든 Istio 리소스가 영구적으로 제거돼요. 클러스터에 설치된 Istio CRD를 삭제하려면:

$ kubectl get crd -oname --context "${CTX_CLUSTER1}" | grep --color=never 'istio.io' | xargs kubectl delete --context "${CTX_CLUSTER1}"
$ kubectl get crd -oname --context "${CTX_CLUSTER2}" | grep --color=never 'istio.io' | xargs kubectl delete --context "${CTX_CLUSTER2}"

그리고 마지막으로 Gateway API CRD를 정리하세요:

$ kubectl get crd -oname --context "${CTX_CLUSTER1}" | grep --color=never 'gateway.networking.k8s.io' | xargs kubectl delete --context "${CTX_CLUSTER1}"
$ kubectl get crd -oname --context "${CTX_CLUSTER2}" | grep --color=never 'gateway.networking.k8s.io' | xargs kubectl delete --context "${CTX_CLUSTER2}"

더 알아보기 (Learn more)