Skip to content

Instantly share code, notes, and snippets.

@ianychoi
Created July 27, 2021 15:44
Show Gist options
  • Select an option

  • Save ianychoi/bd01fc25b8deabd6271952c27d4b670b to your computer and use it in GitHub Desktop.

Select an option

Save ianychoi/bd01fc25b8deabd6271952c27d4b670b to your computer and use it in GitHub Desktop.
쿠버네티스 - Cluster IP 실습
  • pod.yaml 파일 내용 참고
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-cndk
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deploy-websrv
  template:
    metadata:
      labels:
        app: deploy-websrv
    spec:
      containers:
      - name: cndk-websrv
        image: gcr.io/google-samples/kubernetes-bootcamp:v1
        ports:
        - containerPort: 8080
  • 파드 생성 후 확인
# (옵션) 터미널1
watch -d 'kubectl get pods,svc,ep -o wide'
혹은
watch -d 'kubectl get pods,svc -o wide'

# (옵션) 노드
watch -d 'docker ps --format "table {{.Image}}\t{{.Status}}\t{{.Names}}" | grep -v pause'

# 디플로이먼트 생성
curl -s -O https://raw.githubusercontent.com/gasida/DKOS/main/5/pod.yaml
kubectl apply -f pod.yaml

# Pod IP 주소만 출력
kubectl get pod -o wide -l app=deploy-websrv |awk 'NR>1 {print $6}'

# Pod Name만 출력
kubectl get pod -l app=deploy-websrv -o=name

# Pod IP마다 curl 접속 : 출력 정보 확인
for pod in $(kubectl get pod -o wide -l app=deploy-websrv |awk 'NR>1 {print $6}'); do curl -s $pod:8080; done

# Pod 로그 실시간 확인 : 출력 정보 확인
kubectl logs -l app=deploy-websrv -f
  • 마스터 노드(컨트롤 플레인)에 서비스(Cluster IP 타입) 접속 테스트를 위한 파드를 배포

  • podnet.yaml : 아래 nodeName 은 각자 실제 쿠버네티스 (k3s or k8s) 마스터 노드 이름으로 변경을 해야 합니다! ⇒ 노드네임 문제 발생 시 # 주석 처리 후 진행!

    • nodeName 확인 방법

      # kubectl get node 에서 출력되는 NAME: ROLES에 "master"가 적힌 노드에 대한 NAME 부분입니다. 여기서는 k8s-master-az
      NAME              STATUS   ROLES                  AGE   VERSION
      k8s-master-az     Ready    control-plane,master   21d   v1.21.1
apiVersion: v1
kind: Pod
metadata:
  name: netshoot-pod
spec:
  nodeName: k8s-m
  containers:
  - name: netshoot-pod
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  • 생성 및 확인 : Shell 접속 후 Cluster IP 로 접속 테스트
# yaml 파일 다운로드
curl -s -O https://raw.githubusercontent.com/gasida/DKOS/main/5/podnet.yaml

# 노드 이름 변경: 아래 부분은 k3s 환경에서 실습할 때 k8s-m을 k3s-m으로 바꾸는 내용입니다. (sed 사용시 따옴표를 사용해야 변수가 동작합니다!)
MASTER_NODE_NAME=k3s-m
sed -i "s/k8s-m/$MASTER_NODE_NAME/g" podnet.yaml

# 파드 생성
kubectl apply -f podnet.yaml

# Shell 접속
kubectl exec -it netshoot-pod -- zsh

# curl 로 파드 IP 접속
curl <Pod IP>:8080
  • svc-clusterip.yaml : 'type: ClusterIP' 생략 가능, default 값이 ClusterIP
apiVersion: v1
kind: Service
metadata:
  name: svc-clusterip
spec:
  ports:
    - name: svc-webport
      port: 9000
      targetPort: 8080
  selector:
    app: deploy-websrv
  type: ClusterIP
  • 서비스 생성 및 접근 확인
# 서비스 생성
curl -s -O https://raw.githubusercontent.com/gasida/DKOS/main/5/svc-clusterip.yaml
kubectl apply -f svc-clusterip.yaml

# 서비스/IP 확인
kubectl get service svc-clusterip
kubectl get service svc-clusterip -o jsonpath='{.spec.clusterIP}' ; echo

# 엔드포인트 IP 확인
kubectl get endpoints svc-clusterip

# 모든 노드에서 SVC IP 로 접근 가능
curl -s <SVC IP>:9000
root@k8s-m:~# curl -s 10.97.253.42:9000

# Pod 로그 실시간 확인
kubectl logs -l app=deploy-websrv -f

------------------------------
# [netshoot-pod Shell] 에서 실행
# 예시) SVC=10.102.195.176
SVC=<SVC IP>
curl $SVC:9000
for i in {1..100}; do curl -s $SVC:9000 ; done | sort | uniq -c | sort -nr
while true; do curl -s --connect-timeout 1 $SVC:9000 ; echo "--------------" ; date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done
------------------------------
  • 파드 장애 발생시 동작 확인: SVC 로 접속 시도 중 파드 1개를 삭제 시 동작 확인
# 터미널1
watch -d 'kubectl get pods,svc,ep -o wide'

------------------------------
# [netshoot-pod Shell] 에서 실행
kubectl exec -it netshoot-pod -- zsh

# 예시) SVC=10.102.195.176
SVC=<SVC IP>
while true; do curl -s --connect-timeout 1 $SVC:9000 ; echo "--------------" ; date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done
------------------------------

# 파드 1개 삭제 > 이후 동작 확인
kubectl delete pod deploy-cndk-#-#

# [netshoot-pod Shell] 빠져나오기
exit
  • 다음 실습을 위해 생성한 오브젝트 전부 삭제
kubectl delete deploy,svc,pods --all
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment