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
# 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
# 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
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 (키알리) 보기 설정
Namespace 를 default 로 선택 후 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 |