쿠버네티스 사알짝 맛보기 본문

백앤드 개발일지/웹, 백앤드

쿠버네티스 사알짝 맛보기

giron 2023. 10. 23. 22:35
728x90

본 게시글은 지속적으로 학습하면서 업데이트할 예정입니다.

구조

동작원리

따배쿠

  1. 컨테이너 빌드(nginx, payment, batch …)
  2. 사용자가 docker push hub.example.com/nginx 와 같이 docker hub에 저장해둔다.(사내, docker.com 등)
  3. 이후, 쿠버네티스 명령어를 통해 저장해둔 컨테이너가 실행하도록 한다.(yaml or kubectl 명령어로 실행 가능)
  4. 명령어를 실행하면, 마스터 노드(Control-plane)에 요청이 간다.
  5. 마스터 노드는 API서버가 있어서 쿠버네티스관련 요청을 받는다.
  6. 스케줄러에게 어떤 워커 노드에 nginx를 실행하면 좋을지 물어보면, 스케줄러가 워커 노드의 상태를 보고 적절한 노드를 응답해준다.(REST API서버에게)
  7. API서버는 할당받은 워커 노드 시스템에 있는 kubelet에 요청을 한다.(실행시켜달라고)
  8. 워커 노드의 kubelet은 도커 명령어로 바꿔서 도커 데몬에게 컨테이너 실행 요청을 한다.
  9. 도커 데몬은 도커 허브(hube.example.com)에서 관련 컨테이너가 있는지(ex)nginx) 검색하고 있으면 컨테이너로 실행해준다.
  10. 쿠버네티스는 이렇게 동작되는 컨테이너를 pod라는 단위로 관리하게 된다.

여기까지 컨테이너를 1)빌드하고 2)컨테이너를 저장하고 3)컨테이너를 k8s에서 실행했을때, 동작하는 과정이다.

 

마스터 노드(컴포넌트)

  • etcd
    • key-value 타입의 저장소
    • 워커 노드들에 대한 상태 정보
    • kubelet이라는 데몬으로 (CAdvisor를 통해서) 정보를 수
  • kube-api 서버
    • k8s API를 사용하도록 요청을 받고 요청이 유효한지 검사
  • kube-scheduler
    • 파드를 실행할 노드 선택
  • kube-controller-manager
    • 파드를 관찰하며 개수를 보장

워커 노드 컴포넌트

  • kubelet
    • 모든 노드에서 실행되는 k8s 에이전트
    • 데몬 형태로 동작
  • kube-proxy
    • k8s의 network 동작을 관리
    • iptables rule을 구성
  • 컨테이너 런타임
    • 컨테이너를 실행하는 엔진
    • docker, containerd, runc
     

따배쿠

k8s namespace

클러스터 하나를 여러개의 논리적인 단위로 나눠서 사용

애드온

애드온은 쿠버네티스 리소스(데몬셋디플로이먼트 등)를 이용하여 클러스터 기능을 구현한다. 이들은 클러스터 단위의 기능을 제공하기 때문에 애드온에 대한 네임스페이스 리소스는 kube-system 네임스페이스에 속한다.

대표적으로 core-dns가 있다.

coreDns

쿠버네티스 클러스터 내 POD에서 어떤 도메인을 찾고자 할 때 kube-system 네임스페이스에 실행되고 있는 CoreDNS가 네임서버로 사용된다. 즉, 파드와 서비스를 위한 DNS 레코드를 생성한다.

CoreDNS도 POD로 실행되기 때문에 외부 요청을 받기 위해 Service 오브젝트가 존재한다.

Kube-Proxy

쿠버네티스 네트워크 프록시는 각 노드에서 실행된다. 각 노드의 쿠버네티스 API에 정의된 서비스를 반영한다.

  • 단순한 TCP, UDP 및 SCTP 스트림 포워딩
  • 라운드 로빈 TCP, UDP 및 SCTP 포워딩을 백엔드 셋에서 수행 할 수 있다.

Service

파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법.

단일 진입점이라고 볼 수 있다. 또한 파드는 동적으로 생성, 제거 될 수 있다.

