공부하기싫어
article thumbnail

이번 실습에서 구성한 환경은 잦은 에러때문에 추후에 환경 구성에 수정이 있었음

Kubernetes 환경 구성

  • kubeadm 을 이용한 kubernetes 환경 구성

1. Master node (Control plane), Worker node 에 해당하는 서버 생성 (준비)  - kubernetes 설치 가능 최소 사양 이상으로 구성

- 스왑의 비활성화, kuberlet이 제대로 동작하게 하려면 반드시 스왑을 사용하지 않도록 설정한다.

sudo swapoff -a : swap 기능 off

echo 0 > /proc/sys/vm/swappiness : kernel 속성의 swap을 disable, root 사용자로 전환 후 수행해야함

sed -e '/swap/s/^#*/#/' -i /etc/fstab : swap을 하는 파일시스템을 찾아 삭제함

swapoff -a

- 필수 port 번호 확인 후 포트 개방

https://kubernetes.io/ko/docs/reference/ports-and-protocols/

aws inbound sg allow

2. Master node, Worker node 에 container runtime 환경 구성 - Docker 설치

참고 - https://docs.docker.com/engine/install/ubuntu/#set-up-the-repository

 

Install Docker Engine on Ubuntu

 

docs.docker.com

 

$ sudo apt-get update

 

 $ sudo apt-get install \

    ca-certificates \

    curl \

    gnupg \

    lsb-release

 $ sudo mkdir -p /etc/apt/keyrings

 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg |       $ sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

 $ echo \

  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \

  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 $ sudo apt-get update

 $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

 $ sudo docker version

 

$ cat <<EOF | sudo tee /etc/docker/daemon.json

{

  "exec-opts": ["native.cgroupdriver=systemd"],

  "log-driver": "json-file",

  "log-opts": {

    "max-size": "100m"

  },

  "storage-driver": "overlay2"

}

EOF

$ sudo systemctl enable --now docker

 

3. kubeadm, kubectl, kubelet 설치 - Master node / Worker node 에 모두 설치 - kubernetes 설치

- kubeadm : 클러스터를 부트스트랩 하는 명령

- kubectl : 클러스터와 통신하기 위한 CLI

- kubelet : 클러스터와 모든 머신에서 실행되는 pod와 container 시작과 같은 작업을 수행하는 component

# apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치

$ sudo apt-get update

$ sudo apt-get install -y apt-transport-https ca-certificates curl

# 구글 클라우드의 공개 사이닝 키를 다운로드

$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# 쿠버네티스 apt 리포지터리를 추가

$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정

$ sudo apt-get update

$ sudo apt-get install -y kubelet kubeadm kubectl

$ sudo apt-mark hold kubelet kubeadm kubectl

# 설치 확인

$ kubeadm version

$ kubelet --version

$ kubectl version
설치/버전 확인
  • Kubernetes cluster 구성

1. master node - cluster를 구성하기 위한 작업

- master node에 클러스터 구성

kubeadm init [args] - 관리자 권한으로 실행

- cluster 구성이 성공하면 사용자가 kubectl 명령 사용을 위한 환경 구성

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

- wocker node 에서 master node 에 연결하여 cluster 구성을 완료

- kubeadm init 명령 수행 후 나오는 join 안내 에서 join key 복사 후 worker node 에 사용

wocker1 to control plane
wocker2 to control plane
kubectl get nodes

 

# kubeadm init 수행시 error 발생시 해결 방안 - container runtime 실행 오류

$ sudo rm /etc/containerd/config.toml

$ sudo systemctl restart containerd

# The connection to the server 10.0.1.61:6443 was refused - did you specify the right host or port? -> 이와 같은 메시지 출력은 연결 error, kubelet 재시작

$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet



 

2. CNI 구성 - cluster에 CNI add-on

- kubectl apply [CNI 정보]

- weave net plug-in add-on

참고 - https://www.weave.works/docs/net/latest/kubernetes/kube-addon/#install

 

3. cluster 구성 확인

kubectl get nodes

kubectl get nodes -o wide

 

4. kubernetes 환경 구성 확인

  • kubectl get nodes
  • kubectl get nodes -o wide
  • kubectl cluster-info
  • kubectl get pod --all-namespaces

 

kubectl 명령어 자동완성 bashrc 에 추가

명령어 자동완성 - tab

 

 

 

  • Kubernetes playground

https://labs.play-with-k8s.com

 

Play with Kubernetes

Play with Kubernetes is a labs site provided by Docker and created by Tutorius. Play with Kubernetes is a playground which allows users to run K8s clusters in a matter of seconds. It gives the experience of having a free Alpine Linux Virtual Machine in bro

labs.play-with-k8s.com

docker 에서 제공

docker hub 계정으로 로그인

하나의 세션에 대해서 4시간의 사용 시간 부여

control-plane, worker node 를 직접 구성 - cluster 직접 구성

kubernetes playground
playground 에서 ctrl+c/v

 

 

  • kubeadm

https://kubernetes.io/ko/docs/reference/setup-tools/kubeadm/

kubeadm init - cluster 초기화

- https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/

 

kubeadm join - cluster에 연결- https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/

 

kubeadm 명령어 자동완성 기능 적용

  • source <(kubeadm completion bash)
  • echo "source <(kubeadm completion bash)" >> ~/.bashrc

 

 

 

 

kubernetes 동작 원리

  • kubernetes cluster 이해

  • cluster 구성 요소

Master node - control plane

- 대규모 container를 운영하려면 worker node 의 가용 리소스 현황을 고려하여 최적의 container 배치 및 모니터링, container 에 대한 효율적인 추적 관리 수행

 

Worker node

- 각기 다른 목적과 기능으로 세분화된 컨테이너들이 실제 배치되는 노드

 

 

 

  • Control Plane Component (master node)

cluster의 master node가 수행하는 각 container 및 worker node 관리는 control plane component 를 통해 수행됨

 

etcd

- cluster안의 각 구성 요소들에 대한 정보가 key:value 형태로 저장된 db

- cluster의 모든 핵심 데이터가 저장되어있음

- kubectl 명령을 통해 조회 가능한 모든 정보는 etcd를 거쳐 오며, 제어 명령을 통해 cluster 변화가 적용되었다면 etcd에 업데이트됨

 

scheduler (kube-scheduler)

- pod를 어느 노드에 배치할지 결정하는 프로세스

- 실제 해당 노드에 pod를 배치하는 작업은 kubelet에 의해 수행됨

- kube-scheduler 는 kube-system namespace에 'kube-controller-scheduler-master' pod로 존재

   - kube-scheduler pod 정의 파일 : /etc/kubernetes/manifests/kube-scheduler.yaml

 

API 서버 (kube-apiserver)

- cluster 각 요소들을 모니터링하며 작업을 수행하도록 해주는 중앙 접근 포인트 역할

- 유저인증, 요청사항 검증, 데이터 수신, etcd 업데이트, 스케줄링, kubelet 통신 등 다양한 역할 담당

- kubectl : api서버를 통한 client가 내리는 명령

- api는 kube-system namespace 에 'kube-controller-scheduler-master' pod로 존재함

   - kube-apiserver pod 정의 파일

   - /etc/kubernetes/manifests/kube-apiserver.yaml

 

controller manager (kube-controller-manager)

- cluster 안에서 구동되는 아양한 리소스들을 모니터링하며 이들이 원활하게 동작하도록 관리하는 프로세스

- node, pod, replicaSet, deployment, StatefulSet, daemonSet, service account, Cronjob, Namespace 등 각 구성 요소들을 관리하는 control 들이 하나로 패키징 되는 형태를 가짐

  • API는 kube-system 네임스페이스에 kube-controller-controller-manager-master Pod로 존재
  • kube-apiserver Pod 정의 파일 
  • /etc/kubernetes/manifests/kube-controller-manager.yaml

 

 

 

  • Node Component (worker node)

각 node 에서 pod와 container를 구동시키고 관리하기 위해 필요한 요소

 

kubelet

- cluster의 각 node에서 pod 안 container들이 정상 구동되도록 조율하는 agent

- master node 의 scheduler가 node를 pod에 할당하면, kubelet이 해당 pod와 container를 배치함

- pod와 container 상태를 주기적으로 체크하여 결과를 api 서버에 전송하는 역할

- kubeadm으로 cluster 구축 시 kubelet은 포함되지 않으므로 별도로 kubeadm, kubectl과 함께 설치하고 버전을 맞춰줘야 한다.

 

kube-proxy

- cluster의 각 node에서 구동되는 kubernetes 네트워크 proxy

- kubeadm은 모든 node에 하나씩 kube-proxy pod를 daemonset 으로 배포함

 

container runtime

- cluster 내부에 container 이미지를 가져오고 구동시키는 엔진

- 여러 종류의 container runtime을 지원하기 위해 OCI 의 CRI 스펙을 지원하는 container runtime 사용이 가능하게 구성

- kubernetes v1.24 이후 docker 지원을 중단했음. - container 와 다른 대체 수단을 지원하고 docker container는 OCIdml CRI 스펙을 준수함으로 동작하는데는 문제 없다고 함

 

 

 

 

 

 

  • kubernetes 동작 방식

kubernetes는 선언형 API를 사용하는 특징

- 명령형 api : 일반적으로 사용하는 CLI 명령

- 선연형 api : 원하는 결과만 제시하고 시스템이 스스로 결과를 얻어주는 API

nginx 배포 예시

  • nginx application을 배포하고 서비스 운영 과정을 kubetnetes에서 동작시키는 과정

- 개발자/운영자 host

1. 개발자/운영자는 nginx image 생성

2. nginx image를 public 또는 private registry 에 저장함

3. 개발자/운영자는 kubernetes 명령을 통해 container 생성 요청 - 선언형 API 사용

 

- cluster - control plane (master node)

4. 요청한 명령은 cluster의 control plane에 API server에 전달됨 -> scheduler에 container 생성 요청

5. scheduler는 node의 상태에 따라 특정 node에 pod 생성 요청

 

- cluser - worker node

6. 해당 node의 kubelet이 scheduler의 요청 정보 수신

7. 요청 수신 정보에 따라 pod 생성

8. container 생성 - 현재 node에 image가 없는 경우 registry로 부터 image 다운로드

9. 생성된 container 를 이용하여 pod 생성