본문 바로가기

study/KANS 3기

KANS 3기 Istio KIND 실습환경 구축

kind k8s 배포

#
cat <<EOF> kind-1node.yaml 
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
  - containerPort: 30001
    hostPort: 30001
  - containerPort: 30002
    hostPort: 30002
  - containerPort: 30003
    hostPort: 30003
networking:
  podSubnet: 10.10.0.0/16
  serviceSubnet: 10.200.1.0/24 
EOF
kind create cluster --config kind-1node.yaml --name myk8s --image kindest/node:v1.30.4

# 설치 확인
docker ps

# 노드에 기본 툴 설치
docker exec -it myk8s-control-plane sh -c 'apt update && apt install tree psmisc lsof wget bridge-utils net-tools dnsutils tcpdump ngrep iputils-ping git vim -y'

# testpc 컨테이너 기동 : kind 도커 브리지를 지정 해서 사용
docker run -d --rm --name testpc --network kind nicolaka/netshoot sleep infinity # IP 지정 없이 실행 시
docker ps

 

 

istioctl 설치 - install , profile

 

Installation Configuration Profiles

Describes the built-in Istio installation configuration profiles.

istio.io

# myk8s-control-plane 진입 후 설치 진행
docker exec -it myk8s-control-plane bash
-----------------------------------
# istioctl 설치
export ISTIOV=1.23.2
echo "export ISTIOV=1.23.2" >> /etc/profile # 미동작으로 보임
curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV sh -
tree istio-$ISTIOV -L 2 # sample yaml 포함
cp istio-$ISTIOV/bin/istioctl /usr/local/bin/istioctl
istioctl version --remote=false

# default 프로파일 컨트롤 플레인 배포
istioctl profile list
istioctl install --set profile=default -y

# 설치 확인 : istiod, istio-ingressgateway, crd 등
kubectl get all,svc,ep,sa,cm,secret,pdb -n istio-system
kubectl get crd | grep istio.io | sort

# istio-ingressgateway 서비스 NodePort 변경 및 nodeport 30000로 지정 변경
kubectl patch svc -n istio-system istio-ingressgateway -p '{"spec": {"type": "NodePort", "ports": [{"port": 80, "targetPort": 8080, "nodePort": 30000}]}}'
kubectl get svc -n istio-system istio-ingressgateway

# istio-ingressgateway 서비스 externalTrafficPolicy 설정 : ClientIP 수집 확인 용도
kubectl patch svc -n istio-system istio-ingressgateway -p '{"spec":{"externalTrafficPolicy": "Local"}}'

# 빠져나오기
exit
-----------------------------------

 

default 네임스페이스에 istio-proxy sidecar 주입 설정 - Docs

 

Installing the Sidecar

Install the Istio sidecar in application pods automatically using the sidecar injector webhook or manually using istioctl CLI.

istio.io

# mutating Webhook admisstion controller 사용
kubectl label namespace default istio-injection=enabled
kubectl get ns -L istio-injection

 

 

Istio 접속 테스트를 위한 변수 지정

# /etc/hosts 파일 수정
MYDOMAIN=<각자 자신의 www 도메인> # 단, 사용하고 있지 않는 공인 도메인을 사용 할 것
export MYDOMAIN=www.gasida.dev # 예시 도메인
echo "127.0.0.1 $MYDOMAIN" | sudo tee -a /etc/hosts

# istio ingress gw 접속 테스트 : 아직은 설정이 없어서 접속 실패가 된다
curl -v -s $MYDOMAIN:30000
curl -v -s 127.0.0.1:30000

 

[신규 터미널] testpc 컨테이너

# myk8s-control-plane 컨테이너 IP 확인
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myk8s-control-plane
172.18.0.2


# testpc 진입 후 설치 진행
docker exec -it testpc zsh
-----------------------------------
#
echo -e "172.18.0.2 www.gasida.dev" | tee -a /etc/hosts

#
curl -v -s www.gasida.dev:30000

# 이후에도 접속 테스트를 위해서 해당 터미널은 유지

 

Istio 를 통한 Nginx 파드 접속 테스트

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kans-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-websrv
spec:
  replicas: 1
  selector:
    matchLabels:
      app: deploy-websrv
  template:
    metadata:
      labels:
        app: deploy-websrv
    spec:
      serviceAccountName: kans-nginx
      terminationGracePeriodSeconds: 0
      containers:
      - name: deploy-websrv
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc-clusterip
spec:
  ports:
    - name: svc-webport
      port: 80
      targetPort: 80
  selector:
    app: deploy-websrv
  type: ClusterIP
EOF

 

Istio Gateway/VirtualService 설정 - Host 기반 트래픽 라우팅 설정 - Gateway

 

Installing Gateways

Install and customize Istio Gateways.

istio.io

cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: test-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: nginx-service
spec:
  hosts:
  - "$MYDOMAIN"  # 도메인 접속이 잘 되지 않을 경우 "*" 로 변경하고 IP로 접속 할 것
  gateways:
  - test-gateway
  http:
  - route:
    - destination:
        host: svc-clusterip
        port:
          number: 80
EOF

 

 

리소스 생성 확인

#
kubectl get deploy,pod,svc,ep,sa
kubectl describe pod -l app=deploy-websrv
kubectl get gw,vs

# 로그 확인
kubectl logs -l app=deploy-websrv -c istio-init --tail=-1
kubectl logs -l app=deploy-websrv -c istio-proxy --tail=-1
kubectl logs -l app=deploy-websrv -c deploy-websrv --tail=-1

#
docker exec -it myk8s-control-plane istioctl proxy-status # 단축어 ps
NAME                                                   CLUSTER        CDS              LDS              EDS              RDS              ECDS        ISTIOD                      VERSION
deploy-websrv-778ffd6947-7s9fk.default                 Kubernetes     SYNCED (14m)     SYNCED (14m)     SYNCED (14m)     SYNCED (14m)     IGNORED     istiod-868cc8b7d7-l95c2     1.23.2
istio-ingressgateway-64f9774bdc-b4rzj.istio-system     Kubernetes     SYNCED (22m)     SYNCED (22m)     SYNCED (22m)     SYNCED (22m)     IGNORED     istiod-868cc8b7d7-l95c2     1.23.2

#
docker exec -it myk8s-control-plane istioctl proxy-config all deploy-websrv-778ffd6947-7s9fk
docker exec -it myk8s-control-plane istioctl proxy-config all istio-ingressgateway-64f9774bdc-b4rzj.istio-system

docker exec -it myk8s-control-plane istioctl proxy-config listener deploy-websrv-778ffd6947-7s9fk
docker exec -it myk8s-control-plane istioctl proxy-config route deploy-websrv-778ffd6947-7s9fk
docker exec -it myk8s-control-plane istioctl proxy-config cluster deploy-websrv-778ffd6947-7s9fk
docker exec -it myk8s-control-plane istioctl proxy-config endpoint deploy-websrv-778ffd6947-7s9fk
docker exec -it myk8s-control-plane istioctl proxy-config log deploy-websrv-778ffd6947-7s9fk

 

 

Istio 를 통한 Nginx 파드 접속 테스트

# (참고) 출력 로그 정보 확인
kubectl logs -n istio-system -l app=istio-ingressgateway -f
kubectl logs -l app=deploy-websrv -c istio-proxy -f
kubectl logs -l app=deploy-websrv -c deploy-websrv -f

# testpc 컨테이너에서 접속 테스트
curl -v -s <각자 자신의 www 도메인>:30000
curl -v -s www.gasida.dev:30000
curl -v -s <controlplane 컨테이너IP>:30000
curl -v -s 172.18.0.2:30000

# 자신의 mac 에서 접속 테스트
curl -v -s <각자 자신의 www 도메인>:30000
curl -v -s www.gasida.dev:30000
curl -v -s 127.0.0.1:30000
open http://127.0.0.1:30000

 

 

(참고) istio-proxy 파드에 envoy 컨테이너 admin 페이지 접속

# istio-proxy 파드에 envoy 컨테이너 admin 접속 포트 포워딩 설정
kubectl port-forward deployment/deploy-websrv 15000:15000 &

# envoy 컨테이너 admin 페이지 접속
open http://localhost:15000

 

 

실습 리소스 삭제

kubectl delete gw test-gateway
kubectl delete vs nginx-service
kubectl delete deploy deploy-websrv
kubectl delete svc svc-clusterip
kubectl delete sa kans-nginx

 

 

Bookinfo & Addon 설치

# myk8s-control-plane 진입 후 설치 진행
docker exec -it myk8s-control-plane bash
-----------------------------------
# Bookinfo 애플리케이션 배포
export ISTIOV=1.23.2
cat /istio-$ISTIOV/samples/bookinfo/platform/kube/bookinfo.yaml
kubectl apply -f /istio-$ISTIOV/samples/bookinfo/platform/kube/bookinfo.yaml

# 확인 : 서비스 어카운트(sa)는 spiffe 에 svid 에 사용됨
kubectl get all,sa

# 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>"

# productpage 파드 로그
kubectl logs -l app=productpage -c istio-proxy --tail=-1
kubectl logs -l app=productpage -c productpage -f

# Istio Gateway/VirtualService 설정
cat istio-$ISTIOV/samples/bookinfo/networking/bookinfo-gateway.yaml
kubectl apply -f /istio-$ISTIOV/samples/bookinfo/networking/bookinfo-gateway.yaml

# Istio Gateway/VirtualService 설정 확인
kubectl get gw,vs
istioctl proxy-status

