서로 다른 네트워크에 Multi-Primary 설치
서로 다른 네트워크에 Multi-Primary 설치
서로 다른 네트워크에 있는 두 primary 클러스터에 Istio 컨트롤 플레인을 설치하는 방법을 알려드려요.
출처: Istio 문서
본문
이 가이드를 따라 cluster1과 cluster2 양쪽 모두에 Istio 컨트롤 플레인을 설치해서 각각을 primary 클러스터로 만들어요. cluster1은 network1 네트워크에 있고, cluster2는 network2 네트워크에 있어요. 즉 클러스터 경계를 넘는 pod 간의 직접 연결이 없다는 뜻이에요.
진행하기 전에 시작하기 전에의 단계를 반드시 완료하세요.
이 구성에서는 cluster1과 cluster2 둘 다 각 클러스터의 API Server를 관찰해서 endpoint를 얻어요.
클러스터 경계를 넘는 서비스 워크로드는 east-west 트래픽용 전용 게이트웨이를 통해 간접적으로 통신해요. 각 클러스터의 게이트웨이는 다른 클러스터에서 도달 가능해야 해요.
cluster1의 기본 네트워크 설정
istio-system 네임스페이스가 이미 만들어졌다면 그곳에서 클러스터의 네트워크를 설정해야 해요:
$ kubectl --context="${CTX_CLUSTER1}" get namespace istio-system && \
kubectl --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1
cluster1을 primary로 설정
cluster1용 istioctl 설정을 만들어요:
istioctl과 IstioOperator API로 cluster1에 Istio를 primary로 설치해요.
$ cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster1
network: network1
EOF
설정을 cluster1에 적용해요:
$ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml
다음 Helm 명령으로 cluster1에 Istio를 primary로 설치해요:
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
cluster1에 east-west 게이트웨이 설치
east-west 트래픽 전용 게이트웨이를 cluster1에 설치해요. 기본적으로 이 게이트웨이는 인터넷에 공개돼요. 프로덕션 시스템은 외부 공격을 막기 위해 추가 접근 제한(예: 방화벽 규칙)이 필요할 수 있어요. 어떤 옵션이 있는지 클라우드 벤더에 확인하세요.
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network network1 | \
istioctl --context="${CTX_CLUSTER1}" install -y -f -
다음 Helm 명령으로 cluster1에 east-west 게이트웨이를 설치해요:
$ helm install istio-eastwestgateway istio/gateway -n istio-system --kube-context "${CTX_CLUSTER1}" --set name=istio-eastwestgateway --set networkGateway=network1
east-west 게이트웨이에 외부 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
cluster1에서 서비스 노출
클러스터들이 서로 다른 네트워크에 있으므로, 두 클러스터 모두의 east-west 게이트웨이에서 모든 서비스(*.local)를 노출해야 해요. 이 게이트웨이는 인터넷에 공개되지만, 그 뒤의 서비스는 같은 네트워크에 있을 때처럼 신뢰할 수 있는 mTLS 인증서와 워크로드 ID를 가진 서비스만 접근할 수 있어요.
$ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
@samples/multicluster/expose-services.yaml@
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를 primary로 설정
cluster2용 istioctl 설정을 만들어요:
istioctl과 IstioOperator API로 cluster2에 Istio를 primary로 설치해요.
$ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster2
network: network2
EOF
설정을 cluster2에 적용해요:
$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml
다음 Helm 명령으로 cluster2에 Istio를 primary로 설치해요:
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
cluster2에 east-west 게이트웨이 설치
위에서 cluster1에 했던 것처럼 east-west 트래픽 전용 게이트웨이를 cluster2에 설치해요.
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network network2 | \
istioctl --context="${CTX_CLUSTER2}" install -y -f -
다음 Helm 명령으로 cluster2에 east-west 게이트웨이를 설치해요:
$ helm install istio-eastwestgateway istio/gateway -n istio-system --kube-context "${CTX_CLUSTER2}" --set name=istio-eastwestgateway --set networkGateway=network2
east-west 게이트웨이에 외부 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
cluster2에서 서비스 노출
위에서 cluster1에 했던 것처럼 east-west 게이트웨이로 서비스를 노출해요.
$ kubectl --context="${CTX_CLUSTER2}" apply -n istio-system -f \
@samples/multicluster/expose-services.yaml@
Endpoint Discovery 활성화
cluster1의 API server에 대한 접근을 제공하는 remote secret을 cluster2에 설치해요.
$ istioctl create-remote-secret \
--context="${CTX_CLUSTER1}" \
--name=cluster1 | \
kubectl apply -f - --context="${CTX_CLUSTER2}"
cluster2의 API server에 대한 접근을 제공하는 remote secret을 cluster1에 설치해요.
$ istioctl create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
축하합니다! 서로 다른 네트워크에 있는 여러 primary 클러스터에 걸쳐 Istio 메시를 성공적으로 설치했어요!
다음 단계
이제 설치를 검증할 수 있어요.
정리
cluster1과 cluster2 양쪽 모두에서 Istio를 설치했을 때 사용한 것과 같은 방식(istioctl 또는 Helm)으로 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 istiod -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istio-eastwestgateway -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 istiod -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istio-eastwestgateway -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}"