Pod Manual Scaling

cometLEE·2023년 9월 10일
0

kubernetes

목록 보기
1/16

포드 개수 확장에 대해 공부한 내용을 정리한 글입니다.
쿠버네티스 실제로 사용한 적이 없으므로 최대한 하나씩 공부중입니다. 참고해주세요

가능하면 쿠버네티스 공식 홈페이지(https://kubernetes.io/)를 참고하여 진행하였습니다.
또한, 마스터 노드1, 워커노드 2로 실습 진행하였습니다.
🤣🤩😊CKA 자격증 준비 및 쿠버네티스 공부 정리입니다.



1. 쿠버네티스에서 컨텍스트란?


쿠버네티스 클러스터를 관리하는 cli 도구인 kubectl에는 환경을 바꿔가며 클러스터를 관리할 수 있는 context 라는 기능이 존재합니다
쿠버네티스 안에서 context 파일의 내용을 확인 하기 위해선 /root 아래 파일을 위치해 두었던 ~/.kube/config 파일 안에 존재합니다.

이 파일안에는 clusters, users, context, current-context로 나뉘어 설명되는데,

  • clusters는 쿠버네티스 클러스터의 정보
  • users는 클러스터에 접근할 유저의 정보이고 환경마다 필요한 값들이 다릅니다.
  • context는 cluster와 user를 조합해서 생성된 값입니다.
  • current-context는 현재 사용하는 context를 지정하는 부분입니다.
    실제로 쿠버네티스 클러스를 관리하고 있는 context입니다.

context 변경 명령어

kubectl config use-context [context이름]

context 조회 명령어

kubectl config get-contexts

하지만, 저희 스터디에서는 따로 수정하지 않았으므로 아래와 같이 출력됩니다.


위의 내용처럼 각자의 환경에 맞는 클러스터를 사용할 수 있으며, 보안성을 높일 수 있습니다. (kubeadm을 통해 설치하면 /etc/kubernetes에 pki파일이 생성되는 것을 확인 할 수 있었습니다. pki 인증서 및 요구사항

이해한 것이 맞다면, api서버가 워커노드에 있는 kubelet과 통신하기 위해
pki인증서를 사용하여 통신한다는 것입니다.

2. deployment scale 확장

deploy 확장에 들어가기 앞서, 우리는 쿠버네티스 구성에 대해 알아야 할 필요가 있습니다.

api-server를 당담하는 control-plane(kube-controller-manager) 아래 워커노드들이 존재하며, 그 노드안에는 여러개의 pods들이 할당 됩니다. 쿠버네티스의 가장 기본적인 구성요소인 pod 안에는 컨테이너가 존재하게 됩니다. pod에는 보통 하나의 컨테이너가 동반되지만, 때에 따라서 도움을 주는 서브 컨테이너가 들어가기도 합니다.

어째서 우리는 포드를 사용하는걸까요? 🤣 곧 작성 하겠습니다..

1) 노드에 pod를 할당하기

pod를 노드에 할당하는 방법은 2가지 입니다.

  1. command-line(커맨드 방식)
  2. yaml, Json 파일을 지정하여 manifest 파일 지정 및 사용

1-1 kubectl run

kubectl run [생성 할 pod 이름][--image=이미지 이름]
이미지 이름에 맞는 값이 레지스트리에 존재한다면 가져와 사용합니다.

1-2 kubectl apply -f (파일명 or 외부링크)

yaml 파일을 지정하는 방식은 정해져 있는데, 이 파일은 들여쓰기가 매우매우 중요합니다!!!
왜냐하면, tab키를 사용하거나, 들여쓰기 문법이 틀릴경우 에러가 발생하기 때문입니다. 아래는 manifest파일의 api 구성입니다.

참고자료:Jen's Space

manifest파일을 생성했다면, kubectl apply -f [매니페스트 파일]을 입력하여 pod를 할당합니다.

!!! pod를 어디에 할당하지?

pod는 노드안에 존재하신다는 사실은 모두 아실 겁니다. 하지만, 컨트롤플레인에서 할당한 pod는 어느 노드로 실행되는가?에 대해서 알지 못하였습니다.

검색해본 결과, 여러가지 방법이 존재했습니다.

pod 원하는 node에 할당하는 방법

  1. nodeName
  2. label
  3. node selector
    (Node affinity) --> 잠깐 확인했는데 매우 어려움
  4. Pod topology spread constraints

하지만, 저는 위에 방법들을 사용하지 않고, manifest파일안에 nodeName이라는 속성을 지정하여 노드를 선택할 수 있도록 만들어 보았습니다.

이 개념은 매우 간단했습니다. 컨테이너 부분인 spec아래 nodeName: 노드이름을 지정함으로서 가르킬 노드를 지정할 수 있어서 편했습니다.

containers와 같은 빈칸으로 진행해주어야 합니다.
위의 내용처럼 작성 후, apply 해보겠습니다.

아주 잘 할당 된 것을 확인할 수 있었습니다.

kubectl delete pod nginx를 통해 삭제해주세요.

이제 먼길을 돌아왔지만, deployment를 사용해 보겠습니다.

2) 노드에 다른방식으로 pods 할당하기

pod를 사용하는 방법 외 노드에 워크로드를 구성하기 위해서는 2가지 방법이 존재합니다.

  1. Replica Set
  2. Deployments

내용이 너무 많은 관계로 왜 두 가지를 나누어서 사용하는지는 따로 작성하겠습니다.

간단하게, deployments를 사용하는 이유는 replicas변수를 통한 pod auto-scaling뿐 아니라, 새로운 버전의 pod로 업데이트도 가능하고, rollback도 가능하기 때문입니다.

위에 pod를 작성한 것처럼 manifest파일을 작성할 것입니다. 하지만, 바뀌는 점은
pod는 컨테이너를 포함하기 때문에 spec에 컨테이너 값이 들어갔지만, deployment는 pod들을 관리하기 때문에 deployment값 설정 후 아래에 pod에 대한 내용이 들어갑니다.
쉽게 이해하려고 한다면 함수안에 함수가 있는 것일까요??

참고자료: Jen's Space

비교하기 쉽게 제가 따로 구별해보겠습니다.

빨간색 사각형이 존재하는 부분이 pod manifest의 spec에 대한 내용입니다.
그리고 눈에 띄게 달라지는 점은 apiVersion이 apps/v1로 변경되었습니다.


실제로 동작해보겠습니다. 제가 작성한 manifest파일은 이렇습니다.

잘 생성되었네요. 과연 node02에 할당이 되었을까요??

kubectl describe node node02

이렇게 잘 실행해 보았습니다. 여기서 pod를 하나 지워보겠습니다.

이렇게 deployment는 HPA(수평형 포드 자동 확장)을 지원합니다.
더 자세하게는 내용이 많습니다


2-1 kubectl scale명령어를 통해 replicas 변수값 설정

이제 문제에 있는 scale 명령어를 사용해보겠습니다.

이를 통해서 pod를 8개로 확장해보았습니다.



스터디 준비 후기

와.. 막상 간단한 주제를 선택하여 준비했지만 사전지식이 없다보니까 많이 헤멘 것 같습니다. 환경설정도 다시 세팅하고 ... 쿠버네티스는 정말 어렵습니다. 하지만 이렇게 준비를 하면서 발표를 준비하다보니 새삼 많은 것을 알게 되는 것 같습니다.

앞으로도 많은 내용을 실습하면서 따로 발표하지 않더라도 직접 해보면서 글로 남기려고 노력하겠습니다. 파이팅!

profile
server, kubernetes에 관심이 많이 있습니다

0개의 댓글