# productpage 파드의 istio-proxy 로그 확인 Access log 가 출력 - Default access log format : 링크
kubectl logs -l app=productpage -c istio-proxy -f


# Addon 설치
## Install Kiali and the other addons and wait for them to be deployed. : Kiali dashboard, along with Prometheus, Grafana, and Jaeger.
tree /istio-$ISTIOV/samples/addons/
kubectl apply -f /istio-$ISTIOV/samples/addons # 디렉터리에 있는 모든 yaml 자원을 생성
kubectl rollout status deployment/kiali -n istio-system

# 확인
kubectl get all,sa,cm -n istio-system
kubectl get svc,ep -n istio-system

# NodePort 변경 및 nodeport 30001~30003으로 변경 : prometheus(30001), grafana(30002), kiali(30003)
kubectl patch svc -n istio-system prometheus -p '{"spec": {"type": "NodePort", "ports": [{"port": 9090, "targetPort": 9090, "nodePort": 30001}]}}'
kubectl patch svc -n istio-system grafana -p '{"spec": {"type": "NodePort", "ports": [{"port": 3000, "targetPort": 3000, "nodePort": 30002}]}}'
kubectl patch svc -n istio-system kiali -p '{"spec": {"type": "NodePort", "ports": [{"port": 20001, "targetPort": 20001, "nodePort": 30003}]}}'

# 빠져나오기
exit
-----------------------------------

 

 

Prometheus , Grafana , Kiali 접속

# Prometheus 접속
open http://127.0.0.1:30001

# Grafana 접속
open http://127.0.0.1:30002

# Kiali 접속 : NodePort
open http://127.0.0.1:30003

# Kiali 접속 : Port forward
kubectl port-forward deployment/kiali -n istio-system 20001:20001 &
open http://127.0.0.1:20001

 

 

Istio 를 통한 productpage 접속(반복) 테스트 & 웹 브라우저 접속 테스트

test pc

# testpc 컨테이너에서 접속 테스트
curl -v -s <각자 자신의 www 도메인>:30000
curl -v -s www.gasida.dev:30000/
curl -v -s www.gasida.dev:30000/productpage
curl -v -s www.gasida.dev:30000/productpage | grep -o "<title>.*</title>"

# 반복 접속 테스트
for i in {1..10};  do curl -s www.gasida.dev:30000/productpage | grep -o "<title>.*</title>" ; done
for i in {1..100};  do curl -s www.gasida.dev:30000/productpage | grep -o "<title>.*</title>" ; done
for i in {1..1000};  do curl -s www.gasida.dev:30000/productpage | grep -o "<title>.*</title>" ; done

while true; do curl -s www.gasida.dev:30000/productpage | grep -o "<title>.*</title>" ; echo "--------------" ; sleep 1; done
while true; do curl -s www.gasida.dev:30000/productpage | grep -o "<title>.*</title>" ; echo "--------------" ; sleep 0.5; done
while true; do curl -s www.gasida.dev:30000/productpage | grep -o "<title>.*</title>" ; echo "--------------" ; sleep 0.1; done

 

 

macOS

# 자신의 mac 에서 접속 테스트
curl -v -s <각자 자신의 www 도메인>:30000
curl -v -s www.gasida.dev:30000/productpage
curl -v -s 127.0.0.1:30000/productpage

open http://www.gasida.dev:30000/productpage
open http://127.0.0.1:30000/productpage


# (위 접속이 잘 안될 경우) productpage 파드로 직접 port-forward 로 접속
kubectl port-forward deployment/productpage-v1 9080:9080 &
open http://127.0.0.1:9080
open http://127.0.0.1:9080/productpage

 

 

Kiali (키알리) 보기 설정

Namespacedefault 로 선택 후 Graph (Traffic, Versioned app graph) 에서 Display 옵션 중 ‘Traffic Distribution’ 과 ‘Traffic Animation’ 활성화! , Security 체크 해보자 (Last 1m, Evety 10s)

 

 

Bookinfo 삭제 : addon은 남겨둠!

# myk8s-control-plane 진입 후 설치 진행
docker exec -it myk8s-control-plane bash
-----------------------------------
# Bookinfo 삭제
export ISTIOV=1.23.2
cd /istio-$ISTIOV/samples/bookinfo/platform/kube
./cleanup.sh
namespace ? [default] 엔터 입력

exit
-----------------------------------

 

 

 

 

 

'study > KANS 3기' 카테고리의 다른 글

KANS 3기 Cilium  (0) 2024.10.27
KANS 3기 Istio  (0) 2024.10.19
KANS 3기 Gateway API  (1) 2024.10.12
KANS 3기 6주차 첫번째  (0) 2024.10.12
KANS 3기 5주차 첫번째  (1) 2024.10.04