Istio API를 사용하여 게이트웨이 설치 및 업그레이드
Cloud Service Mesh는 서비스 메시의 일부로 게이트웨이를 배포 및 관리하는 옵션을 제공합니다. 게이트웨이는 메시의 에지에서 작동하고 들어오거나 나가는 HTTP/TCP 연결을 수신하는 부하 분산기를 설명합니다. 게이트웨이는 주로 인그레스 트래픽을 관리하는 데 사용되지만 다른 유형의 트래픽을 관리하도록 게이트웨이를 구성할 수도 있습니다.
이그레스 게이트웨이: 이그레스 게이트웨이를 사용하면 메시에서 나가는 트래픽의 전용 출구 노드를 구성하여 외부 네트워크에 액세스할 수 있거나 액세스해야 하는 서비스를 제한하거나 이그레스 트래픽을 안전하게 제어할 수 있습니다(예: 메시에 보안 추가).
인그레스 게이트웨이: 인그레스 게이트웨이를 사용하면 들어오는 HTTP/TCP 연결을 수신하는 전용 진입 노드를 구성할 수 있습니다.
East-west 게이트웨이: 서비스 워크로드가 다른 네트워크의 멀티 기본 메시의 클러스터 경계를 넘어 통신할 수 있게 하는 east-west 트래픽의 프록시입니다. 기본적으로 이 게이트웨이는 인터넷에 공개됩니다.
이 페이지에서는 게이트웨이 프록시를 배포하고 업그레이드하는 방법과 고유한 istio-ingressgateway
및 istio-egressgateway
게이트웨이 프록시를 구성하는 예시에 대한 권장사항을 설명합니다.
다른 방법으로 게이트웨이를 배포할 수 있고 같은 클러스터 내에서 토폴로지를 2개 이상 사용할 수 있습니다. 이러한 토폴로지에 대한 자세한 내용은 Istio 문서의 게이트웨이 배포 토폴로지를 참조하세요.
게이트웨이 배포 권장사항
게이트웨이 배포 권장사항은 관리형 데이터 영역 또는 비관리형 데이터 영역을 사용하는지에 따라 달라집니다.
관리형 데이터 영역 권장사항
- 관리형 데이터 영역을 사용 설정합니다.
- 네임스페이스에 관리형 버전 라벨을 추가합니다.
- 제어 영역과 게이트웨이를 개별적으로 배포하고 관리합니다.
- 보안 권장사항에 따라 제어 영역의 다른 네임스페이스에 게이트웨이를 배포하는 것이 좋습니다.
- 자동 사이드카 삽입(자동 삽입)을 사용하여 서비스에 대해 사이드카 프록시를 삽입하는 방법과 비슷한 게이트웨이에 대해 프록시 구성을 삽입합니다.
권장사항을 따라 다음을 수행할 수 있습니다.
- 최신 개선사항 및 보안 업데이트를 통해 자동으로 관리형 게이트웨이의 최신 상태를 유지합니다.
- 게이트웨이 인스턴스의 관리 및 유지보수를 Cloud Service Mesh 관리 데이터 영역으로 오프로드합니다.
비관리형 데이터 영역 권장사항
- 제어 영역과 게이트웨이를 개별적으로 배포하고 관리합니다.
- 보안 권장사항에 따라 제어 영역의 다른 네임스페이스에 게이트웨이를 배포하는 것이 좋습니다.
- 자동 사이드카 삽입(자동 삽입)을 사용하여 서비스에 대해 사이드카 프록시를 삽입하는 방법과 비슷한 게이트웨이에 대해 프록시 구성을 삽입합니다.
권장사항을 따라 다음을 수행할 수 있습니다.
- 네임스페이스 관리자가 권한을 전체 클러스터로 승격할 필요 없이 게이트웨이를 관리할 수 있도록 합니다.
- 관리자가 Kubernetes 애플리케이션 관리를 위해 사용하는 것과 동일한 배포 도구 또는 메커니즘을 사용해서 게이트웨이를 배포하고 관리할 수 있도록 합니다.
- 관리자에게 게이트웨이 배포를 완벽하게 제어하도록 권한을 부여하고 작업을 간소화할 수도 있습니다. 새 업그레이드를 사용할 수 있거나 구성이 변경되었으면 관리자가 게이트웨이 포드를 다시 시작하여 업데이트합니다. 그러면 게이트웨이 배포를 작동하는 환경이 서비스에 대해 사이드카 프록시를 작동하는 환경과 동일하게 됩니다.
샘플 게이트웨이 배포
기존 배포 도구를 사용하는 사용자를 지원하기 위해 Cloud Service Mesh에서는 게이트웨이를 Istio로 배포하는 것과 동일한 방법인 IstioOperator
, Helm, Kubernetes YAML을 지원합니다. 각 방법은 동일한 결과를 생성합니다. 사용자가 가장 익숙한 방법을 선택할 수 있지만 수정이 쉽고 소스 제어에 하이드레이션된 매니페스트를 저장할 수 있으므로 Kubernetes YAML 방법을 사용하는 것이 좋습니다.
다음 단계에서는 샘플 게이트웨이를 배포하는 방법을 보여줍니다.
아직 없으면 게이트웨이의 네임스페이스를 만듭니다.
GATEWAY_NAMESPACE
를 네임스페이스의 이름으로 바꿉니다.kubectl create namespace GATEWAY_NAMESPACE
네임스페이스의 삽입을 사용 설정합니다. 이 단계는 컨트롤 플레인 구현에 따라 다릅니다.
관리형(TD)
- 기본 삽입 라벨을 네임스페이스에 적용합니다.
kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev- istio-injection=enabled --overwrite
관리형(Istiod)
권장: 다음 명령어를 실행하여 네임스페이스에 기본 삽입 라벨을 적용합니다.
kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev- istio-injection=enabled --overwrite
관리형 Istiod 컨트롤 플레인이 있는 기존 사용자: 기본 삽입을 사용하는 것이 좋지만 버전 기반 삽입은 지원됩니다. 다음 안내를 따르세요.
다음 명령어를 실행하여 사용 가능한 출시 채널을 찾습니다.
kubectl -n istio-system get controlplanerevision
출력은 다음과 비슷합니다.
NAME AGE asm-managed-rapid 6d7h
참고: 위 목록에 두 개의 컨트롤 플레인 버전이 표시되면 하나를 삭제합니다. 클러스터에 여러 컨트롤 플레인 채널을 두는 방식은 지원되지 않습니다.
출력에서
NAME
열 아래의 값은 Cloud Service Mesh 버전에 사용 가능한 출시 채널에 해당하는 버전 라벨입니다.네임스페이스에 버전 라벨을 적용합니다.
kubectl label namespace GATEWAY_NAMESPACE \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
클러스터 내
권장: 다음 명령어를 실행하여 네임스페이스에 기본 삽입 라벨을 적용합니다.
kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev- istio-injection=enabled --overwrite
기본 삽입을 사용하는 것이 좋지만 버전 기반 삽입이 지원됩니다. 다음 안내를 따르세요.
다음 명령어를 사용하여
istiod
에서 버전 라벨을 찾습니다.kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
네임스페이스에 버전 라벨을 적용합니다. 다음 명령어에서
REVISION_LABEL
은 이전 단계에서 확인한istiod
버전 라벨의 값입니다.kubectl label namespace GATEWAY_NAMESPACE \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
anthos-service-mesh
저장소에서 샘플 게이트웨이의 구성 파일을 복사합니다.디렉터리를
samples
디렉터리로 변경합니다. 올바른 디렉터리에 있는지 확인하려면ls
명령어를 실행하여 디렉터리 콘텐츠를 나열한 후 다음 단계에서 액세스할gateways
디렉터리와online-boutique
디렉터리가 있는지 확인합니다.인그레스 또는 이그레스 게이트웨이를 배포합니다.
samples/gateways/
디렉터리에 있는 게이트웨이를 있는 그대로 배포하거나 필요에 따라 수정할 수 있습니다.인그레스
kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-ingressgateway
Egress
kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-egressgateway
배포를 만든 후에 새 서비스가 올바르게 작동하는지 확인합니다.
kubectl get pod,service -n GATEWAY_NAMESPACE
출력이 다음과 비슷하게 표시되는지 확인합니다.
NAME READY STATUS RESTARTS AGE pod/istio-ingressgateway-856b7c77-bdb77 1/1 Running 0 3s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/istio-ingressgateway LoadBalancer 10.24.5.129 34.82.157.6 80:31904/TCP 3s
다른 Kubernetes 애플리케이션처럼 게이트웨이 리소스를 관리합니다. anthos-service-mesh-packages
저장소의 샘플은 안내 및 빠른 시작용입니다. 필요에 따라 맞춤설정합니다.
게이트웨이 선택기
istio-ingressgateway
및 istio-egressgateway
프록시에 게이트웨이 구성을 적용하면 어떤 트래픽을 메시로 보내고 내보낼지 지정하여 메시의 인바운드 및 아웃바운드 트래픽을 관리할 수 있습니다. 게이트웨이 배포 포드의 라벨은 게이트웨이 구성 리소스에서 사용되므로 게이트웨이 선택기가 이러한 라벨과 일치하는 것이 중요합니다.
예를 들어 앞선 배포에서 istio=ingressgateway
라벨은 게이트웨이 포드에 설정됩니다. 이러한 배포에 게이트웨이 구성을 적용하려면 동일한 라벨을 선택해야 합니다.
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: gateway
spec:
selector:
istio: ingressgateway
...
게이트웨이 구성 및 가상 서비스 예시는 Online Boutique 샘플 애플리케이션에서 frontend.yaml을 참조하세요.
게이트웨이 업그레이드
인플레이스 업그레이드
대부분의 사용 사례에서는 인플레이스 업그레이드 패턴에 따라 게이트웨이를 업그레이드해야 합니다. 게이트웨이는 포드 삽입을 사용하므로, 생성된 새 게이트웨이 포드는 버전을 포함하는 최신 구성으로 자동 삽입됩니다.
게이트웨이에서 사용 중인 제어 영역 버전을 변경하려면 게이트웨이 배포에서 istio.io/rev
라벨을 설정합니다. 이렇게 하면 순차적 재시작도 트리거됩니다.
관리형 제어 영역
Google에서 관리형 제어 영역의 제어 영역 업그레이드를 관리하므로 게이트웨이 배포를 다시 시작하기만 하면 최신 구성과 버전의 새 포드가 자동으로 삽입됩니다.
kubectl rollout restart deployment istio-ingressgateway \
-n GATEWAY_NAMESPACE
클러스터 내 제어 영역
클러스터 내 제어 영역이 있을 때 게이트웨이에 동일한 패턴을 적용하려면 게이트웨이에서 사용 중인 제어 영역 버전을 변경해야 합니다.
게이트웨이 배포에서 순차적 재시작을 트리거하는 istio.io/rev
라벨을 설정합니다. 필요한 단계는 네임스페이스 또는 게이트웨이 포드의 버전 라벨을 업데이트해야 하는지 여부에 따라 다릅니다.
네임스페이스의 삽입 라벨을 지정한 경우 네임스페이스의
istio.io/rev
라벨을 새 버전 값으로 설정합니다.kubectl label namespace GATEWAY_NAMESPACE \ istio-injection- istio.io/rev=REVISION \ --overwrite
게이트웨이 포드에만 삽입을 사용 설정한 경우 배포의
istio.io/rev
라벨을 다음 Kubernetes YAML 파일과 같은 새 버전 값으로 설정합니다.cat <<EOF > gateway-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: istio-ingressgateway namespace: GATEWAY_NAMESPACE spec: selector: matchLabels: istio: ingressgateway template: metadata: annotations: # This is required to tell Cloud Service Mesh to inject the gateway with the # required configuration. inject.istio.io/templates: gateway labels: istio: ingressgateway istio.io/rev: REVISION spec: containers: - name: istio-proxy image: auto # The image will automatically update each time the pod starts. EOF kubectl apply -f gateway-deployment.yaml
카나리아 업그레이드(고급)
클러스터 내 제어 영역을 사용 중이고 새 제어 영역 버전의 출시를 더 느리게 제어하려면 카나리아 업그레이드 패턴을 따를 수 있습니다. 게이트웨이 배포의 여러 버전을 실행하고 트래픽 일부에서 모두 예상한 대로 작동하는지 확인할 수 있습니다. 예를 들어 새 버전을 카나리아로 출시하려면 istio.io/rev=REVISION
라벨을 새 버전 및 새 이름으로 설정하여 게이트웨이 배포 복사본을 만듭니다(예: istio-ingressgateway-canary
).
apiVersion: apps/v1
kind: Deployment
metadata:
name: istio-ingressgateway-canary
namespace: GATEWAY_NAMESPACE
spec:
selector:
matchLabels:
istio: ingressgateway
template:
metadata:
annotations:
inject.istio.io/templates: gateway
labels:
istio: ingressgateway
istio.io/rev: REVISION # Set to the control plane revision you want to deploy
spec:
containers:
- name: istio-proxy
image: auto
이 배포가 생성되면 두 가지 버전의 게이트웨이가 생기고, 두 버전은 모두 동일한 서비스에서 선택됩니다.
kubectl get endpoints -o
"custom-columns=NAME:.metadata.name,PODS:.subsets[*].addresses[*].targetRef.name"
NAME PODS
istio-ingressgateway istio-ingressgateway-788854c955-8gv96,istio-ingressgateway-canary-b78944cbd-mq2qf
애플리케이션이 예상한 대로 작동하면 다음 명령어를 사용해서 이전 istio.io/rev 라벨이 설정된 배포를 삭제하여 새 버전으로 전환합니다.
kubectl delete deploy/istio-ingressgateway -n GATEWAY_NAMESPACE
새 버전의 게이트웨이를 사용해서 애플리케이션을 테스트할 때 문제가 발생한 경우 다음 명령어를 사용해서 새 istio.io/rev 라벨이 설정된 배포를 삭제하여 이전 버전으로 다시 전환합니다.
kubectl delete deploy/istio-ingressgateway-canary -n GATEWAY_NAMESPACE
고급 구성
게이트웨이 최소 TLS 버전 구성
Cloud Service Mesh의 경우 게이트웨이 서버의 기본 최소 TLS 버전은 1.2입니다.
minProtocolVersion
필드를 사용하여 최소 TLS 버전을 구성할 수 있습니다.
자세한 내용은 ServerTLSSettings를 참조하세요.
지원되지 않는 기능
TRAFFIC_DIRECTOR
컨트롤 플레인 구현이 있으면 게이트웨이의 다음 필드나 값이 지원되지 않습니다.
AUTO_PASSTHROUGH
값이 있는 ServerTLSSettings.TLSmode- ServerTLSSettings.verifyCertificateSpki
- ServerTLSSettings.verifyCertificateHash
게이트웨이 문제 해결
auto
에서 게이트웨이 이미지 업데이트 실패
게이트웨이를 배포하거나 업그레이드하면 Cloud Service Mesh가 image
필드에 auto
를 자리표시자로 삽입합니다. 변형 웹훅 호출 후 Cloud Service Mesh가 이 자리표시자를 실제 Cloud Service Mesh 프록시 이미지로 자동으로 바꿉니다. 웹훅 변형 호출이 실패하면 auto
자리표시자가 유지되고 컨테이너는 없습니다. 일반적으로 잘못된 네임스페이스 라벨이 원인입니다. 올바른 네임스페이스를 구성했는지 확인한 후 게이트웨이를 다시 배포하거나 업그레이드합니다.