각 파드는 고유한 IP 주소를 갖지만, 디플로이먼트에서는 한 시점에 실행되는 파드 집합이 잠시 후 실행되는 해당 파드 집합과 다를 수 있다. 이러한 부분을 신경쓰지않고 서비스로 추상화 시켜서 관리한다.

Ingress

HTTP나 HTTPS를 통해 클러스터 내부의 서비스를 외부로 노출

기능

  1. 서비스에 외부 URL 제공
  2. 트래픽을 로드밸런싱
  3. SSL 인증서 처리(Ingress에 인증서를 넣은 경우)
  4. virtual hosting 지정

동작 방식

쿠버네티스가 Ingress Controller를 만들어준다. Ingress Rules을 만들어서 접속 url에 따라서 알맞은 Service에 연결해준다.

ex) example.com/auth → auth service

example.com/order → order service

 

Ingreess rule

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
	name: marvel-ingress # 1, 2이 동작해야 실행 가
spec:
	rules:
	-http:
		paths:
		-path: /
			backend:
				serviceName: marvel-service # 1
				servicePort:80
		-path: /pay
			backend:
				serviceName: pay-service # 2
				servicePort: 80

웹서비스 동작

  • kubectl apply -f marvel-home.yaml -f pay.yaml

확인

  • kubectl get deploy, replicationcontroller
  • kubectl get svc

Ingress 동작

만들어둔 yaml파일 실행하기 위해

  • kubectl apply -f ingress.yaml
  • kubectl get svc ingress-nginx-controller

따배쿠

ConfigMap

컨테이너 구성 정보를 한 곳에 모아서 관리

바꾸면 재시작 해줘야 함.

value는 1MB초과 불가

key-value구조

  1. pod에 일부분만 전달 가능
  2. pod에 전체 정보 전달 가능
  3. 볼륨 마운트를 통해 특정 키를 파일처럼 전달

Helm

쿠버네티스를 구성할 때, 사용되는 yaml들을 관리하는 패키지 매니저

기능

  1. 차트를 이용하여 관리
  2. 차트는 .tgz 형태의 file로 관리 가능

구성

  1. Chart: helm 패키지
    1. k8s application, tool, service를 구동하는데 필요한 resource 집합(nginx, redis 등)
  2. Repository: helm chart를 모아두고 공유하는 저장소
    1. helm repo add bitnami https://charts.bitnami.com/bitnami
    2. helm repo list
    3. helm repo remove bitnami

명령어

command 리소스가 존재하지 않을 경우 리소스가 이미 존재할 경우

create 새로운 리소스가 생성됩니다. ERROR가 발생합니다.
apply 새로운 리소스가 생성됩니다. 리소스를 구성합니다.(부분적인 spec을 적용합니다.)
replace ERROR가 발생합니다. 리소스가 삭제된 뒤 새롭게 생성됩니다.

create 명령어는 yaml 파일안에 모든 것을 기술해야 하는 반면 apply 명령어는 부분적인 spec만 주어져도 업데이트가 잘 진행 된다는 뜻입니다.

  • 파드 yaml을 통한 실행
    • kubetcl create -f pod-nginx.yaml
    • kubetcl create -f redis.yaml
  • 파드 종료(삭제)
    • kubectl delete pod nginx-pod
  • 동작중인 파드 수정
    • kubectl edit pod nginx-pod
  • 전체 namespace에서 검색
    • kubectl get pods —all-namespaces
  • 새로운 pod yaml만드는 방법( redis.yaml이름으로 redis라는 pod만들기)
    • kubectl run redis —image=redis123 —dry-run -o yaml > redis.yaml
    • dry run 은 실행하진 않고 실행 되는지만 확인
  • imageError가 발생한다면?
    • kubectl describe pod redis
    • 문제 확인후, kubectl edit pod redis

Reference

https://www.youtube.com/watch?v=5sKkIg7k8nw

https://kubernetes.io/ko/docs/concepts/architecture/nodes/

https://kubernetes.io/ko/docs/

728x90
Comments