쉽게 배우는 쿠버네티스 - 03
in Devops on Kubernetes
디플로이먼트란?
Kubernetes(줄여서 K8S)의 디플로이먼트(Deployment)는 애플리케이션을 컨테이너화하여 Kubernetes 클러스터에 배포하고 관리하는 데 사용되는 주요 오브젝트 중 하나이다. 디플로이먼트를 사용하면 컨테이너화된 애플리케이션의 배포, 업데이트, 롤백, 확장 및 자가 치유(self-healing) 기능을 간편하게 관리할 수 있다.
주요 기능
- 배포 및 업데이트 관리: 디플로이먼트를 통해 애플리케이션의 새로운 버전을 손쉽게 배포하고, 지속적인 배포 전략(예: 롤링 업데이트)을 사용할 수 있다. 이를 통해 서비스 중단 없이 새로운 버전으로 업데이트할 수 있다.
- 롤백: 만약 새로운 버전의 애플리케이션에 문제가 발생하면, 이전 버전으로 손쉽게 롤백할 수 있다.
- 확장(Scaling): 애플리케이션의 트래픽이 증가하면 디플로이먼트를 통해 손쉽게 파드의 개수를 늘릴 수 있습니다. 반대로, 트래픽이 줄어들면 파드의 개수를 줄일 수 있다.
- 자가 치유(Self-Healing): 디플로이먼트는 실행 중인 파드가 장애가 발생하거나 문제가 생길 경우, 이를 감지하고 자동으로 새로운 파드를 생성해 정상 상태를 유지한다.
- Pod 템플릿 관리: 디플로이먼트는 파드를 정의하는 템플릿을 포함하며, 이를 통해 파드의 컨테이너 이미지, 환경 변수, 볼륨, 네트워크 설정 등을 관리한다.
디플로이먼트 노출하려면 노드포트 사용
- 노드 포트로 노출
root@cp-k8s:~# k expose deployment deploy-nginx --type=NodePort --port=80
service/deploy-nginx exposed
root@cp-k8s:~#
root@cp-k8s:~#
root@cp-k8s:~#
root@cp-k8s:~# k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
deploy-nginx NodePort 10.103.27.106 <none> 80:31743/TCP 6s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h
- 뭐가 되었든 로드벨런서 타입으로 노출시키는 것이 유리하다.
노드포트보다 로드벨런서가 좋은점
- 노드포트는 노드의 아이피를 알려줘야한다. → 보안상 좋지 않다.
- 로드벨런서는 버츄얼 IP처럼 대표하는 IP를 만들어서 알려줄 수 있다
- 노드포트를 공개하는 부담이 없다.
- 로드벨런서는 가야되는 경로를 최적화해준다.
디플로이먼트를 로드벨런서로 배포
- 로드벨런서를 사용하면 노드포트를 외부에 노출시킬 필요가 없다.
- 로드벨런서가 최선의 방법이다.
- 디플로이먼트는 레플리카셋은 이용해서 파드의 수를 조정한다.
- 기본적으로는 하나가 배포가 되지만 스캐일을 이용해서 그 갯수를 정할 수 있다.
쿠버네티스에서 서비스란? SVC
- 집구조를 생각해보면 안방,서재,책방 이런 곳에 갈라면 거실을 거쳐야 한다.
- 거실같은 곳이 서비스라고 생각하면 된다.
- 다른 어떤곳을 넘어가기 위해 항상 거쳐야 하는 곳이다.
배포된 파드 삭제하기
root@cp-k8s:~# k delete svc chk-hn
service "chk-hn" deleted
root@cp-k8s:~#
root@cp-k8s:~#
root@cp-k8s:~# k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
deploy-nginx NodePort 10.99.97.20 80:32473/TCP 70m
kubernetes ClusterIP 10.96.0.1 443/TCP 91m
root@cp-k8s:~# k delete svc deploy-nginx
service "deploy-nginx" deleted
root@cp-k8s:~# k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 91m
root@cp-k8s:~# k delete deployment chk-hn
deployment.apps "chk-hn" deleted
root@cp-k8s:~# k delete deployment deploy-nginx
deployment.apps "deploy-nginx" deleted
root@cp-k8s:~# k delete pod nginx
root@cp-k8s:~# k delete -f ~/_Lecture_k8s_starter.kit/ch3/3.4/metallb.yaml
namespace "metallb-system" deleted
serviceaccount "controller" deleted
serviceaccount "speaker" deleted
clusterrole.rbac.authorization.k8s.io "metallb-system:controller" deleted
clusterrole.rbac.authorization.k8s.io "metallb-system:speaker" deleted
role.rbac.authorization.k8s.io "config-watcher" deleted
role.rbac.authorization.k8s.io "pod-lister" deleted
role.rbac.authorization.k8s.io "controller" deleted
clusterrolebinding.rbac.authorization.k8s.io "metallb-system:controller" deleted
clusterrolebinding.rbac.authorization.k8s.io "metallb-system:speaker" deleted
rolebinding.rbac.authorization.k8s.io "config-watcher" deleted
rolebinding.rbac.authorization.k8s.io "pod-lister" deleted
rolebinding.rbac.authorization.k8s.io "controller" deleted
daemonset.apps "speaker" deleted
deployment.apps "controller" deleted
configmap "config" deleted
Reference
https://www.redhat.com/ko/topics/containers/what-is-kubernetes