안녕하세요. 이 글은 facebook 쿠버네티스 그룹에서 올라온 "쿠버네티스 네트워크 스터디" 4주차 과제내용을 정리했습니다.
스터디 모집글: https://www.facebook.com/groups/k8skr/posts/3202691746679143
1. 과제 주제
가시다님이 조사하신 애플리케이션을 쿠버네티스에 배포하고 ①externalTrafficPolicy설정과 ②Readiness설정입니다. MSA 아키텍처가 관심이 많았지만, 이번 주말에도 일을 할 예정이여서 시간이 적게 든 선택지를 골랐습니다.
2.1 애플리케이션 배포
제가 선택한 선택지는 아래처럼 마리오 게임입니다.
구성은 매우 간단합니다. deployment와 service밖에 없습니다. 저는 mario라는 namespace에 배포했습니다.
kubectl create ns mario
apiVersion: apps/v1
kind: Deployment
metadata:
name: mario
labels:
app: mario
namespace: mario
spec:
replicas: 1
selector:
matchLabels:
app: mario
template:
metadata:
labels:
app: mario
spec:
containers:
- name: mario
image: pengbai/docker-supermario
---
apiVersion: v1
kind: Service
metadata:
name: mario
namespace: mario
spec:
selector:
app: mario
ports:
- port: 80
protocol: TCP
targetPort: 8080
type: NodePort
get all명령어로 배포된 것을 확인했습니다.
kubectl -n mario get all
3. 외부접속
nodeport인 30494포트로 접속했더니 짜잔! 마리오 화면이 나옵니다.
사실, 안들어가질줄 알았습니다. 쿠버네티스가 virtualbox host-network로 설정되어 있었기 때문이죠!. 왜 되지!?.. 시간이 없는 관계로 의문심을 갖고 넘어갔습니다.
4. Readiness 설정
4.1 개요
Readiness설정은 매우 반가운 주제였습니다. 업무하면서 실제 겪었던 문제였거든요!.
링크: https://malwareanalysis.tistory.com/182?category=875341
Readiness는 공식문서(https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#types-of-probe)에서 설명한것 처럼 성공할 때까지 서비스 엔드포인트의 pod IP를 제거하는 특징을 가집니다. 애플리케이션이 처음 실행 될 때 연관관계를 갖게할때 매우 유용하게 사용할 수 있습니다.
4.2 잘못된 설정 배포
엔드포인트가 정말 안보인지 일부로 readinessprobe를 틀리게 설정해보겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: mario
labels:
app: mario
namespace: mario
spec:
replicas: 1
...
spec:
containers:
- name: mario
image: pengbai/docker-supermario
readinessProbe:
tcpSocket:
port: 9999 <-- 잘못된 포트
initialDelaySeconds: 30
periodSeconds: 10
kubectl apply로 수정된 deployment를 배포합니다. 그리고 pod상태를 확인하면 0/1 READY상태를 가집니다. pod는 실행되었지만 probe상태를 넘어가지 못했습니다.
엔드포인트를 확인하는 방법은 여러가지가 있습니다. 가장 편한 endpoint리소스를 조회하여 확인했습니다. mario라는 서비스의 endpoint가 아무것도 없습니다.
kubectl -n mario get ep
4.3 오류 수정
readinessprobe 검사포트를 8080포트로 수정한 후 다시 deployment를 배포합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: mario
labels:
app: mario
namespace: mario
spec:
replicas: 1
...
spec:
containers:
- name: mario
image: pengbai/docker-supermario
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
[챕터 4.2]에는 endpoint가 없었지만 지금은 endpoint가 생겼습니다. endpoint는 pod와 동일합니다.
5. externalTrafficPolicy 설정
현재는 pod가 실행되고 있는 위치와 관계없이 controlplane, worker모든 노드에서 nodeport로 마리오 게임에 접근할 수 있습니다. 상황에 따라 pod가 떠있는 노드로만 pod에 접근하려고 할 때 externalTrafficPolicy설정이 필요합니다.
서비스의 externalTrafficPolicy설정을 Cluster에서 Local로 변경합니다.
kubectl get -n mario svc mario -o yaml | sed -e "s/externalTrafficPolicy: Cluster/externalTrafficPolicy: Local/" | kubectl apply -f -
현재 pod는 woker1번에 실행되고 있습니다. worker1의 IP는 192.168.10.101입니다.
노드 1번으로 접근하면 마리오 게임이 접속됩니다.
하지만, 다른 노드IP로접근하면 접근이 되지 않습니다.
6. nodeport의 문제점
nodeport의 단점은 모든 노드가 의도치 않게 포트를 점유합니다. 아래 그림에서 보이는 것처럼 worker1, worker3번 모두 nodeport를 점유하고 있습니다.
nodeport는 시스템 port 자원을 먹기 때문에 nodeport는 꼭 필요한 경우가 아니라면 사용하지 않는 것을 권장합니다.
'연재 시리즈' 카테고리의 다른 글
쿠버네티스 네트워크 스터디 부록: calicoctl로 pod IP조회 (0) | 2022.02.17 |
---|---|
쿠버네티스 네트워크 스터디 5주차 - coredns 동작이해 (2) | 2022.02.16 |
쿠버네티스 네트워크 스터디 4주차 - service와 kube-proxy iptables모드 (0) | 2022.02.07 |
쿠버네티스 네트워크 스터디 3주차 2편: Calico 모드 (0) | 2022.02.05 |
[중간과제] github action과 argocd 연계 프로젝트를 마치며 (2) | 2022.02.03 |