서비스 메시에서의 앱 관리 및 노출
Istio 추가 기능을 클러스터에 설치한 후에는 Envoy 프록시 사이드카 인젝션을 설정하고 하위 도메인으로 앱을 노출하여 Istio 서비스 메시에 앱을 배치할 수 있습니다.
BookInfo 샘플 앱 이해
Istio용 애플리케이션 샘플(BookInfo)에는 기본 데모 설정과 기본 대상 규칙이 포함되어 있어 Istio의 기능을 즉시 시험해 볼 수 있습니다.
Istio 버전 1.4 이상에서 BookInfo는 관리 추가 기능으로 제공되지 않으며 이는 별도로 설치해야 합니다. BookInfo를 설치하려면 BookInfo 샘플 앱 설정을 참조하십시오.
네 개의 BookInfo 마이크로서비스에는 다음이 포함됩니다.
productpage
는details
및reviews
마이크로서비스를 호출하여 페이지를 채웁니다.details
에는 Book 정보가 포함되어 있습니다.ratings
에는 Book 검토를 수반하는 Book 등급 정보가 포함되어 있습니다.reviews
에는 Book 검토가 포함되어 있으며ratings
마이크로서비스를 호출합니다.reviews
마이크로서비스에는 여러 가지 버전이 있습니다.v1
은ratings
마이크로서비스를 호출하지 않습니다.v2
는ratings
마이크로서비스를 호출하고 등급을 1-5개의 검은색 별로 표시합니다.v3
은ratings
마이크로서비스를 호출하고 등급을 1-5개의 빨간색 별로 표시합니다.
이러한 각 마이크로서비스에 대한 배치 YAML은 Envoy 사이드카 프록시가 배치되기 전에 마이크로서비스의 팟(Pod)에 컨테이너로 사전에 삽입되도록 수정되었습니다. 수동 사이드카 주입에 대한 자세한 내용은 Istio 문서를 참조하십시오. BookInfo 앱은 Istio 게이트웨이의 공인 IP 주소에도 이미 노출되어 있습니다. BookInfo 앱이 시작하는 데 도움을 줄 수는 있지만, 이 앱은 프로덕션용이 아닙니다.
BookInfo 샘플 앱 설정
- 클러스터에 BookInfo를 설치하십시오. BookInfo 앱의 구성 파일이 포함된 운영 체제의 최신 Istio 패키지를 다운로드하십시오.
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.23.5 sh -
- Istio 패키지 디렉토리로 이동하십시오.
cd istio-1.23.5
- 자동 사이드카 인젝션의
default
네임스페이스에 레이블을 지정하십시오.kubectl label namespace default istio-injection=enabled
- BookInfo 애플리케이션, 게이트웨이 및 대상 규칙을 배치하십시오.
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
- BookInfo 마이크로서비스와 해당 팟(Pod)이 배치되었는지 확인하십시오.
kubectl get svc kubectl get pods
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 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에 액세스
BookInfo를 노출하는 istio-ingressgateway
로드 밸런서에 대한 공용 주소를 가져오십시오.
클래식 클러스터에서 게이트웨이 URL 작성
- Istio ingress 호스트를 설정하십시오.
export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
- Istio ingress 포트를 설정하십시오.
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
- Istio ingress 호스트 및 포트를 사용하는
GATEWAY_URL
환경 변수를 작성하십시오.export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
GATEWAY_URL
변수의 curl을 수행하여 BookInfo 앱이 실행 중인지 확인하십시오.200
응답은 BookInfo 앱이 Istio에서 적절하게 실행 중임을 의미합니다.curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
- 페이지를 여러 번 새로 고쳐보십시오. 빨간색 별이 있거나, 검은색 별이 있거나, 별이 없는 등 다양한 버전의 검토 섹션이 표시됩니다.
VPC 클러스터에서 게이트웨이 URL 작성
- Istio Ingress 호스트 이름을 사용하는
GATEWAY_URL
환경 변수를 작성하십시오.export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
GATEWAY_URL
변수의 curl을 수행하여 BookInfo 앱이 실행 중인지 확인하십시오.200
응답은 BookInfo 앱이 Istio에서 적절하게 실행 중임을 의미합니다.curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
브라우저에서 BookInfo 웹 페이지 보기
운영을 기반으로 다음 명령을 실행하여 브라우저에서 BookInfo 앱을 보십시오.
Mac OS 또는 Linux
open http://$GATEWAY_URL/productpage
<
start http://$GATEWAY_URL/productpage
페이지를 여러 번 새로 고쳐보십시오. 빨간색 별이 있거나, 검은색 별이 있거나, 별이 없는 등 다양한 버전의 검토 섹션이 표시됩니다.
TLS 없이 IBM 제공 하위 도메인을 사용하여 BookInfo 노출
클러스터에 BookInfo 추가 기능을 사용으로 설정하면 Istio 게이트웨이 bookinfo-gateway
가 작성됩니다. 게이트웨이는 Istio 가상 서비스 및 대상 규칙을 사용하여 BookInfo 앱을 공용으로 노출하는 로드 밸런서 istio-ingressgateway
를 구성합니다. 다음 단계에서는 BookInfo에 공용으로 액세스할 때 사용할 수 있는 호스트 이름(VPC 클러스터)
또는 istio-ingressgateway
로드 밸런서 IP 주소(클래식 클러스터)에 대한 하위 도메인을 작성합니다.
- DNS 하위 도메인을 작성하여
istio-ingressgateway
로드 밸런서의 IP 주소(클래식 클러스터) 또는 호스트 이름(VPC 클러스터)을 등록하십시오.- 클래식:
ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --cluster <cluster_name_or_id>
- VPC:
ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --cluster <cluster_name_or_id>
- 클래식:
- 하위 도메인이 작성되었는지 확인하고 하위 도메인을 복사하십시오.
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>
웹 브라우저에서 BookInfo 제품 페이지를 여십시오. TLS가 구성되지 않았으므로 HTTP를 사용해야 합니다.
http://<subdomain>/productpage
페이지를 여러 번 새로 고쳐보십시오. http://<subdomain>/productpage
에 대한 요청은 Istio 게이트웨이 로드 밸런서를 통해 수신됩니다. Istio 게이트웨이가 마이크로서비스의 대상 라우팅 규칙 및 가상 서비스를 관리하므로 reviews
마이크로서비스의 다른 버전이 계속 무작위로 리턴됩니다.
TLS로 IBM 제공 하위 도메인을 사용하여 BookInfo 노출
클러스터에 BookInfo 추가 기능을 사용으로 설정하면 Istio 게이트웨이 bookinfo-gateway
가 작성됩니다. 게이트웨이는 Istio 가상 서비스 및 대상 규칙을 사용하여 BookInfo 앱을 공용으로 노출하는 로드 밸런서 istio-ingressgateway
를 구성합니다. 다음 단계에서는 BookInfo에 공용으로 액세스할 때 사용할 수 있는 호스트 이름(VPC 클러스터)
또는 istio-ingressgateway
로드 밸런서 IP 주소(클래식 클러스터)에 대한 하위 도메인을 작성합니다. SSL 인증서를 사용하여 BookInfo 앱에 대한 HTTPS 연결을 사용으로 설정하십시오.
-
DNS 하위 도메인을 작성하여
istio-ingressgateway
로드 밸런서의 IP 주소(클래식 클러스터) 또는 호스트 이름(VPC 클러스터)을 등록하십시오.- 클래식:
ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --secret-namespace istio-system --cluster <cluster_name_or_id>
- VPC:
ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --secret-namespace istio-system --cluster <cluster_name_or_id>
- 클래식:
-
하위 도메인이 작성되었는지 확인하고 SSL 인증서 시크릿 이름 필드에서 SSL 시크릿의 이름을 기록해 두십시오.
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>
TLS 종료를 사용하도록 bookinfo-gateway 구성
다음 단계를 완료하여 bookinfo-gateway
를 위한 TLS 종료를 설정하십시오.
- TLS 연결을 처리하도록 구성되지 않은 기존
bookinfo-gateway
를 삭제하십시오.kubectl delete gateway bookinfo-gateway
- TLS 종료를 사용하는 새
bookinfo-gateway
구성 파일을 작성하십시오.bookinfo-gateway.yaml
로 다음 YAML 파일을 저장하십시오.<secret_name>
을(를) 이전에 찾은 SSL 시크릿의 이름으로 바꾸십시오.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: <secret_name> hosts: - "*"
- 클러스터에 새
bookinfo-gateway
를 작성하십시오.kubectl apply -f bookinfo-gateway.yaml
- 웹 브라우저에서 BookInfo 제품 페이지를 여십시오. 2단계에서 찾은 하위 도메인에 HTTPS를 사용해야 합니다.
https://<subdomain>/productpage
- 페이지를 여러 번 새로 고쳐보십시오.
https://<subdomain>/productpage
에 대한 요청은 Istio 게이트웨이 로드 밸런서를 통해 수신됩니다. Istio 게이트웨이가 마이크로서비스의 대상 라우팅 규칙 및 가상 서비스를 관리하므로reviews
마이크로서비스의 다른 버전이 계속 무작위로 리턴됩니다.
작동 방법 이해
BookInfo 샘플은 Istio의 트래픽 관리 컴포넌트가 함께 작동하여 ingress 트래픽을 앱에 라우팅하는 방법을 보여줍니다.
Gateway
bookinfo-gateway
게이트웨이는 로드 밸런서(load balancer)를 설명합니다. 로드 밸런서는istio-system
네임스페이스에 있는istio-ingressgateway
서비스로, BookInfo 에 대한 인바운드 HTTP /TCP 트래픽의 진입점 역할을 합니다. Istio는 게이트웨이 구성 파일에 정의된 포트에서 Istio 관리 앱에 대한 수신 요청을 청취하도록 로드 밸런서를 구성합니다. BookInfo 게이트웨이의 구성 파일을 보려면 다음 명령을 실행하십시오.
kubectl get gateway bookinfo-gateway -o yaml
VirtualService
bookinfo
VirtualService 마이크로서비스를destinations
로 정의함으로써 서비스 메시 내에서 요청이 라우팅되는 방식을 제어하는 규칙을 정의합니다.bookinfo
가상 서비스인 요청의/productpage
URI는 포트productpage
에서9080
호스트로 라우팅됩니다. 이 방식으로 BookInfo 앱에 대한 모든 요청은 먼저productpage
마이크로서비스로 라우팅된 후 BookInfo의 다른 마이크로서비스를 호출합니다. 가상 서비스 규칙을 확인하려면 다음 명령을 실행하십시오.
kubectl get virtualservice bookinfo -o yaml
DestinationRule
- 게이트웨이가 가상 서비스 규칙에 따라 요청을 라우팅한 후,
details
,productpage
,ratings
,reviews
DestinationRules 마이크로서비스에 요청이 도달할 때 적용되는 정책을 정의합니다. 예를 들어, BookInfo 제품 페이지를 새로 고치면 표시되는 변경사항은productpage
마이크로서비스의 다른 버전,v1
,v2
및v3
을 무작위로 호출하는reviews
마이크로서비스의 결과입니다.reviews
대상 규칙은 마이크로서비스의subsets
또는 이름 지정된 버전에 동일한 가중치를 부여하므로 버전이 무작위로 선택됩니다. 이 서브세트는 트래픽이 서비스의 특정 버전으로 라우팅될 때 가상 서비스 규칙에서 사용합니다. BookInfo에 적용되는 대상 규칙을 확인하려면 다음 명령을 실행하십시오.
kubectl describe destinationrules
사이드카 인젝션을 설정하여 Istio 서비스 메시에 앱 포함
Istio를 사용하여 사용자 고유의 앱을 관리할 준비가 되셨습니까? 앱을 배치하기 전에 먼저 Envoy 프록시 사이드카를 앱 팟(Pod)에 삽입할 방법을 결정해야 합니다.
마이크로서비스가 서비스 메시에 있도록 각 앱 팟(Pod)이 Envoy 프록시 사이드카를 실행하고 있어야 합니다. 사이드카가 자동 또는 수동으로 각 앱 팟(Pod)에 삽입되도록 할 수 있습니다. 사이드카 주입에 대한 자세한 정보는 Istio 문서를 참고하세요.
자동 사이드카 인젝션 사용
자동 사이드카 인젝션이 사용 가능한 경우, 네임스페이스는 새 배치를 청취하고 앱 팟(Pod)이 Envoy 프록시 사이드카 컨테이너로 작성되도록 팟(Pod) 템플리트 스펙을 자동으로 수정합니다. 해당 네임스페이스에 Istio와 통합할 여러 앱을 배치할 계획이라면 네임스페이스에 대해 자동 사이드카 인젝션을 사용할 수 있습니다. Istio 관리 추가 기능에서는 기본적으로 모든 네임스페이스에 대해 자동 사이드카 삽입이 사용으로 설정되어 있지 않습니다.
kube-system
, ibm-system,
또는 ibm-operators
네임스페이스에 사이드카 인젝션을 사용하지 마십시오.
네임스페이스에 대해 자동 사이드카 인젝션을 사용하려면 다음을 수행하십시오.
-
Istio 관리 앱을 배치하려는 네임스페이스의 이름을 가져오십시오.
kubectl get namespaces
-
네임스페이스의 레이블을
istio-injection=enabled
로 지정하십시오.kubectl label namespace <namespace> istio-injection=enabled
-
레이블 지정된 네임스페이스에 앱을 배치하거나 이미 네임스페이스에 있는 앱을 다시 배치하십시오.
kubectl apply <myapp>.yaml --namespace <namespace>
-
선택사항 이 네임스페이스에 앱을 재배치하려면 삽입된 사이드카를 사용하여 재배치되도록 앱 팟(Pod)을 삭제하십시오.
kubectl delete pod -l app=<myapp>
-
앱을 노출하는 서비스를 작성하지 않은 경우 Kubernetes 서비스를 작성하십시오. Istio 서비스 메시의 마이크로서비스로 포함되려면 앱이 Kubernetes 서비스에 의해 노출되어야 합니다. 포드와 서비스에 대한 Istio 요구 사항을 준수해야 합니다.
-
앱에 대한 서비스를 정의하십시오.
apiVersion: v1 kind: Service metadata: name: myappservice spec: selector: <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs. ports: - protocol: TCP port: 8080 # The port that the service listens on
-
클러스터에 서비스를 작성하십시오. 서비스가 앱과 동일한 네임스페이스에 배치되었는지 확인하십시오.
kubectl apply -f myappservice.yaml -n <namespace>
앱 컨테이너와 함께 Istio 사이드카 컨테이너가 실행되고 있으므로 이제 앱 팟(Pod)이 Istio 서비스 메시에 통합되었습니다.
수동으로 사이드카 삽입
네임스페이스에 자동 사이드카 삽입을 사용하지 않으려는 경우 사이드카를 배치 YAML에 수동으로 삽입할 수 있습니다. 사이드카를 자동으로 삽입하지 않으려는 다른 배포와 함께 앱이 네임스페이스에서 실행 중인 경우 사이드카를 수동으로 삽입하십시오.
kube-system
, ibm-system,
또는 ibm-operators
네임스페이스에 사이드카 인젝션을 사용하지 마십시오.
istioctl
클라이언트를 다운로드하십시오.curl -L https://istio.io/downloadIstio | sh -
- Istio 패키지 디렉토리로 이동하십시오.
cd istio-1.23.5
배치를 수동으로 배치에 삽입하십시오.
-
Envoy 사이드카를 앱 배치 YAML에 삽입하십시오.
istioctl kube-inject -f <myapp>.yaml | kubectl apply -f -
-
앱을 배치합니다.
kubectl apply <myapp>.yaml
-
앱을 노출하는 서비스를 작성하지 않은 경우 Kubernetes 서비스를 작성하십시오. Istio 서비스 메시의 마이크로서비스로 포함되려면 앱이 Kubernetes 서비스에 의해 노출되어야 합니다. 포드와 서비스에 대한 Istio 요구 사항을 준수해야 합니다.
-
앱에 대한 서비스를 정의하십시오.
apiVersion: v1 kind: Service metadata: name: myappservice spec: selector: <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs. ports: - protocol: TCP port: 8080 # The port that the service listens on.
-
클러스터에 서비스를 작성하십시오. 서비스가 앱과 동일한 네임스페이스에 배치되었는지 확인하십시오.
kubectl apply -f myappservice.yaml -n <namespace>
앱 컨테이너와 함께 Istio 사이드카 컨테이너가 실행되고 있으므로 이제 앱 팟(Pod)이 Istio 서비스 메시에 통합되었습니다.
공용 Istio 로드 밸런서 사용 또는 사용 안함으로 설정
기본적으로 하나의 공용 Istio 로드 밸런서(istio-ingressgateway
)가 클러스터에서 사용으로 설정되어 인터넷에서 Istio 관리 앱으로 들어오는 요청을 로드 밸런싱합니다. 클러스터의 각 구역에서 Istio 로드 밸런서를 사용하여 고가용성을 달성할 수 있습니다.
-
managed-istio-custom
configmap 리소스를 편집하십시오.kubectl edit cm managed-istio-custom -n ibm-operators
-
모든 클러스터 영역이
istio-ingressgateway-zone
필드에 있는지 확인하십시오.댈러스의 클래식, 다중 구역 클러스터에 대한 예제:
istio-ingressgateway-zone-1: "dal10" istio-ingressgateway-zone-2: "dal12" istio-ingressgateway-zone-3: "dal13"
-
istio-ingressgateway-public-1|2|3-enabled
필드를"true"
또는"false"
로 설정하여 각 구역에서 Istio 로드 밸런서를 사용 또는 사용 안함으로 설정하십시오.클라이언트가 앱에 액세스할 수 있도록 하려면 하나 이상의 로드 밸런서를 사용으로 설정하거나 사용자 정의 게이트웨이 로드 밸런서를 작성하십시오. 모든 영역에서 모든 로드 밸런서를 사용하지 않도록 설정하면 앱이 더 이상 노출되지 않으며 외부에서 액세스할 수 없습니다.
각 구역에서 퍼블릭 게이트웨이를 사용으로 설정하는 예제:
istio-ingressgateway-public-1-enabled: "true" istio-ingressgateway-public-2-enabled: "true" istio-ingressgateway-public-3-enabled: "true"
-
구성 파일을 저장하고 닫으십시오.
-
새
istio-ingressgateway
로드 밸런서 서비스가 작성되었는지 확인하십시오.kubectl get svc -n istio-system
istio-ingressgateway
로드 밸런서 서비스를 사용하여 Istio 관리 앱을 노출하려면 istio: ingressgateway
리소스에 Gateway
선택기를 지정하십시오. 자세한 정보는 Istio 관리 앱 노출을 참조하십시오.
DNS를 사용하여 Istio Ingress 게이트웨이 노출
트래픽을 앱에 전달하기 위해 istio-ingressgateway
로드 밸런서에 대한 DNS 항목을 작성하고 로드 밸런서를 구성하여 공용으로 Istio 관리 앱을 노출합니다.
다음 단계에서 사용자가 다음 리소스를 작성하여 앱에 액세스할 수 있는 하위 도메인을 설정합니다.
my-gateway
(이)라는 게이트웨이입니다. 이 게이트웨이는 앱에 대한 공용 시작점 역할을 수행하고 기존istio-ingressgateway
로드 밸런서 서비스를 사용하여 앱을 노출합니다. 게이트웨이는 TLS 종료를 위해 선택적으로 구성될 수 있습니다.my-virtual-service
(이)라는 가상 서비스입니다.my-gateway
에서는my-virtual-service
에 정의한 규칙을 사용하여 트래픽을 앱으로 라우팅합니다.istio-ingressgateway
로드 밸런서에 대한 하위 도메인입니다. 하위 도메인에 대한 모든 사용자 요청은my-virtual-service
라우팅 규칙에 따라 앱에 전달됩니다.
TLS 종료 없이 DNS를 사용하여 Istio Ingress 게이트웨이 노출
- 클러스터에
istio
관리 추가 기능을 설치하십시오. istioctl
CLI를 설치하십시오.- 앱 마이크로서비스에 맞게 사이드카 인젝션을 설정하고, 앱 마이크로서비스를 네임스페이스에 배치하고, Istio 서비스 메시에 있도록 앱 마이크로서비스의 Kubernetes 서비스를 작성하십시오.
공용으로 앱을 노출할 경우:
-
공용
istio-ingressgateway
로드 밸런서 서비스를 사용하여 HTTP용 포트 80을 노출하는 게이트웨이를 작성하십시오.<namespace>
을(를) Istio 관리 마이크로서비스가 배치된 네임스페이스로 바꾸십시오. 게이트웨이 YAML 구성요소에 대한 자세한 정보는 Istio 참조 문서를 참고하세요.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-gateway spec: selector: app: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
-
Istio 관리 마이크로서비스가 배치된 네임스페이스에 게이트웨이를 적용하십시오.
kubectl apply -f my-gateway.yaml -n <namespace>
-
my-gateway
게이트웨이를 사용하는 가상 서비스를 작성하고 앱 마이크로서비스에 대한 라우팅 규칙을 정의하십시오. 마이크로서비스가80
이 아닌 다른 포트에서 청취하는 경우 해당 포트를 추가하십시오. 가상 서비스 YAML 구성요소에 대한 자세한 정보는 Istio 참조 문서를 참조하십시오.apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: my-virtual-service namespace: <namespace> # The namespace where your Istio-managed microservices are deployed. spec: gateways: - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer. hosts: - '*' http: - match: - uri: exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`. route: - destination: host: <service_name> # Replace `service_name` with the name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices. port: number: 80 # If your microservice listens on a different port, replace `80` with the port.
-
Istio 관리 마이크로서비스가 배치된 네임스페이스에 가상 서비스 규칙을 적용하십시오.
kubectl apply -f my-virtual-service.yaml -n <namespace>
-
** 공용 로드 밸런서의 **EXTERNAL-IP
istio-ingressgateway
주소(클래식 클러스터) 또는 호스트 이름(VPC 클러스터)를 가져오십시오. 클러스터의 각 구역에서 Istio 로드 밸런서를 사용으로 설정한 경우, 각 구역에서 로드 밸런서 서비스의 IP 주소 또는 호스트 이름을 가져오십시오.kubectl get svc -n istio-system
# Example output for classic clusters istio-ingressgateway LoadBalancer 172.21.XXX.XXX 169.1.1.1 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
# Example output for VPC clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 1234abcd-us-south.lb.appdomain.cloud 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
-
DNS 하위 도메인을 작성하여 로드 밸런서 IP 또는 호스트 이름을 등록하십시오. IBM Cloud Kubernetes Service에 DNS 하위 도메인을 등록하는 방법에 대한 자세한 내용은 클래식을 참조하세요: NLB 하위 도메인 등록하기 또는 VPC ALB 또는 VPC NLB 의 DNS 하위 도메인으로 VPC 부하 분산 장치 호스트 이름을 등록하는 방법에 대한 정보를 참조하세요.
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
VPC 클러스터에 대한 예제 명령.
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
-
하위 도메인이 작성되었는지 확인하십시오. 출력에서 SSL 인증서 시크릿 이름 필드에 SSL 시크릿의 이름을 복사하십시오.
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>
-
앱 마이크로서비스의 URL을 입력하여 트래픽이 Istio 관리 마이크로서비스로 라우트되는지 확인하십시오.
http://<host_name>/<service_path>
라우팅을 통한 보다 미세 조정된 제어를 찾고 계십니까? 로드 밸런서가 각 마이크로서비스로 트래픽을 라우팅한 후에 적용되는 규칙을 만들려면, 예를 들어 하나의 마이크로서비스의 다른 버전으로 트래픽을 보내는 규칙을 만들 수 있습니다 DestinationRules
.
수신 또는 송신 설정을 디버그해야 하십니까? istio-global-proxy-accessLogFile
configmapmanaged-istio-custom
의 옵션이 "/dev/stdout"
으로 설정되어 있는지 확인하십시오.
Envoy 프록시는 해당 표준 출력에 액세스 정보를 출력하며, 이는 Envoy 컨테이너에 대해 kubectl logs
명령을 사용하여 볼 수 있습니다. 게이트웨이에 대한 ibm-cloud-provider-ip
팟(Pod)이 pending
상태로 멈춰 있는 것을 발견하는 경우에는 이 문제 해결 주제를
참조하십시오.
TLS 종료와 함께 DNS를 사용하여 Istio Ingress 게이트웨이 노출
- 클러스터에
istio
관리 추가 기능을 설치하십시오. istioctl
CLI를 설치하십시오.- 앱 마이크로서비스에 맞게 사이드카 인젝션을 설정하고, 앱 마이크로서비스를 네임스페이스에 배치하고, Istio 서비스 메시에 있도록 앱 마이크로서비스의 Kubernetes 서비스를 작성하십시오.
공용으로 앱을 노출할 경우:
-
DNS 하위 도메인을 작성하여 로드 밸런서 IP 또는 호스트 이름을 등록하십시오. IBM Cloud Kubernetes Service에 DNS 하위 도메인 등록에 대한 자세한 정보는 Classic: Registering an NLB subdomain or DNS 하위 도메인으로 VPC 로드 밸런서 호스트 이름 등록을 참조하십시오.
- 클래식 클러스터:
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
- VPC 클러스터:
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
- 클래식 클러스터:
-
하위 도메인이 작성되었는지 확인하십시오. 출력에서 SSL 인증서 시크릿 이름 필드에 SSL 시크릿의 이름을 복사하십시오.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
# Example output for classic clusters: 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>
# Example output for VPC clusters: 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>
-
공용
istio-ingressgateway
로드 밸런서 서비스를 사용하여 HTTP용 포트 80을 노출하는 게이트웨이를 작성하십시오.<namespace>
을(를) Istio 관리 마이크로서비스가 배치된 네임스페이스로 바꾸십시오. 게이트웨이 YAML 구성요소에 대한 자세한 정보는 Istio 참조 문서를 참고하세요.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-gateway namespace: <namespace> spec: selector: istio: ingressgateway servers: - port: name: https protocol: HTTPS number: 443 tls: mode: SIMPLE serverCertificate: /etc/istio/ingressgateway-certs/tls.crt privateKey: /etc/istio/ingressgateway-certs/tls.key hosts: - "*"
-
Istio 관리 마이크로서비스가 배치된 네임스페이스에 게이트웨이를 적용하십시오.
kubectl apply -f my-gateway.yaml -n <namespace>
-
my-gateway
게이트웨이를 사용하는 가상 서비스를 작성하고 앱 마이크로서비스에 대한 라우팅 규칙을 정의하십시오. 가상 서비스 YAML 구성요소에 대한 자세한 정보는 Istio 참조 문서를 참조하십시오.apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: my-virtual-service namespace: <namespace> # The namespace where your Istio-managed microservices are deployed. spec: gateways: - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer. hosts: - '*' http: - match: - uri: exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`. route: - destination: host: <service_name> # The name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices. port: number: 443 # If your microservice listens on a different port, replace 443 with the port.
-
Istio 관리 마이크로서비스가 배치된 네임스페이스에 가상 서비스 규칙을 적용하십시오.
kubectl apply -f my-virtual-service.yaml -n <namespace>
-
** 공용 로드 밸런서의 **EXTERNAL-IP
istio-ingressgateway
주소(클래식 클러스터) 또는 호스트 이름(VPC 클러스터)를 가져오십시오. 클러스터의 각 구역에서 Istio 로드 밸런서를 사용으로 설정한 경우, 각 구역에서 로드 밸런서 서비스의 IP 주소 또는 호스트 이름을 가져오십시오.kubectl get svc -n istio-system
# Example output for classic clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 169.1.1.1 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
# Example output for VPC clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 1234abcd-us-south.lb.appdomain.cloud 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
-
앱 마이크로서비스의 URL을 입력하여 트래픽이 Istio 관리 마이크로서비스로 라우트되는지 확인하십시오.
https://<host_name>/<service_path>
NLB DNS 호스트 시크릿의 인증서는 90일마다 만료됩니다. 기본 네임스페이스의 시크릿은 만료되기 37일 전에 IBM Cloud Kubernetes Service에 의해 갱신되지만 시크릿이 갱신될 때마다 시크릿을 istio-system
네임스페이스에 수동으로 복사해야 합니다. 스크립트를 사용하여 이 프로세스를 자동화하십시오.
라우팅을 통한 보다 미세 조정된 제어를 찾고 계십니까? 로드 밸런서가 각 마이크로서비스로 트래픽을 라우팅한 후에 적용되는 규칙을 만들려면, 예를 들어 하나의 마이크로서비스의 다른 버전으로 트래픽을 보내는 규칙을 만들 수 있습니다 DestinationRules
.
수신 또는 송신 설정을 디버그해야 하십니까? istio-global-proxy-accessLogFile
configmapmanaged-istio-custom
의 옵션이 "/dev/stdout"
으로 설정되어 있는지 확인하십시오.
Envoy 프록시는 해당 표준 출력에 액세스 정보를 출력하며, 이는 Envoy 컨테이너에 대해 kubectl logs
명령을 사용하여 볼 수 있습니다. 게이트웨이에 대한 ibm-cloud-provider-ip
팟(Pod)이 pending
상태로 멈춰 있는 것을 발견하는 경우에는 이 문제 해결 주제를
참조하십시오.
mTLS를 사용하여 클러스터 내 트래픽 보호
클러스터 내에서 상호 TLS(mTLS)를 달성하기 위해 네임스페이스에서 워크로드에 대한 암호화를 사용으로 설정합니다. 클러스터의 팟(Pod) 간의 Envoy에 의해 라우팅되는 트래픽은 TLS로 암호화됩니다. mTLS에 대한 인증서 관리는 Istio에서 처리합니다. 더 자세한 정보는 Istio mTLS 문서를 참고하세요.
default.yaml
이라는 인증 정책 파일을 작성하십시오. 이 정책은 네임스페이스 범위이며 TLS를 사용하여 암호화된 요청만 허용하도록 서비스 메시의 워크로드를 구성합니다. 정책이 이 네임스페이스의 모든 서비스에 적용되므로targets
스펙이 포함되지 않습니다.apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" spec: mtls: mode: STRICT
- 인증 정책을 네임스페이스에 적용하십시오.
kubectl apply -f default.yaml -n <namespace>
destination-mtls.yaml
이라는 대상 규칙 파일을 작성하십시오. 이 정책은 TLS를 사용하여 트래픽을 전송하도록 네임스페이스에서 서비스 메시 워크로드를 구성합니다.host: *.local
와일드카드는 메시의 모든 서비스에 이 대상 규칙을 적용한다는 점에 유의하십시오.apiVersion: "networking.istio.io/v1beta1" kind: "DestinationRule" metadata: name: "destination-mtls" spec: host: "*.local" trafficPolicy: tls: mode: ISTIO_MUTUAL
- 대상 규칙을 적용하십시오.
kubectl apply -f destination-mtls.yaml -n <namespace>
- 다른 네임스페이스에서 서비스 메시 워크로드에 대한 mTLS를 달성하려는 경우 네임스페이스마다 이 단계를 반복하십시오.
대상 규칙은 다른 버전의 서비스로 트래픽 라우팅과 같은 비인증 이유로도 사용됩니다. 서비스에 대해 작성하는 모든 대상 규칙에는 mode: ISTIO_MUTUAL
로 설정된 동일한 TLS 블록도 포함되어야 합니다. 이 블록은 해당 규칙이 이 섹션에서 구성한 메시 전체 mTLS 설정을 대체하는 것을 방지합니다.