brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jun 12. 2023

1. 쿠버네티스 - 시작하세요


이론으로 한번 쭉 읽으세요

실습으로 또 한 번 실행합니다.

내용은  계속 업데이트됩니다.



<1> 쿠버네티스 설치

<2> 용어 설명 - 포드(POD)

<3> 레플리카셋( Replica Set) : 일정 개수의 파드를 유지하는 컨트롤러.

<4> 디플로이먼트(Deployment) : 레플리카셋, 파드의 배포를 관리한다.

<5> 서비스(Service) : 파드를 연결하고 외부에 노출, 로드밸런서

<6> 요청을 외부로 리다이렉트 하는 서비스 : ExternalName

<7> 네임스페이스(Namespace): 리소스를 논리적으로 구분하는 것.

<8> 컨피그맵(Configmap), 시크릿(Secret) : 설정값을 파드에 전달한다.

<9> 시크릿(Secret) - SSH키, 비밀번호 같은 민감 정보를 저장하기 위한 용도

<10> 삭제

<11> 인그레스

<12> 워커노드의 로컬 디렉터리를 볼륨으로 사용 - hostpath

<13> 포드 내의 컨테이너 간 임시 데이터 공유 -  emptyDir

<14>  네트워크 볼륨

<15> PV , PVC 사용하기

<16> 퍼시스템트 볼륨과 외부 스토리지의 다이내믹 프로비저닝 사용 흐름?

<17> 보안을 위한 인증 인가

<18> 쿠버네티스 모니터링




<1> 쿠버네티스 설치


1

그리스어로 조타수라는 뜻.

컨테이너 오케스트레이션 도구.



2

설치 툴?

Minikube - 1개 노드, 기능제한

Docker for Mac/Windows 내장 쿠버네티스- 1개 노드, 기능제한

kops - 특정 클라우드에서 쿠버네티스 설치가능

kubespray - 온프레미스, 클라우드 모두  설치가능

kubeadmin  - 온프레미스, 클라우드 모두  설치가능

EKS, GKE  등 매니지드 서비스


// 제가 많아 쓰는 kops는 온프레미스 설치가 안 되는군요.



3

쿠버네티스 설치할 버전?

너무 오래된 버전이나 최신 버전은 피하자.

1.31 버전 설치한다. (2024년 12월 현재)


Amazon EKS 경우는?

aws경우 최근 5개 버전까지 지원한다.

2023년 6월 현재 1.27 버전까지 지원한다.

낮은 버전은 곧 업그레이드해야 한다.

현재 지원 버전

https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html

1.27

1.26

1.25

1.24

1.23

1.22



4

쿠버네티스 사용은 주로 YAML 파일을 사용합니다.





<2> 용어 설명 - 포드(POD)


1

포드(POD) : 컨테이너를 다루는 기본 단위.

포드는 1개 이상의 컨테이너가 있는 컨테이너의 집합니다.

포드 안에 컨테이너들은 IP가 같다.

// 포드 단위로  IP가 할당된다.



2

kubectl create ns test

// 별도 공간 네임스페이스에서 작업을 하자.

ns는 네임 스페이스

네임 스페이스 이름은 test



3


apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-deployment

  labels:

    app: nginx

spec:

  replicas: 1

  selector:

    matchLabels:

      app: nginx

  template:

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:1.14.2

        ports:

        - containerPort: 80



kubectl apply -f  nginx-deployment.yaml -n test


네임 스페이스 test에 만든다.

디플로이 먼트로 만든다.



디플로이 먼트 - 리플리카세트 - 파드 순으로 구성된다.

이경우 파드를 삭제해도  리플리카세트의 복제 기능. 항상성 유지 기능으로 파드는 다시 생성된다.

단일 파드로 만드는 경우는 삭제하면 삭제된다.

디플로이먼트는 리플리카세트를 관리하고, 배포 관리 업무를 한다.



정리

디플로이먼트는 리플리카세트를 관리하고, 배포 관리 업무를 한다.

리플리카 세트는 파드 수를 유지한다.

파드는 컨테이너를 가지고 있으며, IP를  할당받아 서비스한다.



4

확인?


네임 스페이스 test에의 디플로이먼트가 뭐가 있는지 본다.

네임 스페이스 test에 파드가 뭐가 있는지 본다.

kubectl get deploy -n test

kubectl get po -n test



5

자세히 확인,  ip도 확인

kubectl describe pods xxxxxxxxxxxxxx



6

curl ip



7

kubectl exec  명령으로 포드에 컨테이버에 명형을 전달할 수 있습니다.


kubectl exec  -it  xxxxxxxxxxxpod  bash

ls

exit  --------  pod에서 빠져나옴



8

kubectl  logs   xxxxxxxxxx-pod



9

 삭제

kubectl delete -f xxx.yaml



10

kubectl  get nodes


1/1는  컨테이너가 하나이고 1개가 정상 동작이라는 뜻이다.

2/2는  컨테이너가 2개이고  2개가 정상 동작이라는 뜻이다.

1/2는  컨테이너가 2개이고  1개만 정상 동작이라는 뜻이다.




11

POD , 사이드카 ?


1개의 파드에 웹 컨테이너가 운영 중이다.

로그 수집을 위한 컨테이너를 추가한다.

이 경우  주 기능인 웹 컨테이너, 부가 기능인 로그 수집 컨테이너.

로그 수집 컨테이너를 사이드카( sidecar) 컨테이너라고 부른다.

다른 컨테이너와 네트워크 환경을 공유한다.  

같은 IP를 쓴다.



<3> 레플리카셋( Replica Set) : 일정 개수의 파드를 유지하는 컨트롤러.


1

레플리카셋으로 파드를 2개 만들었다면, 1개를 삭제하더라도 다시 1개가 새로 생성된다.

일정 개수를 유지하는 것이다.


2

YAML 파일은 --를 구분자로 여러 개의 리소스를 정의할 수 있다.


3

노드 장애로 파드를 사용할 수 없다면, 다른 노드에 파드를 다시 생성한다.


4

kubetl get po


5

라벨은 서로 다른 오브젝트를 찾을 때도 사용한다.

예를 들어 레플리카셋이 특정 라벨로 정의된  파드를 생성하는 경우

해당 파드의 개수가 리플리카 항목에 정의된 숫자와 일치하지 않으면 파트 템플릿의 내용으로 파드의 숫자를 맞춘다.


6

파드의 라벨을 1대 삭제하면?

레플리카 세트의 숫자와 일치하지 않으므로 일치하게 하기 위해 파드를 1개 추가 생성한다.

레플리카 세트를 지워도 라벨 삭제된 파드는 남아 있다. 별도로 삭제해야 한다.




<4> 디플로이먼트(Deployment) : 레플리카셋, 파드의 배포를 관리한다.


1

생성과 삭제


kubectl delete deploy  xxxxxxxxx-deployment



2

디플로이먼트를 이용해 애플리케이션 버전을 업데이트해보자.

--record 옵션으로 기록하자.


kubectl apply -f  xxxxxxxxxx.yaml  --record



3

k get pods

파드 이름 확인


kubectl set image deployment xxxxxxxx-deployment nginx:1.11  --record


k get pods

새로운 파드들 등장


4

리스트 확인

k rollout  history  deployment  my-nginx-deploy


k rollout undo deplyment  xxxxxxx-deploy  --to-reviosn=1


k get replicasets



k get replicasets  --show-label



k describe  deploy  xxxxx-deplyment



리소스 정리

k delete deployment, pod, rs --all





실습 내용 보기

링크


실습하기





<5> 서비스(Service) : 파드를 연결하고 외부에 노출, 로드밸런서


1

로드밸런서라고 생각하면 될 거 같다.


2

서비스의 종류?

Cluster IP 타입의 서비스 - 쿠버네티스 내부에서만 파드에 접근하기

NodePort 타입의 서비스 - 서비스를 이용해 파드를 외부에 노출하기

LoadBalancer 타입의 서비스 - 클라우드 플랫폼의 로드밸런서 연동하기  ,  CLB , NLB , ALB


3

트래픽의 분배를 결정하는 서비스 속성 : externalTrafficPolicy


4

externalTrafficPolicy : Cluster (기본값)

LoadBalancer 타입을 사용하면  외부로부터 들어온 요청은 각 노드 중 하나로 보내진다.

그 노드에서 다시 파드 중 하나로 전달된다.

워커노드 a로 들어왔을 때도  파드 b로 전달한다.

불필요한 트래픽 발생.

SNAT 발생하게 되고, 이로 인해 클라이언트의 IP주소가 보존되지 않는다.


5

externalTrafficPolicy : Local

워커노드 a로 들어왔을 때도  파드 a로 전달한다.

워커노드 b로 들어왔을 때도  파드 b로 전달한다.

불필요한 트래픽은 없다.

그러나, 특정 노드에서만 특정  파드 접속이 가능하다.


Local 이 무조건 좋지는 않다.

워커노드 a로 들어왔을 때도  같은 노드에 파드가 2개 존재한다면  a, b로 전달한다. 50%

워커노드 b로 들어왔을 때도  파드 1개 존재한다면   c로 전달한다. 50%

 트래픽이 골고루 분산되지 않을 수 있다.




<6> 요청을 외부로 리다이렉트 하는 서비스 : ExternalName




<7> 네임스페이스(Namespace): 리소스를 논리적으로 구분하는 것.


1

서비스 만들 때 보통, 모니터링 네임스페이스, 프런트엔드 네임스페이스, 밴앤드 네임스페이스 만들어 사용한다.


2

네임스페이스 뭐가 있나 보기

kubectl get namesapce


3

 default name space에 있는 pod 보기

kubectl get pods --namespace default

kubectl get pods --n default

kubectl get pods --n kube-system


kube-system 네임 스페이스에는 시스템 관리 파드들이 존재한다.

그래서, 안 건드리자.


dns서비스도 서비스로 여기에 있다.


kubectl get  service  --n kube-system

kubectl get  svc  --n kube-system



4

특정 라벨 가진 파드 보기


k get pods -l app=webserver



5

k get pods  --all-namespaces

모든 네임스페이스의 파드를 볼 수 있다.


k get pods  -A




<8> 컨피그맵(Configmap), 시크릿(Secret) : 설정값을 파드에 전달한다.



k create configmap  컨피그맵이름  <각종 설정>


k get cm


컨피그맵의 값을 컨테이버의 환경 변수로 사용

컨피그맵의 값을 파드 내부의 파일로 마운트 해서 사용

컴픽스맵의 데이터를 컨테이너의 환경 변수로 가져오기



<9> 시크릿(Secret) - SSH키, 비밀번호 같은 민감 정보를 저장하기 위한 용도



<10> 삭제


k delete deployment --all

k delete pod --all

k delete configmap --all

k delete secret --all





<11> 인그레스


L7이라고 생각하면 되겠다.

유입 경로에 따라  맞는 파드로 라우팅 해준다.


인그레스 ---- 서비스 -- 디플로이먼트 구조이다.


ingress  

k get ingress

k get ing




<12> 워커노드의 로컬 디렉터리를 볼륨으로 사용 - hostpath



<13> 포드 내의 컨테이너 간 임시 데이터 공유 -  emptyDir



<14>  네트워크 볼륨


NFS를 네트워크 볼륨으로 사용하기




<15> PV , PVC 사용하기


1

영구 저장 볼륨.


2

AWS EBS를 퍼시스텐트 볼륨으로 사용하기.



<16> 퍼시스템트 볼륨과 외부 스토리지의 다이내믹 프로비저닝 사용 흐름?


1

스토리지 클래스 미리정의


2

스토리지 클래스 명시해 PVC 생성


3

일치하는 PV가 없으므로,  xxxx라는 이름의 스토리지 클래스에 정의된 속성에 기반해 다이내믹 프로비저닝 수행


4

외부 스토리지가 새롭게 생성되어 PV로서 등록되고, PVC와 바인팅 됨.




<17> 보안을 위한 인증 인가


Service Account와  RBAC





<18> 쿠버네티스 모니터링


프로메테우스 그라파나





감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari