istio
istio 와 probe
v1.25.0
버전 설치: curl -LO https://storage.googleapis.com/minikube/releases/v1.25.0/minikube-linux-amd64
Kubernetes v1.24+ 및 도커 컨테이너 런타임을 사용하는 none 드라이버에는 cry-dockerd가 필요합니다.
# 도커
$ sudo yum -y install git wget curl
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
$ systemctl enable --now docker
# 미니쿠버 v1.25.0 설치
# 미니쿠버 를 위한 conntarck 설치
$ yum install -y conntrack
$ wget https://storage.googleapis.com/minikube/releases/v1.25.0/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube
$ minikube version
# 미니쿠버 시작
$ minikube start --driver=none
$ sudo mv /root/.kube /root/.minikube $HOME
$ sudo chown -R $USER $HOME/.kube $HOME/.minikube
$ minikube status
# kubectl 설치 v1.25.0
$ curl -LO https://dl.k8s.io/release/v1.25.0/bin/linux/amd64/kubectl
$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
$ source <(kubectl completion bash)
# 시스템이 껏다 켜지더라도 자동완경 가능하게 설정
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
$ exit
$ kubectl version --client
$ kubectl get all
$ mkdir warmup-exercise && cd $_
$ vi 1-istio-init.yaml
내용 복사 -> https://github.com/DickChesterwood/istio-fleetman/blob/master/_course_files/x86_amd64/warmup-exercise/1-istio-init.yaml
$ kubectl apply -f 1-istio-init.yaml
$ vi 2-istio-minikube.yaml
내용 복사 => https://github.com/DickChesterwood/istio-fleetman/blob/master/_course_files/x86_amd64/warmup-exercise/2-istio-minikube.yaml
$ kubectl apply -f 2-istio-minikube.yaml
$ kubectl get po -n istio-system
$ vi 3-kiali-secret.yaml
내용 복사 => https://github.com/DickChesterwood/istio-fleetman/blob/master/_course_files/x86_amd64/warmup-exercise/3-kiali-secret.yaml
$ kubectl apply -f 3-kiali-secret.yaml
$ kubectl describe ns default
$ kubectl get ns default -o yaml
$ vi 4-application-full-stack.yaml
$ kubectl apply -f 4-application-full-stack.yaml
내용 복사 => https://github.com/DickChesterwood/istio-fleetman/tree/master/_course_files/x86_amd64/warmup-exercise
$ kubectl get po
$ kubectl get svc
--> nodeport로 접속시 사이트에서 차량목록에 추가되어야하는데 문제가 있나 추가되지 않음.
이스티오에 플래그를 설정하여 특정한 네임스페이스에 대해 모든 포드에 프록시 컨테이너를 자동으로 주입
사이드카 : 포드안에서 추가적인 도움을 주는 헬퍼 컨테이너
인젝터 : 컨트롤 플레인 컴포넌트 중 하나로 기본적으로 포드를 스케줄링 할 때 항상 모니터링하고, 인젝터가 이것을 탐지하고
kiali : 어떤 마이크로서비스가 이스티오 서비스 메시의 일부인지 알려주고 어떻게 연결/작동하는지 알려준다.
마이크로 서비스의 컨테이너는 다른 포드를 호출하는 것이 아니라 클러스터 외부의 URL을 호출하고 이는 프록시(; 서비스 메시) 로 인도되며 우리가 우리가 yaml 수정을 프록시에 제공 및 통제
Kubernetes는 컨테이너 오케스트레이션 툴입니다. Kubernetes의 핵심 단위 중 하나가 노드입니다. 노드는 파일 시스템 또는 기타 컴포넌트와 함께 하나 이상의 컨테이너로 구성되어 있습니다. 마이크로서비스 아키텍처는 12개의 노드를 보유할 수 있는데, 노드마다 각기 다른 마이크로 서비스를 대표합니다. Kubernetes는 노드의 가용성과 리소스 이용을 관리하며, 팟(Pod) 오토스케일러를 통해 수요 증가에 따라 팟(Pod)을 추가합니다. Istio는 추가 컨테이너를 팟(Pod)에 삽입하는 방식으로 보안, 관리, 모니터링 기능을 추가합니다.
이스티오는 서비스 메시의 일종으로 프록시를 이용하여 서비스 메시를 구현하고 서비스 특정한 컨테이너가 우리 클러스터에 있는 또 다른 컨테이너를 호출 이 프록시 컴포넌트를 통해 라우팅된다는 점, 쿠버네티스에서 사이드카 컨테이너로서 구현됩니다.
x-request-id
라는 헤더를 추가해야한다.envoy: 클러스터 기반 응용 프로그램을 위한 프록시, 프록시를 공급하고 이 프록시가 쿠버네티스 플랫폼에서 사이드카 컨테이너가 된다.
프록시 세트를 이스티오의 데이터 플레인
이라고 일컽는다.
이스티오는 envoy
구성을 간단하게 해준다.
kubectl edit
또는 쿠버네티스의 yaml 을 변경하지 않고도 UI를 통해 우리의 구성을 변경가능$ kubectl get virtualservice
$ kubectl get vs
$ kubectl get destinationrule
$ kubectl get dr
정의된 YAML 파일 확인하기
-o yaml
옵션으로 출력하기
$ kubectl get <resource> -o yaml
# 예시) kubectl get vs -o yaml
kiali 에서 조회하기 - View YAML 클릭
클러스터를 재시작 할때 버추얼 서비스를 다시 생성하고 싶다면 해당 YAML의 내용을 복사하여 소스 컨트롤을 수행할수 있으며 kubectl apply -f
로 적용하면 된다.
~
값을 제공하지 않겠다 라는 부분도 제거
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
#name: fleetman-staff-service
# 그냥 버추얼 서비스의 이름, 정하고 싶은대로 정하고 kubectl get vs 하면 나오는 그것
name: a-set-of-routing-rules-we-can-call-this-anything # "just" a name for this virtualservice
namespace: default
spec:
hosts:
#- fleetman-staff-service.default.svc.cluster.local
# "FQDN - 전체 주소 도메인 네임" 를 지정해야한다.
# 쿠버네티스의 Service DNS 이름
- fleetman-staff-service.default.svc.cluster.local # The Service DNS (ie the regular K8S Service) name that we're applying routing rules to.
http:
- route:
- destination:
# The Target DNS name, 클러스터 내부에서 요청으로 전달하고 싶은 대상 서비스의 DNS 이름
host: fleetman-staff-service.default.svc.cluster.local
subset: safe-group # DestinationRule 에 정의된 subset 의 이름
weight: 90
- destination:
host: fleetman-staff-service.default.svc.cluster.local
subset: risky-group # The name defined in the DestinationRule
weight: 10
---
kind: DestinationRule # Defining which pods should be part of each subset
apiVersion: networking.istio.io/v1alpha3
metadata:
#name: fleetman-staff-service
name: grouping-rules-for-our-photograph-canary-release # This can be anything you like.
namespace: default
spec:
# host - Service DNS 네임
host: fleetman-staff-service.default.svc.cluster.local
subsets:
# labels(셀렉터) 의 정의를 통해 라벨에 해당하는 pod를 찾아서 매칭
- labels: # SELECTOR.
version: safe # find pods with label "safe"
name: safe-group # 해당 subset의 이름을 "safe-group" 이라고 정의
- labels:
version: risky
name: risky-group
이스티오는 프록시 구성 권한을 우리에게 주고 프록시 구성 권한에 사용자 지정 라우팅 규칙을 설정하면 (envoy)프록시에 버추얼 서비스들이 배포 되고 이를 통해서 (envoy) 프록시의 트래픽 관리 기능을 이용할 수 있게되며 이를 통해서 카라니아 배포도 할 수 있는 것
kiali 는 버추얼 서비스와 데스티네이션 룰을 검증하고 이를 보여준다.
불가능
trafficPolicy.loadBalancer.consistentHash.httpHeaderName
에서 헤더의 이름을 지정한다. 헤더 연쇄부분은 해당하는 애플리케이션을 직접 수정해줘야 한다. 그렇지 않으면 분산 추적이 정상적으로 동작하지 않으며 우리가 원하는 것 처럼 연쇄 되어있는 서비스로 연결되지 않는다.kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
name: a-set-of-routing-rules-we-can-call-this-anything # "just" a name for this virtualservice
namespace: default
spec:
hosts:
- fleetman-staff-service.default.svc.cluster.local # The Service DNS (ie the regular K8S Service) name that we're applying routing rules to.
http:
- route:
- destination:
host: fleetman-staff-service.default.svc.cluster.local # The Target DNS name
subset: all-staff-service-pods # The name defined in the DestinationRule
# weight: 100 not needed if there's only one.
---
kind: DestinationRule # Defining which pods should be part of each subset
apiVersion: networking.istio.io/v1alpha3
metadata:
name: grouping-rules-for-our-photograph-canary-release # This can be anything you like.
namespace: default
spec:
host: fleetman-staff-service # Service
trafficPolicy:
loadBalancer:
consistentHash:
httpHeaderName: "x-myval"
subsets:
- labels: # SELECTOR.
app: staff-service # find pods with label "safe"
name: all-staff-service-pods
kubectl get svc|po -n istio-system --show-labels | grep istio=ingressgateway
: selector 는 ingress gateway pod 와 일치하는 label
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ingress-gateway-configuration
spec:
# The selector matches the ingress gateway pod labels.
# 용어가 거시기 한데, 여기서 "selector" 는 k8s 의 labels 과 같은 역할
# If you installed Istio using Helm following the standard documentation, this would be "istio=ingress"
# 즉 위 내용은 Helm 으로 구성하게 되면 labels의 istio: ingress 라는 key-value로 만들어진다는 의미
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "httpbin.example.com" # Domain name of the external website
---
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
name: fleetman-webapp
namespace: default
spec:
# The Service DNS (ie the regular K8S Service) name that we're applying routing rules to.
# 트래픽이 전송되는 대상 호스트입니다. 와일드카드 접두사가 있는 DNS 이름 또는 IP 주소일 수 있습니다.
hosts: # which incoming host are we applying the proxy rules to???
- "*"
gateways: # 위에서 정의한 ingress gateway 이름
- ingress-gateway-configuration
http:
...
헤더 전파
를 생각하기 - 💢 분산 추적 ❗
istio-system
의 모든 워크로드에 대해 mTLS 트래픽을 허용하는 정책apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: foo
spec:
mtls:
mode: STRICT
$ istioctl install -f YAML_FILE.yaml --set values.global.jwtPolicy=first-party-jwt
istioctl
을 사용하여 설치하는 경우 지원이 자동으로 감지됩니다. 이는 수동으로도 수행할 수 있으며 --set values.global.jwtPolicy=third-party-jwt
또는 --set values.global.jwtPolicy=first-party-jwt
를 전달하여 구성할 수 있습니다. # 퍼스트 파티 예시
$ istioctl install -f YAML_FILE.yaml --set values.global.jwtPolicy=first-party-jwt
# "삭제가 실험적이라고 하여 이렇게 됨.", 차후 변경될 수도 있음.
$ istioctl x uninstall --purge
istioctl manifest generate -f YAML_FILE.yaml > NEW_FILE.yaml
❗ 단, istio-system
네임스페이스는 직접 설정해줘야한다.
apiVersion: v1
kind: Namespace
metadata:
name: istio-system