사용자 정의 Istio 게이트웨이 배치
Istio 관리 앱 트래픽에 대한 Ingress 및 Egress 게이트웨이를 정의하는 IstioOperator
(IOP) 사용자 정의 리소스를 작성하십시오.
기본적으로 클러스터의 istio-ingressgateway
네임스페이스에는 하나의 istio-system
배치가 작성됩니다. 이 배치는 외부에서 액세스 가능한 IP 주소를 사용하여 공용 로드 밸런서 서비스로서 노출됩니다. 그 후에는 Gateway
리소스에 Istio 관리 앱의 포트를 정의할 수 있으며, 이는 이러한 포트로의 인바운드 HTTP/TCP 트래픽을 청취하는
istio-ingressgateway
로드 밸런서를 구성합니다. 또한, 기본적으로 하나의 istio-egressgateway
가 작성되어 Istio 관리 앱으로부터의 아웃바운드 트래픽을 관리하는 로드 밸런서 서비스로서 노출됩니다.
그러나 사용자가 이러한 기본 게이트웨이 외에 추가 Ingress 또는 Egress 게이트웨이 배치를 작성하려 할 수도 있습니다. 예를 들면 기본 게이트웨이와 함께 실행하기 위해, 또는 다음 이유로 기본 게이트웨이 대신 실행하기 위해 추가 게이트웨이를 작성하려 할 수 있습니다.
- 특정 워크로드 또는 네임스페이스 간에 트래픽 플로우를 분리
- 사설 네트워크 트래픽에 대한 Ingress 게이트웨이를 작성
- 게이트웨이 팟(Pod) 노드 친화성, 최소 복제본 수, 구역별 로드 밸런서와 같은 사용자 정의로 게이트웨이를 수정
- 관리 Istio 추가 기능의 모든 컴포넌트에 대해 롤아웃되는 자동 버전 업데이트와 별도로 게이트웨이 버전 업데이트를 제어
고려사항
시작하기 전에 사용자 정의 게이트웨이를 사용하는 데 대한 다음 고려사항을 검토하십시오.
- 관리 Istio 추가 기능은 사용자가 작성하는 사용자 정의 게이트웨이를 관리하거나 조정하지 않습니다. 이러한 리소스의 작성, 관리 및 유지보수는 사용자의 책임입니다.
- 사용자 정의 게이트웨이를 배치한 후
kubectl logs -n ibm-operators -l name=addon-istio-operator
를 실행하여 Istio 연산자 팟 (Pod) 로그에서 구문 오류를 확인하십시오. Istio 운영자는 사용자가 변경한 모든 사용자 정의 IOP(IstioOperator
)를 검증하고 조정합니다. 로그에서info installer Reconciling IstioOperator
반복으로 표시되는 조정 루프가 발견되면 단계에 따라 구성에서 루프 오류의 원인이 되는 행을 찾으십시오. - 또한,
istio-global-proxy-accessLogFile
configmapmanaged-istio-custom
의 옵션이"/dev/stdout"
으로 설정되어 있는지 확인하십시오. Envoy 프록시는 해당 표준 출력에 액세스 정보를 출력하며, 이는 Envoy 컨테이너에 대해kubectl logs
명령을 사용하여 볼 수 있습니다.
공용 트래픽에 대한 사용자 정의 Ingress 게이트웨이 작성
IstioOperator
(IOP)를 사용하여 custom-gateways
네임스페이스에서 사용자 정의 Ingress 게이트웨이 배치 및 공용 로드 밸런서 서비스를 작성하십시오.
-
Istio 추가 기능을 설치하십시오.
-
사용자 정의 Ingress 게이트웨이의 네임스페이스를 작성하십시오.
kubectl create namespace custom-gateways
-
이름이
custom-ingress-iop.yaml
인,IstioOperator
(IOP) 리소스에 대한 YAML 파일을 작성하십시오. 사용자 정의 게이트웨이 팟(Pod)이 관리 Istio의 특정 버전을 실행하도록 강제하려면tag
필드에 해당 버전을 지정하십시오. 자세한 정보는 사용자 정의 게이트웨이 업데이트 및 버전 제어를 참조하십시오.apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: ibm-operators name: custom-ingressgateway-iop spec: profile: empty hub: icr.io/ext/istio # tag: 1.23.5 components: ingressGateways: - name: custom-ingressgateway label: istio: custom-ingressgateway namespace: custom-gateways enabled: true k8s: serviceAnnotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
-
클러스터에서
IstioOperator
(IOP) 리소스를 작성하십시오.ibm-operators
네임스페이스에 있는 관리 Istio 오퍼레이터는 IOP 리소스를 사용하여custom-gateways
네임스페이스에 공용 로드 밸런서 서비스를 포함하는 수신 게이트웨이를 배치하고 노출합니다.kubectl apply -f ./custom-ingress-iop.yaml
-
custom-gateways
네임스페이스에서 Ingress 게이트웨이 배치 및 서비스가 작성되었는지 확인하십시오.kubectl get deploy,svc -n custom-gateways
출력 예
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/custom-ingressgateway 1/1 1 1 4m53s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/custom-ingressgateway LoadBalancer 172.21.98.120 52.117.68.222 15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP 4m53s
-
service/custom-ingressgateway
로드 밸런서에 대한 출력에서EXTERNAL-IP
열에 있는 IP 주소(클래식 클러스터) 또는 호스트 이름(VPC 클러스터)을 기록해 두십시오.
이제 이 Ingress 게이트웨이 로드 밸런서의 이름(custom-ingressgateway
)을 Istio 관리 앱의 포트를 정의하는 Gateway
리소스에 지정할 수 있습니다. 그 후에는 Gateway
의 이름을 서비스 메시에 있는 마이크로서비스에 대한 경로를 정의하는 VirtualService
리소스에 지정할 수 있습니다. Gateway
및 VirtualService
를 사용자 정의 게이트웨이 로드 밸런서와 함께 사용하는 데 대한 예를 보려면 BookInfo 샘플 앱을 살펴보십시오.
BookInfo 샘플 설정
Istio용 BookInfo 샘플 애플리케이션을 배포하여 사용자 지정 인그레스 게이트웨이 로드 밸런서에 대한 액세스를 테스트합니다.
bookinfo
네임스페이스를 생성하고, 자동 사이드카 주입 을 위해 네임스페이스에 라벨을 붙입니다.kubectl create namespace bookinfo kubectl label namespace bookinfo istio-injection=enabled
- BookInfo 샘플 앱을 배치하십시오.
<version>
을(를) 관리 대상 Istio 추가 기능이 실행하는 major.minor 버전으로 바꾸십시오. 이 버전은ibmcloud ks cluster addon ls -c <cluster_name_or_ID>
을(를) 실행하여 찾을 수 있습니다.kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml
- BookInfo 마이크로서비스와 해당 팟(Pod)이 배치되었는지 확인하십시오.
kubectl get svc -n bookinfo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 172.21.19.104 <none> 9080/TCP 2m kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 1d productpage ClusterIP 172.21.168.196 <none> 9080/TCP 2m ratings ClusterIP 172.21.11.131 <none> 9080/TCP 2m reviews ClusterIP 172.21.117.164 <none> 9080/TCP 2m
kubectl get pods -n bookinfo
NAME READY STATUS RESTARTS AGE details-v1-6865b9b99d-7v9h8 2/2 Running 0 2m productpage-v1-f8c8fb8-tbsz9 2/2 Running 0 2m ratings-v1-77f657f55d-png6j 2/2 Running 0 2m reviews-v1-6b7f6db5c5-fdmbq 2/2 Running 0 2m reviews-v2-7ff5966b99-zflkv 2/2 Running 0 2m reviews-v3-5df889bcff-nlmjp 2/2 Running 0 2m
bookinfo-custom-gateway.yaml
(이)라는 YAML 파일을 작성하여Gateway
및VirtualService
리소스를 정의하십시오.Gateway
리소스는 이전에 작성된 사용자 정의 Ingress 로드 밸런서의 이름에 대해custom-ingressgateway
를 지정하며,VirtualService
리소스는bookinfo-gateway
리소스의 이름에 대해Gateway
를 지정한다는 점을 참고하십시오.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - "*" gateways: - bookinfo-gateway http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080
- 클러스터에
Gateway
및VirtualService
리소스를 작성하십시오.kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
- 이전 절에서
service/custom-ingressgateway
로드 밸런서에 대해 찾은 IP 주소(클래식) 또는 호스트 이름(VPC)을 사용하여 브라우저에서 BookInfo 앱에 대한 제품 페이지를 여십시오.http://<IP_OR_HOSTNAME>/productpage
이제 사용자 정의 Ingress 게이트웨이 로드 밸런서가 Gateway
리소스에 있는 포트와 VirtualService
리소스에 있는 마이크로서비스 경로를 사용하여 트래픽을 BookInfo 앱으로 라우팅합니다. 이 다음에는 선택적으로 사용자 정의 게이트웨이 로드 밸런서에 대한 DNS 레코드를 작성할 수
있습니다.
TLS로 IBM 제공 하위 도메인을 사용하여 BookInfo 노출
IBM 제공 하위 도메인을 작성하여 DNS 레코드에 사용자 정의 게이트웨이 로드 밸런서의 IP 주소(클래식) 또는 호스트 이름(VPC)을 등록하십시오. 하위 도메인에 대해 생성되는 TLS 인증서는 BookInfo 앱으로의 HTTPS 연결을 가능하게 합니다.
-
DNS 하위 도메인을 작성하여 사용자 정의 게이트웨이 로드 밸런서의 IP 주소 또는 호스트 이름을 등록하십시오. TLS 시크릿에 대해
custom-gateway
네임스페이스를 지정하십시오.- 클래식 클러스터
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways
- VPC 클러스터
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways
- 클래식 클러스터
-
하위 도메인이 작성되었는지 확인하십시오.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
클래식 클러스터의 출력 예
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>
VPC 클러스터의 출력 예
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate>
-
하위 도메인에 대한 시크릿의 이름을 가져오십시오.
kubectl get secret -n custom-gateways
출력 예
mycluster-af23f234rwr3asdfasdf-002 kubernetes.io/tls 2 15m
-
이전 절에서 작성한
bookinfo-custom-gateway.yaml
에서 HTTPS 포트 443, 그리고 하위 도메인의 시크릿을 지정하는 TLS 섹션을 추가하여bookinfo-gateway
Gateway
리소스를 수정하십시오.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name hosts: - "*" --- ...
-
클러스터에 수정된
Gateway
리소스를 작성하십시오.kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
-
웹 브라우저에서 BookInfo 제품 페이지를 여십시오. 2단계에서 찾은 하위 도메인에 HTTPS를 사용해야 합니다.
https://<subdomain>/productpage
사설 네트워크 트래픽에 대한 사용자 정의 Ingress 게이트웨이 작성
사용자 정의 Ingress 게이트웨이 배치를 작성하고 사설 로드 밸런서 서비스로 이를 노출하려면 공용 트래픽에 대한 사용자 정의 Ingress 게이트웨이 작성의 단계를 따르십시오. 3단계에서 IOP를 작성할 때 service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private
대신 public
어노테이션을 지정하십시오.
다음 고려사항을 참조하십시오.
- 클래식 클러스터가 사설 VLAN에만 연결되어 있거나 VPC 클러스터에서 사설 클라우드 서비스 엔드포인트만 사용으로 설정되어 있는 경우에는 IOP를 적용할 때 기본적으로 사설 로드 밸런서가 작성됩니다.
- 클래식 클러스터의 경우에 한해
ibmcloud ks nlb-dns create classic
을(를) 사용하여 사용자 정의 게이트웨이 로드 밸런서의 IP 주소에 대한 DNS 레코드 및 IBM 제공 하위 도메인을 작성할 수 없습니다.
사용자 정의 게이트웨이 업데이트 및 버전 제어
사용자 정의 Ingress 게이트웨이의 관리 Istio 버전을 수동으로 업데이트하고 제어하십시오.
IBM Cloud는 IBM Cloud Kubernetes Service에서 지원하는 최신 버전의 Istio에 대한 패치 업데이트를 자동으로 롤아웃하여 모든 Istio 컴포넌트를 최신 상태로 유지합니다. 예를 들어, 패치 버전 1.23.5 이 출시되면 모든 인그레스 게이트웨이 포드가 이 최신 패치 버전으로 자동 업데이트됩니다. 앱에 대해 작동 중단 시간이 발생하는 것을 방지하기 위해, 버전 패치는 롤링 업데이트 전략을 사용하여 완료됩니다. 그러나 최신 패치 버전의 잠재적 회귀 가능성을 테스트하려는 등의 경우에는 사용자가 사용자 정의 게이트웨이 팟(Pod)의 자동 업데이트를 방지하려 할 수도 있습니다.
사용자 정의 Ingress 게이트웨이에 대한 업데이트를 관리하는 데는 다음 롤아웃 전략을 사용할 수 있습니다.
- 사용자 정의 Ingress 게이트웨이 IOP를 작성하십시오.
tag
필드에 제어 플레인 버전과 동일하거나 이전인 패치 버전을 지정하십시오. 제어 플레인 버전은istioctl version
을 실행하여 찾을 수 있습니다. - 관리 Istio 추가 기능에 대한 새 패치 버전이 릴리스되면 최신 패치 버전을 사용하도록 하나의 사용자 정의 게이트웨이에 대한 IOP YAML 파일을 편집하고 해당 IOP를 클러스터에 다시 적용하십시오.
- 해당 사용자 정의 게이트웨이의 팟(Pod)이 최신 패치로 업데이트되고 나면 사용자 정의 게이트웨이에 대한 변경사항을 테스트하십시오.
- 변경사항이 만족스러운 경우에는 최신 패치로 업데이트하도록 나머지 사용자 정의 게이트웨이의 구성을 수정하십시오.
tag를 Istio 추가 기능의 제어 플레인 버전보다 높은 버전으로 설정하지 마십시오.
버전이 릴리스되고 나면 가능한 한 빨리 사용자 정의 게이트웨이 팟(Pod)을 업데이트하십시오. 이전 버전을 실행하는 사용자 정의 게이트웨이는 보안 취약점에 노출될 수 있습니다.
추가 게이트웨이 사용자 정의
사용자 정의 Ingress 게이트웨이에는 게이트웨이 로드 밸런서를 특정 구역에 배치하거나, 게이트웨이 팟(Pod) 복제본의 최소 수를 지정하거나, 게이트웨이 팟(Pod)을 에지 노드에 스케줄링하거나, 단계적 종료를 위한 preStop
라이프사이클 훅을 추가하거나, 반친화성 및 작업자 노드 친화성을 지정하는 등을
비롯한 추가적인 사용자 정의를 구성할 수 있습니다.
다음 IOP YAML 파일에서 이러한 추가 사용자 정의의 예를 검토하십시오.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-ingressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.23.5 # Force the gateway to a specific managed Istio version
components:
ingressGateways:
- name: custom-ingressgateway
label:
istio: custom-ingressgateway
namespace: custom-gateways
enabled: true
k8s:
serviceAnnotations:
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
hpaSpec: # Specify the minimum number of pod replicas
minReplicas: 2
tolerations: # Schedule the custom gateway pods onto edge nodes
- key: dedicated
value: edge
env:
- name: TERMINATION_DRAIN_DURATION
value: 30s
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- istio-ingressgateway
topologyKey: kubernetes.io/hostname
weight: 100
nodeAffinity: # Example node affinities to control the zone or the edge
preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
nodeSelectorTerms:
- matchExpressions:
- key: ibm-cloud.kubernetes.io/zone
operator: In
values:
- "dal12" # Deploy the load balancer to a specific zone in your cluster
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: dedicated
operator: In
values:
- edge
weight: 100
사용자 정의 Egress 게이트웨이 작성
관리 Istio 추가 기능의 버전 1.8에서는 사용자 정의 Egress 게이트웨이를 작성할 수 있습니다. Egress 게이트웨이는 서비스 매시에 있는 모든 앱으로부터 외부 대상으로의 모든 아웃바운드 트래픽에 대한 종료점 역할을 수행합니다.
예를 들어, 사용자 정의 Egress 게이트웨이를 작성하기 위해 클러스터의 IOP에 다음 YAML 파일을 적용할 수 있습니다.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-egressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.23.5 # Force the Gateway to a specific version
components:
egressGateways:
- name: custom-egressgateway
label:
istio: custom-egressgateway
namespace: custom-gateways
enabled: true
사용자 지정 출구 게이트웨이 구성 및 사용에 대한 자세한 내용은 Istio 오픈 소스 문서를 참조하십시오.
기본 게이트웨이 사용 안함
사용자 정의 게이트웨이를 작성한 후 기본 istio-ingressgateway
또는 istio-egressgateway
배치가 필요하지 않은 경우, 선택적으로 사용 안함으로 설정할 수 있습니다.
앱이 클라이언트에 액세스할 수 있게 하려는 경우에는 하나 이상의 게이트웨이 로드 밸런서가 사용 가능하며 트래픽을 앱으로 라우팅하도록 구성된 상태를 유지하십시오. 모든 구역에서 기본 게이트웨이 로드 밸런서를 사용 안함으로 설정하면 앱이 더 이상 노출되지 않으며 외부에서 액세스할 수 없습니다.
-
managed-istio-custom
configmap 리소스를 편집하십시오.kubectl edit cm managed-istio-custom -n ibm-operators
-
istio-ingressgateway-public-1|2|3-enabled
필드를"false"
로 설정하여 기본 Ingress 게이트웨이를 사용 안함으로 설정하십시오.istio-ingressgateway-public-1-enabled: "false" istio-ingressgateway-public-2-enabled: "false" istio-ingressgateway-public-3-enabled: "false"
-
기본 Egress 게이트웨이를 사용 안함으로 설정하려면
istio-egressgateway-public-1-enabled: "false"
필드를 추가하십시오.istio-egressgateway-public-1-enabled: "false"
-
구성 파일을 저장하고 닫으십시오.
-
기본 게이트웨이 서비스가 제거되었는지 확인하십시오.
kubectl get svc -n istio-system