Skip to content

Instantly share code, notes, and snippets.

@ianychoi
Last active July 27, 2021 18:42
Show Gist options
  • Select an option

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

Select an option

Save ianychoi/f9df7a98d8e8535a78785aa00ce0db28 to your computer and use it in GitHub Desktop.
쿠버네티스 - NodePort 서비스 실습
  • nginx11.yaml 디플로이먼트 (이전 실습에서 배포한) 생성 및 확인
# (옵션) 터미널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/nginx11.yaml
kubectl apply -f nginx11.yaml

# nginx v1.11 의 index.html 내용 변경
for pod in $(kubectl get pod -l app=deploy-nginx11 |awk 'NR>1 {print $1}'); do kubectl exec $pod -- /bin/sh -c "hostname > /usr/share/nginx/html/index.html; echo 'nginx:v1.11 END' >> /usr/share/nginx/html/index.html"; done

# Pod 로그 실시간 확인
kubectl logs -l app=deploy-nginx11 -f
  • svc-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-nodeport
spec:
  ports:
    - name: svc-webport
      port: 9000
      targetPort: 80
  selector:
    app: deploy-nginx11
  type: NodePort
  • 서비스 생성 및 접근 확인
# 서비스 생성
curl -s -O https://raw.githubusercontent.com/gasida/DKOS/main/5/svc-nodeport.yaml
kubectl apply -f svc-nodeport.yaml

# 서비스/IP, 노드포트(NodePort) 확인
kubectl get service svc-nodeport
kubectl get service svc-nodeport -o jsonpath='{.spec.clusterIP}' ; echo
SVC=`kubectl get service svc-nodeport -o jsonpath='{.spec.clusterIP}'`

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

# 노드 포트 정보 확인
kubectl get service svc-nodeport -o jsonpath='{.spec.ports[0].nodePort}'
30000

export NPORT=$(kubectl get service svc-nodeport -o jsonpath='{.spec.ports[0].nodePort}')
echo $NPORT
30000

------------------------------
# [클라이언트]에서 서비스(NodePort)로 접근 - <Nodes IP>:<NodePort>로 접근
MASTER=<마스터 노드 IP>
curl -s $MASTER:30000
for i in {1..100}; do curl -s $MASTER:30000 ; done | sort | uniq -c | sort -nr
while true; do curl -s --connect-timeout 1 $MASTER:30000 ; echo "--------------" ; date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done

# 웹 브라우저에서도 된다!! http://<마스터 노드 IP>:30000
------------------------------

# Pod 로그 실시간 확인 : 접속자 IP가 어떻게 보이는지 확인!
kubectl logs -l app=deploy-nginx11 -f

# 서비스(클러스터IP)로 접근 확인 > 이때 로그 확인(접속자 IP 정보)
for i in {1..30};   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
  • 옵션: "externalTrafficPolicy: local" 을 통해 Client IP 주소가 보존 가능
# Pod 로그 실시간 확인 : 출력 정보 확인
kubectl logs -l app=deploy-nginx11 -f

------------------------------
# [클라이언트]에서 서비스(NodePort)로 접근 - <Nodes IP>:<NodePort>로 접근
NODE1=<노드1 IP>
curl -s $NODE1:30000
for i in {1..100}; do curl -s $NODE1:30000 ; done | sort | uniq -c | sort -nr
while true; do curl -s --connect-timeout 1 $NODE1:30000 ; echo "--------------" ; date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done
# 혹은 웹 브라우저에서 http://<노드1 IP>:30000
------------------------------
  • 현재 서비스 정책 확인
# 정책 확인
kubectl get svc svc-nodeport -o yaml | grep externalTrafficPolicy:
root@k8s-m:~/yaml# kubectl get svc svc-nodeport -o yaml | grep externalTrafficPolicy:
  externalTrafficPolicy: Cluster
  • externalTrafficPolicy 정책 변경
# 정책 변경
kubectl get svc svc-nodeport -o yaml | sed -e "s/externalTrafficPolicy: Cluster/externalTrafficPolicy: Local/" | kubectl apply -f -
혹은
kubectl patch svc svc-nodeport -p '{"spec":{"externalTrafficPolicy":"Local"}}'

# 정책 확인
kubectl get svc svc-nodeport -o yaml | grep externalTrafficPolicy:
  • 디플로이먼트의 파드 3개를 1개로 줄이자! 혹은 마스터노드로 접속해보자!
# 디플로이먼트의 파드 3개를 1개로 줄이기 
kubectl scale deployment deploy-nginx11 --replicas=1

# 파드가 생성되어 있지 않는 노드 확인
root@k8s-m:~/yaml# kubectl get pod -o wide
NAME                              READY   STATUS    RESTARTS   AGE    IP             NODE     NOMINATED NODE   READINESS GATES
deploy-nginx11-656d5495b7-rjbqs   1/1     Running   0          112m   172.16.46.16   k8s-w1

# 위에서는 노드1(k8s-w1)에 파드가 있으므로 노드2 IP주소로 접속을 시도해보자.
# 파드가 생성되어 있지 않는 노드:NodePort 로 접속 시도!
NODE2=<노드2 IP>
curl -s --connect-timeout 1 $NODE2:30000 -v
# 노드1 IP 주소로는 될까?
curl -s --connect-timeout 1 $NODE1:30000 -v
  • 다음 실습을 위해 생성한 오브젝트 전부 삭제
kubectl delete deploy,svc --all
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment