- 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