쿠버네티스를 공부하기 위해서는 먼저 도커를 알아야 한다. 도커로는 하나의 머신에서 가상화 기술을 활용하여 컨테이너를 생성하고 서비스할 수 있게 해주었다. 하지만 대규모 서비스에서는 하나의 머신으로는 택도 없다. 그렇다면 이렇게 많은 수의 머신에서 워크로드를 분산하려면 어떻게 해야할까? 이 니즈에서 나온 것이 쿠버네티스라고 할 수 있다. 즉, 쿠버네티스는 다수의 컨테이너를 오케스트레이션 하기 위한 도구이다.
위의 그림처럼 하나의 쿠버네티스 클러스터 안에 여러 노드가 존재한다. 노드의 종류는 마스터 노드
, 워커 노드
가 있다.
애플리케이션을 쿠버네티스에 배포하는 것 = 마스터에 애플리케이션 컨테이너를 구동하라고 지시하는 것
하나의 노드에는 파드들로 이뤄진다. 파드는 컨테이너들의 그룹을 나타내는 쿠버네티스의 추상적 개념이다. 파드는 쿠버네티스 플랫폼 상에서 최소 단위로 취급된다. 만약 컨테이너들이 서로 밀접하게 결합되어 있고 디스크와 같은 자원을 공유해야 한다면 오직 하나의 단일 파드로 노드가 이뤄져야 한다.
인그레스는 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이다. 위의 그림처럼 외부 연결에 대한 URL을 제공하고 트래픽 부하를 분산하고 SSL/TLS를 종료하고 dns 서비스를 할 수 있게 해준다.
배포하기 위한 디플로이먼트 파일(.yaml)을 생성한다. 디플로이먼트 파일에서는 디플로이먼트의 이름이나 몇개의 파드로 구성할지 어떤 이미지를 띄울지 등등을 설정할 수 있다.
쿠버네티스 공식 사이트에 올라온 예시는 다음과 같다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
위의 파일을 이용해서 디플로이먼트를 생성해서 배포해보고 배포한 파드에 접속해보자.
# 디플로이먼트 파일 실행
kubectl apply -f (디플로이먼트 파일.yaml)
# 디플로이먼트 확인
kubectl get deployments
# 포트 포워딩 이용해서 접속하게 설정
kubectl port-forward (파드 이름) 8080
# 파드 셸에 접속
kubectl exec -it (파드 이름) -- sh
# 디플로이먼트 삭제
kubectl delete -f (디플로이먼트 파일.yaml)
kubectl delete deploy (디플로이먼트 이름)
위에서는 쿠버네티스로 애플리케이션을 배포한 한개의 파드에 접속을 해봤지만 해당 클러스터에 접속하려면 어떻게 해야 할까? 그러려면 크게 3가지 단계를 거쳐야 한다.
# 서비스 생성
kubectl apply -f (서비스 파일.yaml)
# 생성된 서비스 확인
kubectl get service
# 인그레스 생성
kubectl apply -f (인그레스 파일.yaml)
# 생성된 인그레스 확인
kubectl get ingress
# 로드 밸런서 서비스 생성
kubectl apply -f (로드 밸런서 서비스 파일.yaml)
# 생성된 로드 밸런서 서비스 확인. 여기서 외부 IP 확인 가능
kubectl get -n ingress-nginx service
# 위에서 확인한 외부 IP로 접속하면 외부 노출 성공!
서비스 파일, 인그레스 파일, 로드 밸런서 서비스 파일 예시는 다음과 같다!
# 서비스.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
# 인그레스.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80
# 로드 밸런서 서비스.yaml
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example
ports:
- port: 8765
targetPort: 9376
externalTrafficPolicy: Local
type: LoadBalancer
👍