KANS(Kubernetes Advanced Networking Study) 3기 과정으로 학습한 내용을 정리 또는 실습한 정리한 게시글입니다. 7주차는 Istio-Mode (Sidecar)를 학습하였습니다. vagrant 이용 VMware Fusion에서 k3s 실습환경 구성하였고, Istio Blue/Green 버전업을 개인과제로 정리하였습니다.
서비스 메시는 애플리케이션의 서비스 간 모든 통신을 처리하는 소프트웨어 계층
입니다.
이 계층은 컨테이너화된 마이크로서비스로 구성됩니다.
애플리케이션이 확장되고 마이크로서비스의 수가 증가함에 따라 서비스의 성능을 모니터링하기가 점점 어려워지고 있습니다.
서비스 메시는 서비스간 연결을 관리하기 위해 모니터링, 로깅, 추적, 트래픽 제어와 같은 새로운 기능을 제공
합니다.
이러한 기능은 각 서비스의 코드와 독립적이므로 네트워크 경계를 넘어 여러 서비스 관리 시스템에서 작동할 수 있습니다.
Mesh란 그물, 망사라는 뜻을 가지고 있으며, Service Mesh는 Serivce들이 그물처럼 엮여있는 것을 뜻합니다.
MicroService Architecture를 적용한 시스템의 내부 통신이 그물(Mesh) 네트워크의 형태를 띄는 것에 빗대어 Service Mesh로 명명됩니다.
애플리케이션 계층이 아닌 인프라 플랫폼 계층에 특정 모듈을 삽입하여 애플리케이션에 대한 라우팅, 보안 및 안정성 기능을 추가하는 도구입니다.
서비스 메시는 쿠버네티스와 같은 컨테이너 오케스트레이션 환경에서 일반적으로 애플리케이션 코드(사이드 카 라고 불리는 패턴)와 함께 배치된 확장 가능한 네트워크 프록시 모듈로 구현됩니다.
그림을보면 MicroService와 SideCar로 구성되어 있고, SideCar를 통해 그물처럼 통신합니다.
Service Mesh의 구현체로는 istio, linkerd, conduit, App Mesh 등이 있습니다.
Kubernetes 기반의 서비스를 구성하거나 오픈소스를 적용하다보면 대게 istio로 구성되는 경우가 많습니다.
애플리케이션 컨테이너와 독립적으로 동작하는 별도의 컨테이너를 붙이는 패턴입니다.
오토바이에 연결된 사이트와 유사하기 때문에 사이드 카 패턴이라고 불립니다.
애플리케이션 컨테이너와 독립적으로 동작하기 때문에 사이드카 장애 시 애플리케이션이 영향을 받지 않고,
사이드카 적용/변경/제거 등의 경우에 애플리케이션은 수정이 필요가 없습니다.
현대적 애플리케이션 아키텍처에서는 독립적으로 배포 가능한 소규모 마이크로서비스 모음으로 애플리케이션을 구축할 수 있습니다. 팀별로 개별 마이크로서비스를 구축하고 코딩 언어 및 도구를 선택할 수 있습니다. 하지만 애플리케이션 코드가 제대로 작동하려면 마이크로서비스가 통신해야 합니다.
애플리케이션 성능은 서비스 간 통신의 속도와 탄력성에 따라 좌우됩니다. 개발자는 서비스 전반에서 애플리케이션을 모니터링하고 최적화해야 하지만, 시스템의 분산된 특성 때문에 가시성을 확보하기가 어렵습니다. 애플리케이션이 확장됨에 따라 통신을 관리하기가 훨씬 더 복잡해집니다.
서비스 메시 없이 동작하는 마이크로 서비스는 서비스 간 커뮤니케이션을 통제하는 로직으로 코딩해야 하기 때문에 개발자들이 비즈니스 로직에 집중하지 못하게 됩니다.
서비스 간 커뮤니케이션을 통제하는 로직이 각 서비스 내부에 숨겨져 있기 때문에 커뮤니케이션 장애를 진단하기 더 어려워집니다.
수십 개의 Microservice가 분리되어 있고 서비스 간의 통신도 매우 복잡하여 새로운 장애 지점이 계속 나타나게 된다면 서비스 메시 없이는 문제가 발생한 지점을 찾아내기가 어려울 것입니다.
그러면 서비스 메시로 얻는 이점은?
서비스 메시가 서비스 간 커뮤니케이션의 모든 부분을 성능 메트릭으로 캡처할 수 있습니다.
그런데 API를 포함하여 애플리케이션의 효율을 극대화함에 있어 API Gateway라는 관리 솔루션이 존재합니다.
기본적으로 API 게이트웨이는 외부에서 들어오는 트래픽에 대한 제어를 담당합니다.
반면에 서비스 메시는 서비스 내부의 통신에 대한 제어를 담당합니다.
API Gateway와 서비스 메시는 하고자 하는 일은 명확하게 다릅니다.
Ingress란?
API Gateway는 일반적으로 Gateway proxy pattern을 사용합니다.
Service Mesh는 일반적으로 Sidecar proxy pattern을 사용합니다.
API게이트웨이와 서비스 메시를 함께 사용하면 서비스 메시 아키텍처의 중재자 역할을 할 수 있습니다.
따라서 보안과 속도가 좋아집니다.
주요 항목 | 서비스 메시 | API Gateway |
---|---|---|
목적 | 내부 엔터프라이즈 시스템 및 마이크로 서비스 내의 이식성을 개선하도록 설계 | 내부/외부 및 심지어 데이터베이스 엑세스 위한 API 호출까지도 라우팅 할 수 있도록 설계 |
동작방법 | 내부 엔터프라이즈 서비스 범위 내에서 운영 | 회사 외부에 있는 애플리케이션에서의 연계를 위한 라우팅을 지원 |
API 역할 | API는 규모에 맞는 서비스 메시를 보호하는 데 사용 | API 게이트웨이는 API를 관리하고 보호하는 데 사용 |
디지털 트랜스포메이션 | 마이크로 서비스를 관리하여 제공 시간을 단축하지만 보안 문제가 발생할 수 있음 | 특히 서비스 메시와 함께 사용할 경우 출시 시간을 단축하고 보안을 보장 |
복잡성 | 엔드포인트가 비즈니스에 따라 확장됨에 따라 복잡성 가중 | 엔드포인트를 쉽게 관리하고 API를 확장하여 서비스 메시를 관리 |
기술 성숙도 | 신기술 | 성숙한 기술 |
보안 | 수동 프로세스에 의한 보안 정책 적용 | 자동화된 보안 정책 및 기능 |
위의 표를 보면 서비스 메시의 단점들을 API Gateway가 보완해주는 것 같습니다.
그리고 API Gateway 입장에서는 서비스 메시는 디테일을 관리하는 것 같습니다.
API Gateway와 서비스 메시는 기능면에서 유사한 부분들이 존재합니다.
하지만 이들의 역할을 상당히 다르고 상호보완적인 부분들이 있습니다.
최근 MSA에서 API Gateway는 노출되는 부분(External)에 위치하여 내부 서비스를 보호 및 제어하는 역할을 하고,
Service Mesh는 내부 서비스(Internal)에 위치하여 서비스를 관리하는 구조로 많이 사용되고 있습니다.
마이크로서비스 » https://aws.amazon.com/microservices/
더 많은 워크로드와 서비스가 배포됨에 따라 개발자들은 모든 요소가 연동하여 작동하는 방식을 이해하는 데 어려움을 겪습니다.
예를 들어 서비스 팀은 다운스트림 및 업스트림 종속성에 대해서 알고 싶어합니다.
애플리케이션 계층에서 서비스와 워크로드가 통신하는 방식에 대한 가시성을 높이길 원합니다.
관리자는 어떤 서비스가 서로 통신하고 어떤 작업을 수행하는지를 제어하고자 합니다.
관리자는 마이크로서비스 아키텍처 내에서 서비스의 동작, 정책 및 상호 작용에 대한 세밀한 제어 및 거버넌스 기능을 원합니다.
보안 정책 적용은 규제를 준수하는 데 필수적입니다.
서비스 메시는 분산 애플리케이션 내에서 복잡한 서비스 간 통신을 처리하는 중앙 집중식 전용 인프라 계층을 제공합니다.
서비스 메시는 요청 라우팅 및 트래픽 동작을 세밀하게 제어할 수 있는 고급 트래픽 관리 기능을 제공합니다. 여기 몇 가지 예가 있습니다.
대부분의 사용자가 기존의 안정적인 버전을 계속 사용하면서 일부 사용자 또는 트래픽을 새 서비스 버전에 전달할 수 있습니다.
노출이 제한되므로 실제 환경에서 새 버전의 동작과 성능을 실험해 볼 수 있습니다.
서비스 메시는 개별 서비스에서 서비스 간 통신을 제어하는 로직을 없애고 통신을 자체 인프라 계층으로 추상화합니다. 여러 네트워크 프록시를 사용하여 서비스 간 통신을 라우팅하고 추적합니다.
프록시는 조직의 네트워크와 마이크로서비스 간의 중간 게이트웨이 역할을 합니다. 서비스로 들어오고 나가는 모든 트래픽은 프록시 서버를 통해 라우팅됩니다.
개별 프록시는 개별적으로 실행되지만 논리적으로 각 서비스의 옆에 있기 때문에 사이드카라고도 합니다. 이들 프록시가 함께 서비스 메시 계층을 구성합니다.
다음 그림은 서비스 메시 도구로 많이 알려진 이스티오 아키텍처입니다.
이미지 출처: https://istio.io
서비스 메시 아키텍처에는 컨트롤 플레인과 데이터 영역이라는 두 가지 주요 구성 요소가 있습니다.
다음은 Istio, Linkerd 및 Consul과 같은 오픈 소스 플랫폼과 관련한 몇 가지 일반적인 서비스 메시 문제입니다.
가시다님이 제공한 AWS CloudFormation 배포 소스(kans-7w.yaml)를 MacBook M시리즈에서도 실행할 수 있도록
커스터마이징 하였습니다. 세부적인 방법은 KANS3 - 6주차 Ingress & Gateway API + CoreDNS 1. mac에 k3s 실습환경 구성 참조바랍니다.
# 소스 Download
❯ git clone https://github.com/icebreaker70/kans-k3s-istio
❯ cd kans-k3s-istio
# VM 생성
❯ vagrant up --provision
# VM 상태 확인
❯ vagrant status
Current machine states:
k3s-s running (vmware_desktop)
k3s-w1 running (vmware_desktop)
k3s-w2 running (vmware_desktop)
testpc running (vmware_desktop)
# VM 접속
❯ vagrant ssh k3s-s
❯ vagrant ssh k3s-w1
❯ vagrant ssh k3s-w2
❯ vagrant ssh testpc
# K3s Cluster 확인
❯ vagrant ssh k3s-s
$ kc cluster-info # kc는 kubectl 실행 내용을 Color로 보여주는 Tool의 Alias
$ kc get nodes -o wide
$ kc get pods -A
# VM 일시멈춤
❯ vagrant suspend
# VM 멈춤재개
❯ vagrant resume
# VM 삭제
❯ vagrant destory -f
k3s-s에 있는 kube-config 파일 Local에 복사
# cat <<EOT>> /etc/hosts
#K3S
192.168.10.10 k3s-s
192.168.10.101 k3s-w1
192.168.10.102 k3s-w2
192.168.20.200 testpc
#End of K8S
EOT
❯ vagrant scp k3s-s:/etc/rancher/k3s/k3s.yaml ~/.kube/config
Warning: Permanently added '[127.0.0.1]:50010' (ED25519) to the list of known hosts.
k3s.yaml 100% 2965 3.6MB/s 00:00
❯ kc get node
NAME STATUS ROLES AGE VERSION
k3s-s Ready control-plane,master 35m v1.30.5+k3s1
k3s-w1 Ready <none> 18m v1.30.5+k3s1
k3s-w2 Ready <none> 27m v1.30.5+k3s1
Istio Operator 설치 (v1.20.1)
❯ export ISTIOV=1.20.1
❯ curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV sh -
Downloading istio-1.20.1 from https://github.com/istio/istio/releases/download/1.20.1/istio-1.20.1-osx-arm64.tar.gz ...
Istio 1.20.1 Download Complete!
Istio has been successfully downloaded into the istio-1.20.1 folder on your system.
Next Steps:
See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster.
To configure the istioctl client tool for your workstation,
add the ~/istio-1.20.1/bin directory to your environment path variable with:
export PATH="$PATH:/Users/sjkim/istio-1.20.1/bin"
Begin the Istio pre-installation check by running:
istioctl x precheck
Need more information? Visit https://istio.io/latest/docs/setup/install/
❯ ~/istio-1.20.1/bin/istioctl version
no ready Istio pods in "istio-system"
1.20.1
# Istio Operator 설치
❯ ~/istio-1.20.1/bin/istioctl operator init --revision 1-20-1
Operator controller is already installed in istio-operator namespace.
Upgrading operator controller in namespace: istio-operator using image: docker.io/istio/operator:1.20.1
Operator controller will watch namespaces: istio-system
✔ Istio operator installed
✔ Installation complete
❯ kc get ns
NAME STATUS AGE
default Active 103m
istio-operator Active 9m18s
istio-system Active 9m18s
kube-node-lease Active 103m
kube-public Active 103m
kube-system Active 103m
❯ kubectl get pod -n istio-operator
NAME READY STATUS RESTARTS AGE
istio-operator-1-20-1-7d8568f545-rsn79 1/1 Running 0 9m59s
istiod, ingressGateway Control Plane 설치
# Manifest
❯ cat istio-operator-1-20-1.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: istiocontrolplane-1-20-1
namespace: istio-system
spec:
revision: 1-20-1
profile: default
components:
base:
enabled: true
pilot:
enabled: true
k8s:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
egressGateways:
- name: istio-egressgateway
enabled: false
ingressGateways:
- name: istio-ingressgateway
enabled: true
label:
istio: ingressgateway
k8s:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
hpaSpec:
minReplicas: 1
service:
externalTrafficPolicy: Cluster
type: NodePort
# Manifest 적용
❯ ~/istio-1.20.1/bin/istioctl install -f istio-operator-1-20-1.yaml
WARNING: Istio 1.20.0 may be out of support (EOL) already: see https://istio.io/latest/docs/releases/supported-releases/ for supported releases
This will install the Istio 1.20.1 "default" profile (with components: Istio core, Istiod, and Ingress gateways) into the cluster. Proceed? (y/N) y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete
❯ istioctl version
client version: 1.20.1
control plane version: 1.20.1
data plane version: 1.20.1 (1 proxies)
❯ kc get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.10.200.1 <none> 443/TCP 34m
istio-operator istio-operator-1-20-1 ClusterIP 10.10.200.98 <none> 8383/TCP 26m
istio-system istio-ingressgateway NodePort 10.10.200.24 <none> 15021:30291/TCP,80:31298/TCP,443:31894/TCP 4m38s
istio-system istiod-1-20-1 ClusterIP 10.10.200.253 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 23m
kube-system kube-dns ClusterIP 10.10.200.10 <none> 53/UDP,53/TCP,9153/TCP 34m
kube-system metrics-server ClusterIP 10.10.200.65 <none> 443/TCP 34m
Default Namespace에 istio-injection 대신에 istio.io/rev=1-20-1 Label 부여합니다.
❯ kubectl label namespace default istio-injection- istio.io/rev=1-20-1
label "istio-injection" not found.
namespace/default labeled
❯ kubectl describe ns default
Name: default
Labels: istio.io/rev=1-20-1
kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
Istio 설치 시 내장된 Sample Package 이용하여 배포
# 모니터링
watch -d 'kubectl get pod -owide;echo;kubectl get svc'
# Bookinfo 애플리케이션 배포
❯ echo $ISTIOV
1.20.1
❯ cat ~/istio-$ISTIOV/samples/bookinfo/platform/kube/bookinfo.yaml
1.20.1
# Copyright Istio Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##################################################################################################
# This file defines the services, service accounts, and deployments for the Bookinfo sample.
#
# To apply all 4 Bookinfo services, their corresponding service accounts, and deployments:
#
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
#
# Alternatively, you can deploy any resource separately:
#
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l service=reviews # reviews Service
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l account=reviews # reviews ServiceAccount
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l app=reviews,version=v3 # reviews-v3 Deployment
##################################################################################################
##################################################################################################
# Details service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: details
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-details
labels:
account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
labels:
app: details
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: details
version: v1
template:
metadata:
labels:
app: details
version: v1
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: docker.io/istio/examples-bookinfo-details-v1:1.18.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: ratings
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-ratings
labels:
account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ratings-v1
labels:
app: ratings
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: ratings
version: v1
template:
metadata:
labels:
app: ratings
version: v1
spec:
serviceAccountName: bookinfo-ratings
containers:
- name: ratings
image: docker.io/istio/examples-bookinfo-ratings-v1:1.18.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: reviews
labels:
app: reviews
service: reviews
spec:
ports:
- port: 9080
name: http
selector:
app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-reviews
labels:
account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v1
labels:
app: reviews
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v1
template:
metadata:
labels:
app: reviews
version: v1
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v1:1.18.0
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v2
labels:
app: reviews
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v2
template:
metadata:
labels:
app: reviews
version: v2
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v2:1.18.0
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v3
labels:
app: reviews
version: v3
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v3
template:
metadata:
labels:
app: reviews
version: v3
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v3:1.18.0
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-productpage
labels:
account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9080"
prometheus.io/path: "/metrics"
labels:
app: productpage
version: v1
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: docker.io/istio/examples-bookinfo-productpage-v1:1.18.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
---
❯ kubectl apply -f ~/istio-$ISTIOV/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
# 확인
❯ kubectl get all,sa
NAME READY STATUS RESTARTS AGE
pod/details-v1-cdd874bc9-ww2wv 2/2 Running 0 7m38s
pod/productpage-v1-5bb9985d4d-9xbjg 2/2 Running 0 7m37s
pod/ratings-v1-6484d64bbc-c5ppz 2/2 Running 0 7m38s
pod/reviews-v1-598f9b58fc-x5p4l 2/2 Running 0 7m38s
pod/reviews-v2-5979c6fc9c-qlbs8 2/2 Running 0 7m38s
pod/reviews-v3-7bbb5b9cf7-z92mp 2/2 Running 0 7m38s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/details ClusterIP 10.10.200.49 <none> 9080/TCP 7m38s
service/kubernetes ClusterIP 10.10.200.1 <none> 443/TCP 4h19m
service/productpage ClusterIP 10.10.200.254 <none> 9080/TCP 7m38s
service/ratings ClusterIP 10.10.200.100 <none> 9080/TCP 7m38s
service/reviews ClusterIP 10.10.200.244 <none> 9080/TCP 7m38s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/details-v1 1/1 1 1 7m38s
deployment.apps/productpage-v1 1/1 1 1 7m37s
deployment.apps/ratings-v1 1/1 1 1 7m38s
deployment.apps/reviews-v1 1/1 1 1 7m38s
deployment.apps/reviews-v2 1/1 1 1 7m38s
deployment.apps/reviews-v3 1/1 1 1 7m38s
NAME DESIRED CURRENT READY AGE
replicaset.apps/details-v1-cdd874bc9 1 1 1 7m38s
replicaset.apps/productpage-v1-5bb9985d4d 1 1 1 7m37s
replicaset.apps/ratings-v1-6484d64bbc 1 1 1 7m38s
replicaset.apps/reviews-v1-598f9b58fc 1 1 1 7m38s
replicaset.apps/reviews-v2-5979c6fc9c 1 1 1 7m38s
replicaset.apps/reviews-v3-7bbb5b9cf7 1 1 1 7m38s
NAME SECRETS AGE
serviceaccount/bookinfo-details 0 7m38s
serviceaccount/bookinfo-productpage 0 7m38s
serviceaccount/bookinfo-ratings 0 7m38s
serviceaccount/bookinfo-reviews 0 7m38s
serviceaccount/default 0 4h19m
# product 웹 접속 확인
❯ 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>
# 로그
❯ kubetail -l app=productpage -f
Will tail 3 logs...
productpage-v1-5bb9985d4d-9xbjg productpage
productpage-v1-5bb9985d4d-9xbjg istio-proxy
productpage-v1-5bb9985d4d-9xbjg istio-init```
Virtual Gateway는
Gateway를 통해 설정할 수 있는 항목은 다음과 같다.
Virtual Service는
Kubernetes service 를 세분화한 추상화된 Custom Resource Definition이며,
다양한 조건 정의를 통해 사용자에게 소스 또는 어플리케이션 설정정보 변경없이 선언적으로 트래픽이 라우팅 되도록합니다.
Envoy 프록시에게 어떤 destination으로 어떻게 트래픽을 전달할지 알려주는 역할을 수행하는 Istio 리소스다.
이를 통해 Routing 동작을 사용자가 원하는대로 customize하여 Native Kubernetes에서는 할 수 없었던 기능들을 제공한다
Virtual Service Manifest
VitrualService의 Routing Rule은 위에서 아래로 각 Rule이 차례대로 적용되며, 가장 마지막에 위치한 Rule이 Default Backend로 동작한다.
Virtual Gateway 소스
❯ cat ~/istio-$ISTIOV/samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
# The selector matches the ingress gateway pod labels.
# If you installed Istio using Helm following the standard documentation, this would be "istio=ingress"
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 8080
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 & Virtual Service 배포
# Istio Gateway/VirtualService 설정
❯ kubectl apply -f ~/istio-$ISTIOV/samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
# 확인
❯ kubectl get gw,vs
NAME AGE
gateway.networking.istio.io/bookinfo-gateway 28s
NAME GATEWAYS HOSTS AGE
virtualservice.networking.istio.io/bookinfo ["bookinfo-gateway"] ["*"] 28s
❯ istioctl proxy-status
NAME CLUSTER CDS LDS EDS RDS ECDS ISTIOD VERSION
details-v1-cdd874bc9-ww2wv.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-20-1-69765f7479-96nsq 1.20.1
istio-ingressgateway-5984c484cf-wdhft.istio-system Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-20-1-69765f7479-96nsq 1.20.1
productpage-v1-5bb9985d4d-9xbjg.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-20-1-69765f7479-96nsq 1.20.1
ratings-v1-6484d64bbc-c5ppz.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-20-1-69765f7479-96nsq 1.20.1
reviews-v1-598f9b58fc-x5p4l.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-20-1-69765f7479-96nsq 1.20.1
reviews-v2-5979c6fc9c-qlbs8.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-20-1-69765f7479-96nsq 1.20.1
reviews-v3-7bbb5b9cf7-z92mp.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-1-20-1-69765f7479-96nsq 1.20.1
# productpage 파드의 istio-proxy 로그 확인 Access log 가 출력 - Default access log format : 링크
❯ kubetail -l app=productpage -c istio-proxy -f
Will tail 1 logs...
productpage-v1-5bb9985d4d-9xbjg
[productpage-v1-5bb9985d4d-9xbjg] 2024-10-19T00:59:44.331550Z info xdsproxy connected to upstream XDS server: istiod-1-20-1.istio-system.svc:15012
# NodePort 확인
❯ export IGWHTTP=$(kubectl get service -n istio-system istio-ingressgateway -o jsonpath='{.spec.ports[1].nodePort}')
echo $IGWHTTP
31298
# 접속 확인
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway NodePort 10.10.200.24 <none> 15021:30291/TCP,80:31298/TCP,443:31894/TCP 4h17m
curl -s http://localhost:$IGWHTTP/productpage
curl -s http://192.168.10.101:$IGWHTTP/productpage
curl -s http://192.168.10.102:$IGWHTTP/productpage
# 정보 확인
echo $MYDOMAIN
cat /etc/hosts
# productpage 호출
curl -s http://$MYDOMAIN:$IGWHTTP/productpage
DestinationRule은 라우팅 발생 이후 트래픽 관련된 정책을 정의하는 Custom Resource Definition
트래픽 정책
subset
DestinationRule 배포 (예시)
❯ kubectl apply -f - << EOF
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
annotations:
name: dr-hello
namespace: default
spec:
host: svc-hello
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2
EOF
destinationrule.networking.istio.io/dr-hello created
❯ kubectl get dr
NAME HOST AGE
dr-hello svc-hello 9s
Virtual Service - Internal 배포
❯ kubectl apply -f - << EOF
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
annotations:
name: vs-i-hello-svc
namespace: default
spec:
hosts:
- svc-hello
http:
- route:
- destination:
host: svc-hello.default.svc.cluster.local
subset: v1
weight: 10
- destination:
host: svc-hello.default.svc.clvimuster.local
subset: v2
weight: 90
EOF
virtualservice.networking.istio.io/vs-i-hello-svc configured
❯ kubectl get vs
NAME GATEWAYS HOSTS AGE
vs-e-hello-svc ["gw-hello"] ["*"] 151m
vs-i-hello-svc ["svc-hello"] 7h11m
Test, 1:9 비율로 Canary 방식으로 분배되는지 확인
❯ for i in {1..10}; do kubectl exec -it httpbin -c httpbin -- curl http://svc-hello.default.svc.cluster.local:8080/api; sleep 0.5; done
Hello server - v2 (uri=/api)
Hello server - v2 (uri=/api)
Hello server - v2 (uri=/api)
Hello server - v2 (uri=/api)
Hello server - v2 (uri=/api)
Hello server - v2 (uri=/api)
Hello server - v1 (uri=/api)
Hello server - v2 (uri=/api)
Hello server - v2 (uri=/api)
Hello server - v2 (uri=/api)
Destination Rule은 Pod의 Label을 통해 서비스의 Subset을 분류하는데 주로 사용하지만, 다음과 같이 더욱 정교한 트래픽 관리도 가능하다.
아래 설명은 Istio 설치시 다운로드 된 samples/bookinfo 중심으로 설명되어 있습니다. 참고해 주세요
DestinationRule이 정의되지 않은 서비스는 K8s Service의 L4 Load Balance가 적용된다.
DestinationRule에 trafficPolicy 항목을 따로 명시하지 않은 경우, 기본값으로 Round Robin을 사용한다.
아래는 Round Robin 방식이 적용된 DestinationRule 예시이다.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews # name of a service from the service registry
# trafficPolicy: # service-level routing policy
# loadBalancer:
# simple: ROUND_ROBIN
건강한 상태의 host 중에서 하나를 무작위로 선택한다.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
loadBalancer:
simple: RANDOM
두 개의 건강한 host를 무작위로 고른 뒤, 그중에서 현재 처리중인 request가 적은 host를 선택한다.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy: # service-level routing policy
loadBalancer:
simple: LEAST_CONN
전체 서비스에 기본 Load balancing 방식을 정하고, 다시 subset마다 별도의 방식을 부여하는 것도 가능하다.
예를 들어 다음과 같은 DestinationRule을 정의할 수 있다.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
subsets:
- name: v1
labels:
version: v1
trafficPolicy:
loadBalancer:
simple: LEAST_CONN
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: RANDOM
HTTP Cookie 값에 따라 항상 동일한 host와 연결되는 Sticky Session 방식을 사용할 수 있다.
다만 코드 레벨에서 헤더값에 대한 정의와 전달이 이루어저야 한다.
다음은 'user'라는 이름의 cookie에 대해 1800초 동안 Sticky Session을 유지하는 예시이다.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
loadBalancer:
consistentHash:
httpCookie:
name: user
ttl: 1800s
Destination Rule을 통해 Connection Pool의 크기를 조정하여, DoS 공격 등을 차단할 수 있다.
HTTP 또는 TCP 레벨의 설정이 가능하며, 다음은 reviews 서비스의 동시 연결 갯수를 100개로 제한하고, timeout을 30ms로 설정한 예시이다.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
tcp:
maxConnections: 100
connectTimeout: 30ms
tcpKeepalive:
time: 7200s
interval: 75s
Istio는 문제가 발생한 Pod(outlier)을 Load Balancing Pool로부터 잠시 제외시키는 Circuit Breaker 기능을 제공한다.
Outlier를 판단하는 기준은 다음과 같다.
다음은 1초마다 productpage 서비스 중 연속해서 2개 이상의 502, 503, 504 에러 코드를 발생시키는 Outlier를 탐지하여,
3분간 제외시키는 DestinationRule 예시이다.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
outlierDetection:
consecutiveErrors: 2
interval: 1s
baseEjectionTime: 3m
K8s에서 기본 제공하는 Readiness Probe와 비슷한 개념이지만, 상대적으로 HTTP 에러에 더욱 민감하게 대응할 수 있기 때문에 두 기능을 제대로 활용할 경우 서비스 안정성을 더욱 향상시킬 수 있다.
외부 통신
내부 통신
DestinationRule은 라우팅 발생 이후 트래픽 관련된 정책을 정의하는 Custom Resource Definition으로서
Pod의 Label을 통해 서비스의 Subset을 분류하는 용으로 사용하거나 더욱 정교한 트래픽 관리 기능 수행시 활용 될 수 있다
[참고] Istio Canary Upgrade https://istio.io/latest/docs/setup/install/operator/#canary-upgrade
업그레이드할 Istio 버전의 istioctl
을 설치합니다.
전 단계에서 설치한 버전은 1.20.1
이고, 새로운 버전은 1.23.2
라고 가정합니다.
❯ ~/istio-1.20.1/bin/istioctl version
client version: 1.20.1
control plane version: 1.20.1
data plane version: 1.20.1 (7 proxies)
istio 1.23.2 추가 Download
❯ export ISTIOV=1.23.2
❯ curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV sh -
Downloading istio-1.23.2 from https://github.com/istio/istio/releases/download/1.23.2/istio-1.23.2-osx-arm64.tar.gz ...
Istio 1.23.2 Download Complete!
Istio has been successfully downloaded into the istio-1.23.2 folder on your system.
Next Steps:
See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster.
To configure the istioctl client tool for your workstation,
add the /Users/sjkim/Labs/CloudNeta/kans3/kans-k3s-istio/demo/istio-1.23.2/bin directory to your environment path variable with:
export PATH="$PATH:/Users/sjkim/Labs/CloudNeta/kans3/kans-k3s-istio/demo/istio-1.23.2/bin"
Begin the Istio pre-installation check by running:
istioctl x precheck
Need more information? Visit https://istio.io/latest/docs/setup/install/
❯ ~/istio-1.23.2/bin/istioctl version
client version: 1.23.2
control plane version: 1.20.1
data plane version: 1.20.1 (6 proxies)
--revision
파라미터를 붙여서 Isito Operator을 초기화 합니다.
❯ ~/istio-1.23.2/bin/istioctl operator init --revision 1-23-2
Installing operator controller in namespace: istio-operator using image: docker.io/istio/operator:1.23.2
Operator controller will watch namespaces: istio-system
✔ Istio operator installed ✅
✔ Installation complete
❯ ~/istio-1.23.2/bin/istioctl version
client version: 1.23.2
control plane version: 1.20.1
data plane version: 1.20.1 (6 proxies)
istio-operator, istio-system pod 확인. istiod는 배포전 상태임
``bash
❯ kubectl -n istio-operator get pods
NAME READY STATUS RESTARTS AGE
istio-operator-1-20-1-7d8568f545-22ppf 1/1 Running 0 16m
istio-operator-1-23-2-df775cc6f-dqjqw 1/1 Running 0 63s
❯ kubectl -n istio-system get pods
NAME READY STATUS RESTARTS AGE
istio-ingressgateway-5984c484cf-2xlqq 1/1 Running 0 15m
istiod-1-20-1-69765f7479-ntnpr 1/1 Running 0 15m
istio-1-23-2용 Manifests 내용
❯ cat istio-operator-1-23-2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: istiocontrolplane-1-23-2 # 수정
namespace: istio-system
spec:
revision: 1-23-2 # 수정
profile: default
components:
base:
enabled: true
pilot:
enabled: true
k8s:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
egressGateways:
- name: istio-egressgateway
enabled: false
ingressGateways:
- name: istio-ingressgateway
enabled: true
label:
istio: ingressgateway
k8s:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
hpaSpec:
minReplicas: 1
service:
externalTrafficPolicy: Cluster
type: NodePort
istio-1-23-2용 Manifests 적용
❯ ~/istio-1.23.2/bin/istioctl install -f istio-operator-1-23-2.yaml
|\
| \
| \
| \
/|| \
/ || \
/ || \
/ || \
/ || \
/ || \
/______||__________\
____________________
\__ _____/
\_____/
This will install the Istio 1.23.2 "default" profile (with components: Istio core, Istiod, and Ingress gateways) into the cluster. Proceed? (y/N) y
✔ Istio core installed ⛵️
✔ Istiod installed 🧠
✔ Ingress gateways installed 🛬
✔ Installation complete
istiod
)가 추가되는 걸 확인할 수 있습니다.이제 애플리케이션 POD가 실행되고 있는 Namespace에 istio.io/rev=1-23-2
label을 추가하고, 모든 Deployment를 재실행해야 합니다.
참고 자료 - Istio Data Plane 업그레이드
istiod와 달리 Istio Ingress/Egress Gateway는 버전마다 인스턴스를 추가 실행하지 않지만, 새로운 Istio Control Plane 버전을 사용하도록 내부에서 업그레이드됩니다.
▼ 확인하기
❯ ~/istio-1.23.2/bin/istioctl proxy-status | grep $(kubectl -n istio-system get pod -l app=istio-ingressgateway -o jsonpath='{.items..metadata.name}') | awk '{print $12}'
istiod-1-23-2-d7cc4c8d9-7jsg8
하지만 아직 워크로드 상에 동작하는 POD에는 새로운 버전의 Sidecar Proxy가 적용되어 있지 않습니다.
그래서 Namespace의 label을 기반으로 새로운 버전의 Sidecar proxy가 주입될 수 있도록 변경해야 합니다.
워크로드가 동작하는 Namespace에 istio-injection
label을 제거하고, istio.io/rev=1-23-2
label을 추가합니다.
❯ kubectl describe ns default
Name: default
Labels: istio.io/rev=1-20-1
kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
❯ kubectl label namespace default istio-injection- istio.io/rev=1-23-2 --overwrite
label "istio-injection" not found.
namespace/default labeled
❯ kubectl describe ns default
Name: default
Labels: istio.io/rev=1-23-2
kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
그 다음 해당 Namespace의 모든 POD에 새로운 버전의 Sidecar Proxy가 재주입될 수 있도록 재실행 합니다.
❯ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
details-v1 1/1 1 1 43m
productpage-v1 1/1 1 1 43m
ratings-v1 1/1 1 1 43m
reviews-v1 1/1 1 1 43m
reviews-v2 1/1 1 1 43m
reviews-v3 1/1 1 1 43m
❯ kubectl rollout restart deployment productpage-v1
deployment.apps/productpage-v1 restarted
❯ kubectl rollout restart deployment details-v1
deployment.apps/details-v1 restarted
❯ kubectl rollout restart deployment ratings-v1
deployment.apps/ratings-v1 restarted
❯ kubectl rollout restart deployment reviews-v1
deployment.apps/reviews-v1 restarted
❯ kubectl rollout restart deployment reviews-v2
deployment.apps/reviews-v2 restarted
❯ kubectl rollout restart deployment reviews-v3
deployment.apps/reviews-v3 restarted
❯ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
details-v1-59847698b8-w6vxr 2/2 Running 0 51s 172.16.0.10 k3s-s <none> <none>
productpage-v1-649f7489d4-lgq9w 2/2 Running 0 64s 172.16.1.14 k3s-w1 <none> <none>
ratings-v1-6bbb88cbcb-8lm74 2/2 Running 0 40s 172.16.0.11 k3s-s <none> <none>
reviews-v1-cb4b4f55d-5lnb6 2/2 Running 0 21s 172.16.2.15 k3s-w2 <none> <none>
reviews-v2-6dbdbd7646-5tkmw 2/2 Running 0 19s 172.16.1.15 k3s-w1 <none> <none>
reviews-v3-6ccb68567d-rhq2f 2/2 Running 0 17s 172.16.2.16 k3s-w2 <none> <none>
업그레이드가 완료 됐기 때문에 구 버전의 Istio를 제거하도록 합니다.
구 버전의 IstioOperator CRD를 삭제하면, 구 버전 Istio가 자동으로 제거 됩니다.
❯ kubectl get istiooperators.install.istio.io -n istio-system -A
NAMESPACE NAME REVISION STATUS AGE
istio-system installed-state-istiocontrolplane-1-20-1-1-20-1 1-20-1 88m
❯ kubectl delete istiooperators.install.istio.io -n istio-system installed-state-istiocontrolplane-1-20-1-1-20-1
istiooperator.install.istio.io "installed-state-istiocontrolplane-1-20-1-1-20-1" deleted
위 명령어 실행 후 IstioOperator 가 삭제되지 않고, 대기하는 이유는 Finalizers: istio-finalizer.install.istio.io
가 등록되어 있기 때문입니다.
Finalizers
필드를 제거하면 IstioOperator의 삭제가 완료됩니다.
그 다음 Isito Operator Controller 관련된 리소스를 삭제하기 위해 다음 명령어를 실행합니다.
❯ ~/istio-1.20.1/bin/istioctl operator remove --revision 1-20-1 --force
Istio operator revision 1-20-1 will be removed from cluster, Proceed? (y/N) y
Removing Istio operator...
Removed Deployment:istio-operator:istio-operator-1-20-1.
Removed Service:istio-operator:istio-operator-1-20-1.
Removed ServiceAccount:istio-operator:istio-operator-1-20-1.
Removed ClusterRole::istio-operator-1-20-1.
Removed ClusterRoleBinding::istio-operator-1-20-1.
✔ Removal complete
## istiod-1-20-1이 실제 삭제되지 않아 수동으로 삭제
❯ kubectl get hpa -A
NAMESPACE NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
istio-system istio-ingressgateway Deployment/istio-ingressgateway cpu: 2%/80% 1 5 1 95m
istio-system istiod-1-20-1 Deployment/istiod-1-20-1 cpu: 2%/80% 1 5 1 95m
istio-system istiod-1-23-2 Deployment/istiod-1-23-2 cpu: 2%/80% 1 5 1 74m
❯ kubectl -n istio-system delete hpa istiod-1-20-1
horizontalpodautoscaler.autoscaling "istiod-1-20-1" deleted
❯ kubectl -n istio-system get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
istio-ingressgateway 1/1 1 1 96m
istiod-1-20-1 1/1 1 1 96m
istiod-1-23-2 1/1 1 1 75m
❯ kubectl -n istio-system delete deployments.apps istiod-1-20-1
deployment.apps "istiod-1-20-1" deleted
❯ kubectl -n istio-system get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
istio-ingressgateway 1/1 1 1 97m
istiod-1-23-2 1/1 1 1 76m
❯ kubectl -n istio-system get mutatingwebhookconfigurations.admissionregistration.k8s.io
NAME WEBHOOKS AGE
istio-revision-tag-default 4 98m
istio-sidecar-injector-1-20-1 2 98m
istio-sidecar-injector-1-23-2 2 77m
❯ kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io istio-sidecar-injector-1-20-1
mutatingwebhookconfiguration.admissionregistration.k8s.io "istio-sidecar-injector-1-20-1" deleted
❯ kubectl -n istio-system get validatingwebhookconfigurations.admissionregistration.k8s.io
NAME WEBHOOKS AGE
istio-validator-1-20-1-istio-system 1 100m
istio-validator-1-23-2-istio-system 1 79m
istiod-default-validator 1 119m
❯ kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io istio-validator-1-20-1-istio-system
validatingwebhookconfiguration.admissionregistration.k8s.io "istio-validator-1-20-1-istio-system" deleted
❯ ~/istio-1.23.2/bin/istioctl version
client version: 1.23.2
control plane version: 1.23.2
data plane version: 1.23.2 (7 proxies)
~/istio-1.23.2/bin/istioctl operator dump
[참고] Istio - (2) Istio 설치(EKS) https://cwal.tistory.com/41, Istio - (3) Gateway와 VirtualService https://cwal.tistory.com/42
kubectl을 이용하여 Addons을 설치한다
❯ ls ~/istio-1.23.2/samples/addons/
README.md extras grafana.yaml jaeger.yaml kiali.yaml loki.yaml prometheus.yaml
❯ kubectl apply -f ~/istio-1.23.2/samples/addons/
serviceaccount/grafana created
configmap/grafana created
service/grafana created
deployment.apps/grafana created
configmap/istio-grafana-dashboards created
configmap/istio-services-grafana-dashboards created
deployment.apps/jaeger created
service/tracing created
service/zipkin created
service/jaeger-collector created
serviceaccount/kiali created
configmap/kiali created
clusterrole.rbac.authorization.k8s.io/kiali created
clusterrolebinding.rbac.authorization.k8s.io/kiali created
role.rbac.authorization.k8s.io/kiali-controlplane created
rolebinding.rbac.authorization.k8s.io/kiali-controlplane created
service/kiali created
deployment.apps/kiali created
serviceaccount/loki created
configmap/loki created
configmap/loki-runtime created
service/loki-memberlist created
service/loki-headless created
service/loki created
statefulset.apps/loki created
serviceaccount/prometheus created
configmap/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
service/prometheus created
deployment.apps/prometheus created
❯ kubectl -n istio-system get pod,svc
NAME READY STATUS RESTARTS AGE
pod/grafana-7f76bc9cdb-klthz 1/1 Running 0 75s
pod/istio-ingressgateway-745f4bfb7b-4hqnn 1/1 Running 0 87m
pod/istiod-1-23-2-d7cc4c8d9-7jsg8 1/1 Running 0 88m
pod/jaeger-66f9675c7b-fxdt5 1/1 Running 0 74s
pod/kiali-65c46f9d98-gdjdv 1/1 Running 0 74s
pod/loki-0 1/1 Running 0 74s
pod/prometheus-7979bfd58c-kp226 2/2 Running 0 74s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/grafana ClusterIP 10.10.200.182 <none> 3000/TCP 75s
service/istio-ingressgateway NodePort 10.10.200.210 <none> 15021:30814/TCP,80:32078/TCP,443:32089/TCP 109m
service/istiod-1-20-1 ClusterIP 10.10.200.205 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 109m
service/istiod-1-23-2 ClusterIP 10.10.200.238 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 88m
service/jaeger-collector ClusterIP 10.10.200.49 <none> 14268/TCP,14250/TCP,9411/TCP,4317/TCP,4318/TCP 74s
service/kiali ClusterIP 10.10.200.185 <none> 20001/TCP,9090/TCP 74s
service/loki ClusterIP 10.10.200.228 <none> 3100/TCP,9095/TCP 74s
service/loki-headless ClusterIP None <none> 3100/TCP 74s
service/loki-memberlist ClusterIP None <none> 7946/TCP 74s
service/prometheus ClusterIP 10.10.200.248 <none> 9090/TCP 74s
service/tracing ClusterIP 10.10.200.177 <none> 80/TCP,16685/TCP 74s
service/zipkin ClusterIP 10.10.200.108 <none> 9411/TCP 74s
Grafana, Kiali, Jaeger 등 다양한 Dashboard를 조회할 수 있다.
❯ istioctl dashboard grafana
http://localhost:3000
Configure, visualize, validate and troubleshoot your mesh!
명령어
❯ istioctl dashboard kiali
http://localhost:20001/kiali
GUI 화면
asdf는 https://asdf-vm.com/guide/getting-started.html
asdf 설치
❯ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0
❯ Bash & Git
Add the following to ~/.bashrc:
shell
. "$HOME/.asdf/asdf.sh"
Completions must be configured by adding the following to your .bashrc:
shell
. "$HOME/.asdf/completions/asdf.bash"asdf install istioctl latest
asdf plugin 설치
❯ asdf plugin list all
❯ asdf plugin add <plugin> [<url>]
❯ asdf plugin list [<flag>]
❯ asdf plugin-add istioctl https://github.com/virtualstaticvoid/asdf-istioctl.git
❯ asdf install istioctl latest
asdf list-all istioctl
❯ asdf list-all istioctl
1.17.8
...
1.21.0
1.21.1
1.21.2
1.22.0-beta.0
1.22.0-alpha.1
❯ asdf list istioctl
*1.20.1
1.21.1
1.21.2
```
istioctl version 확인
❯ istioctl version
client version: 1.20.1
control plane version: 1.21.2
data plane version: 1.21.2 (7 proxies)
asdf install istioctl 1.21.2
❯ asdf install istioctl 1.21.2
Downloading istioctl from https://github.com/istio/istio/releases/download/1.21.2/istio-1.21.2-osx-arm64.tar.gz
asdf: Warn: You have configured asdf to preserve downloaded files (with always_keep_download=yes or --keep-download). But
asdf: Warn: the current plugin (istioctl) does not support that. Downloaded files will not be preserved.
asdf local istioctl 특정버전 적용
❯ asdf local istioctl 1.21.2
❯ istioctl version
client version: 1.21.2
control plane version: 1.21.2
data plane version: 1.21.2 (7 proxies)
asdf uninstall istioctl 1.20.1
❯ asdf list istioctl
1.20.1
1.21.1
*1.21.2
❯ asdf uninstall istioctl 1.20.1
❯ asdf uninstall istioctl 1.21.1
❯ asdf list istioctl
1.21.2
긴글 읽어 주셔서 감사합니다. 업무에 도움이 되길 바랍니다.