본문 바로가기

Cloud Native

[Kubernetes] 쿠버네티스 입문하기

쿠버네티스를 다룬다고 다뤘지만 아직 많이 부족하기에.. 책을 읽어보았는데 역시나 새로 알게된 것들이 많았다.

'쿠버네티스 입문' 이라는 책이었는데 내용도 설명도 좋은 것 같다! (추천)

 

책을 자주 읽어야겠다...

Kubernetes

간단하게 설명하면, 쿠버네티스는 컨테이너 오케스트레이션 플랫폼이다.

 

쿠버네티스를 통해 무중단 서비스를 제공할 수 있다.

  • 점진적 업데이트 기능을 통해 서비스를 중단하지 않고 업데이트 할 수 있다.
  • Self Healing 기능을 통해 특정 컨테이너에 갑작스런 장애가 발생해도 복제 컨테이너를 통해 서비스를 유지할 수 있다.

Vendor Lock In 문제도 해결할 수 있다.

  • vendor lock in = 서로 다른 업체(vendor)의 클라우드 제품 간에 호환 문제가 발생하는 문제
  • 쿠버네티스를 통해 클라우드의 환경을 이전할 수 있다.

파드에 CPU와 메모리 자원 할당하는 법

spec:
	containers:
	-name: kubernetes-simple-pod
	 image: arisu1000/simple-container-app:latest
	 resources:
		requests: 
		 cpu: 0.1 
		 memory: 200M
		limits:
		 cpu: 0.5
		 memory: 1G
		ports:
		- containerPort: 8080

 

  • requests → 최소 자원 요구량으로 이 만큼 자원 여유가 있는 노드가 있어야 스케질링해 실행 가능
  • limits → 자원을 최대로 얼마까지 사용할 수 있는지

컨트롤러 (Controller)

Pod의 설정나 배포를 관리하는 개념으로 여러 종류의 컨트롤러가 있다. (이렇게 많은 종류가 있는지 몰랐다)

 

레플리카세트

  • Replicaset를 이용해 pod을 관리하면 replicas 만큼 pod의 갯수를 유지
apiVersion: apps/v1
kind: ReplicaSet
metadata:
	name: nginx-repplicaset
	spec:
		
		...

	replicas: 3
	selector:
		matchLabels:
			app: nginx-replicaset

 

디플로이먼트

  • 배포 기능을 세분화 한 것으로 실행시켜야 할 파드 개수 유지뿐만 아니라 롤링 업데이트, 롤백 등 앱 배포를 더 세밀하게 관리

데몬세트

  • 클러스터 전체 노드에 특정 파드를 실행할 때 사용하는 컨트롤러로 새로운 노드가 추가되었을 때 데몬세트가 자동으로 해당 노드에 파드를 실행
  • 로그 수집기를 실행하거나 노드를 모니터링하는 파드에 사용됨

스테이트풀세트

  • 상태가 있는 파드들을 관리하는 컨트롤러
  • volume을 사용해서 특정 데이터를 저장한 후 파드를 재시작했을 때 해당 데이터를 유지
  • 여러 개의 파드 사이에 순서를 지정해서 실행되도록 할 수도 있음

  • 실행된 후 종료해야 하는 성격의 작업을 실행시킬 때 사용하는 컨트롤러
  • 특정 개수만큼의 파드를 정상적으로 실행 종료함을 보장

크론잡

  • 잡을 시간 기준으로 관리하도록 생성
  • 지정한 시간에 한번만 잡을 실행하거나 지정한 시간동안 주기적으로 잡을 반복 실행

서비스

파드에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상적인 방법으로 여러 종류가 있다.

 

Cluster IP

apiversion: v1
kind: Service
metadata:
	name: clusterip-service
spec:
	type: ClusterIP
	selector:
		app: nginx-for-svc
	ports:
	- protocol: TCP
		port: 80
		targetPort: 80

 

  • Cluster 내에서 사용하는 IP
  • 예를 들어 클러스터 내에서 pod이 해당 클러스터 IP로 통신하면 해당 pod에 통신하게 되는 것

NodePort

apiversion: v1
kind: Service
metadata:
	name: clusterip-service
spec:
	type: NodePort
	selector:
		app: nginx-for-svc
	ports:
	- protocol: TCP
		port: 80
		targetPort: 80
		nodePort: 30080

 

  • 말 그대로 Node에 Port를 열어서 해당 pod과 연결하는 것

LoadBalancer

  • 쿠버네티스 클러스터를 외부 로드밸런서와 연계해서 설치할 때 사용

Ingress

클러스터 외부에서 안으로 접근하는 요청들을 어떻게 처리할지 정의해둔 규칙 모음

 

Label

  • 롤링 업데이트: 일정 개수씩 배포된 파드를 바꾸면서 배포 (디플로이먼트의 기본 배포 방법)
  • 블루 / 그린: 기존에 실행된 파드 개수와 같은 개수의 신규 파드를 모두 실행한 후 정상적으로 실행됐는지 확인! 트래픽을 한꺼번에 신규 파드 쪽으로 옮김
  • 카나리 (canary): 일부 버전만 신규 파드로 교체해서 버그나 이상은 없는지 반응은 어떤지 확인할 때 유용

ConfigMap

  • 컨테이너에 필요한 환경 설정을 컨테이너와 분리해서 제공하는 기술
  • 개발용과 상용 서비스에서는 다른 설정이 필요할 때가 많은데 이를 위한 것이 컨피그맵
  • 하나를 개발용, 하나를 서비스용으로 설정을 달리하게 할 수 있음