Kubernetes 1.22.5 환경에 Istio 1.14.1 설치하기

1. 서비스 메시와 Istio 개요

Istio는 서비스 메시 아키텍처를 기반으로 한 오픈플랫폼입니다. '서비스 메시 형태'는 Istio가 서비스 메시를 구현했음을 의미하며, 2017년 5월 첫 번째 버전 0.1이 출시된 이후로 널리 주목받으며 현재까지 가장 성공적인 서비스 메시 구현체로 인정받고 있습니다. '오픈플랫폼'은 이 프로젝트가 오픈 소스이며, Google, IBM, Lyft가 공동 창설했다는 점을 나타냅니다. '서비스'는 마이크로서비스나 개별 애플리케이션을 의미하며, Istio가 관리하는 대상입니다. '관리'는 Istio가 제공하는 기능으로, 트래픽 관리, 보안, 관측 가능성 등을 포함합니다.

  • 트래픽 관리: Istio는 간단한 규칙 설정과 트래픽 라우팅을 통해 서비스 간 호출과 API 호출을 제어합니다. 서킷 브레이커, 타임아웃, 재시도와 같은 구성을 단순화하며, A/B 테스트나 카나리아 배포 같은 작업을 쉽게 구성할 수 있습니다.
  • 보안: Istio는 서비스 간 통신의 인증 메커니즘, 채널 암호화, 접근 권한을 관리하여 통신의 안전성을 보장합니다. 이러한 모든 기능은 애플리케이션 코드를 변경하지 않고 사용할 수 있습니다.
  • 관측 가능성: Istio는 강력한 분산 추적, 모니터링, 로깅 기능을 제공하여 서비스의 상태를 이해하고 문제를 발견 및 해결하는 데 도움을 줍니다.

데이터 플레인과 컨트롤 플레인

데이터 플레인은 사이드카 방식으로 배포된 여러 Envoy 프록시로 구성됩니다. 모든 서비스로 들어오고 나가는 트래픽은 Envoy가 가로채며, 컨트롤 플레인과 상호 작용하여 설정에 따라 통신 기능을 수행합니다. Envoy의 강점은 풍부한 관리 기능과 유연한 설정 방식, 그리고 다양한 플러그인을 통한 확장성에 있습니다.

컨트롤 플레인에서 Istio는 Pilot, Citadel, Galley라는 세 가지 구성 요소를 하나의 프로세스와 여러 모듈로 통합한 istiod로 구성됩니다. Pilot은 서비스 디스커버리, 지능형 라우팅(예: 카나리아 배포), 타임아웃 및 재시도와 같은 탄력성 기능을 담당합니다. Citadel은 보안을 담당하여 키와 인증서를 관리합니다. Galley는 설정의 검증 및 처리를 담당합니다. istiod는 표준 컨트롤 플레인 사양을 구축하여 서비스 디스커버리, 규칙 설정, 인증서 관리와 같은 기능을 제공하며, 이 정보를 데이터 플레인에 전달합니다.

2. 실습 환경

  • Kubernetes 클러스터 v1.22.5
호스트IP
master192.168.10.100
node01192.168.10.101
node02192.168.10.102
  • istio v1.14.1
  • ingress-nginx v1.0.0
  • metallb

3. K8S 클러스터에 Istio 설치

설치 패키지 다운로드 및 환경 변수 설정

[root@master ~]# wget http://49.232.8.65/istio/istio-1.14.1-linux-amd64.tar.gz
......
[root@master ~]# mkdir /application
[root@master ~]# tar zxvf istio-1.14.1-linux-amd64.tar.gz -C /application/
......
[root@master ~]# ls /application/istio-1.14.1/
bin  LICENSE  manifests  manifest.yaml  README.md  samples  tools

[root@master ~]# ls /application/istio-1.14.1/bin/
istioctl

[root@master ~]# echo "export PATH=\$PATH:/application/istio-1.14.1/bin" >> /etc/profile
[root@master ~]# source /etc/profile

이미지 가져오기

[root@master ~]# docker pull docker.io/istio/pilot:1.14.1
[root@master ~]# docker pull docker.io/istio/proxyv2:1.14.1

istioctl을 사용한 설치

demo 프로파일은 테스트에 적합한 기본값을 제공합니다. 프로덕션 환경에는 다른 프로파일을 사용하세요.

[root@master ~]# istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete

[root@master ~]# kubectl get pods -n istio-system -o wide
NAME                                    READY   STATUS    RESTARTS   AGE
istio-egressgateway-575d8bd99b-sqdm9    1/1     Running   0          9m22s
istio-ingressgateway-6668f9548d-dh656   1/1     Running   0          9m22s
istiod-8495d444bb-zxfls                 1/1     Running   0          10m

네임스페이스 레이블 지정 (자동 주입 활성화)

[root@master ~]# kubectl label namespace default istio-injection=enabled
namespace/default labeled

# 자동 주입 비활성화
[root@master ~]# kubectl label namespaces default istio-injection-

참고: Istio-injection이 활성화된 네임스페이스에 배포된 파드가 iptables 관련 오류(예: xtables parameter problem: iptables-restore: unable to initialize table 'nat')로 시작되지 않을 경우, 각 노드에서 iptables 모듈을 로드해야 합니다.

[root@node01 ~]# modprobe ip_tables
[root@node01 ~]# modprobe iptable_filter

Istio 제거 방법은 공식 문서를 참고하세요.

4. 샘플 애플리케이션 배포 (Bookinfo)

Bookinfo 배포

[root@master ~]# kubectl apply -f /application/istio-1.14.1/samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

파드 상태 확인

[root@master ~]# kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-7d88846999-hrcgp       2/2     Running   0          16m
productpage-v1-7795568889-92mdm   2/2     Running   0          16m
ratings-v1-754f9c4975-ckf5z       2/2     Running   0          16m
reviews-v1-55b668fc65-lsfjs       2/2     Running   0          16m
reviews-v2-858f99c99-7nw82        2/2     Running   0          16m
reviews-v3-7886dd86b9-cnjdh       2/2     Running   0          16m

모든 파드의 READY2/2이고 STATUSRunning인지 확인하세요.

인클러스터 동작 검증

[root@master ~]# kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

5. 외부 트래픽에 애플리케이션 노출

Bookinfo를 외부에서 접근 가능하게 하려면 Istio Ingress Gateway를 생성해야 합니다. 게이트웨이는 서비스 메시의 가장자리에서 경로를 매핑하는 역할을 합니다.

게이트웨이 및 가상 서비스 적용

[root@master ~]# kubectl apply -f /application/istio-1.14.1/samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

구성 분석

[root@master ~]# istioctl analyze
✔ No validation issues found when analyzing namespace: default.

5.1 인그레스 IP 및 포트 확인

중요: Ingress Gateway 서비스의 EXTERNAL-IP가 <pending> 상태일 경우 Metallb 같은 외부 로드밸런서를 설치하거나 NodePort를 사용해야 합니다. 아래 예시는 Metallb 설치 후 EXTERNAL-IP를 할당받은 상태입니다.

[root@master ~]# kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)
istio-ingressgateway   LoadBalancer   10.98.234.126   192.168.10.170   15021:30921/TCP,80:32314/TCP,...

다음 환경 변수를 설정합니다.

[root@master ~]# export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
[root@master ~]# export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
[root@master ~]# export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
[root@master ~]# export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

[root@master ~]# echo "$GATEWAY_URL"
192.168.10.170:80

환경에 따라 EXTERNAL-IP가 호스트네임인 경우 다음 명령어를 사용하세요.

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

5.2 외부 접근 확인

[root@master ~]# echo "http://$GATEWAY_URL/productpage"
http://192.168.10.170:80/productpage

브라우저에서 해당 URL로 접속하여 Bookinfo 페이지가 표시되는지 확인합니다.

6. 대시보드 설치 (Kiali, Prometheus, Grafana, Jaeger)

Istio는 서비스 메시의 구조, 토폴로지, 상태를 분석할 수 있는 다양한 모니터링 도구와 통합됩니다.

애드온 배포

[root@master ~]# kubectl apply -f /application/istio-1.14.1/samples/addons
serviceaccount/grafana created
configmap/grafana created
service/grafana created
deployment.apps/grafana created
...
deployment.apps/kiali created
...

[root@master ~]# kubectl rollout status deployment/kiali -n istio-system
deployment "kiali" successfully rolled out

[root@master ~]# kubectl get pods,svc -n istio-system
NAME                                        READY   STATUS    RESTARTS   AGE
pod/grafana-6c5dc6df7c-zzb5q                1/1     Running   0          44s
pod/istio-ingressgateway-6668f9548d-dh656   1/1     Running   0          8h
pod/istiod-8495d444bb-zxfls                 1/1     Running   0          8h
pod/jaeger-9dd685668-mwmqm                  1/1     Running   0          44s
pod/kiali-5db6985fb5-chctb                  1/1     Running   0          43s
pod/prometheus-699b7cc575-4lxbs             2/2     Running   0          43s

NAME                           TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)
service/kiali                  ClusterIP      10.107.178.217   <none>           20001/TCP
service/grafana                ClusterIP      10.101.225.230   <none>           3000/TCP
...

Kiali 서비스 타입 변경 (LoadBalancer로)

Kiali 대시보드에 외부에서 접근하기 위해 서비스 타입을 LoadBalancer로 변경합니다. (Metallb가 설치된 환경 기준)

[root@master ~]# kubectl edit svc kiali -n istio-system
# spec.type 을 LoadBalancer로 수정

변경 후 EXTERNAL-IP를 확인합니다.

[root@master ~]# kubectl get svc kiali -n istio-system
NAME    TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)
kiali   LoadBalancer   10.99.87.90     192.168.10.171   20001:31148/TCP,9090:32497/TCP

대시보드 접속

  • Kiali: http://192.168.10.171:20001/kiali — 기본 계정: admin/admin
  • 로컬 포트 포워딩을 통한 접근: istioctl dashboard kiali

태그: Istio Service Mesh kubernetes Bookinfo Kiali

6월 1일 17:04에 게시됨