어쩌다 IT
article thumbnail
반응형

리뷰 (Review)

더보기
Application Architecture
  • Monolithic Architecture
    • Application 전체가 하나의 운영체제 프로세스로 실행
    • binary만 설치하면 실행이 가능
    • 변화가 생긴 부분만 수정하기가 어렵기 때문에 유지 보수가 어려움
  • Microservice Architecture
    • 변화가 생긴 부분만 빠르게 빌드 / 테스트 / 배포가 가능
    • resource가 더 필요한 서비스만 별도로 확장이 가능
    • 각각의 기능을 micro service 단위로 나누어서 개발 및 배포하기때문에 구성 요소의 수가 증가
    • 각각의 micro service 간의 종속성 관리가 어려움

 

Kubernetes

  • Kubernetes는 container화 된 Application을 쉽게 배포 및 관리할 수 있는 orchestration 도구

 

Kubernetes 구성 요소

  • 마스터 노드 (Control Plane) - 클러스터 제어 (워커 노드 관리)
  • 워커 노드 - container화 된 Application 실행
  • 클러스터

 

Kubernetes 환경 구성 필수 요소

  • CRI (Container Run-time Inteface)
  • Kubeadm
  • Kubectl
  • Kubelet
  • CNI (Container Network Interface)

Kubernetes 환경 구성

 

KubeAdm을 이용한 Kubernetes 환경 구성

  1. Master node, Worker node에 해당하는 서버 생성 (준비) - Kubernetes 설치 가능 최소 사양 이상으로 구성
    • 스왑의 비활성화, kubelet이 제대로 작동하게 하려면 반드시 스왑을 하지 않도록 설정한다.
      • sudo swapoff -a : swap 기능 off
      • echo 0 > /proc/sys/vm/swappiness : kerner 속성의 swap을 disable, root 사용자로 전환 후 수행
      • sed -e '/swap/ s/^#*/#/' -i /etc/fstab - swap을 하는 파일 시스템을 찾아서 삭제
    • 필수 port 번호 확인 후 포트 개방
  2. Master node, Worker node에 container runtime 환경 구성 - Docker 설치 (40일차에 설치 순서 참고)
  3. kubeadm, kubectl, kubelet 설치 - Master, Worker node에 모두 설치
    • 설치 가이드
    • kubeadm - 클러스터를 부트스트랩 하는 명령
    • kubectl - 클러스터와 통신하기 위한 CLI
    • kubelet - 클러스터의 모든 머신에서 실행되는 Pod와 Container 시작과 같은 작업을 수행하는 component
  4. Master node / Worker node 구성
    • Master node에 cluster 구성
      • kubeadm init <args>
      • 에러 발생 시
        sudo rm /etc/containerd/config.toml
        sudo systemctl restart containerd
    • 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
    • worker node에서 master node에 연결하여 cluster 구성을 완료
      • 해당 값은 kubeadm init 이후에 마지막 2줄에 나오는 값 
      • kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
        --discovery-token-ca-cert-hash sha256:1q2w3e4r5t6y7u8i9o0p
  5. CNI 구성
  6. Worker node에서 Master node 연결
    • sudo kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
      --discovery-token-ca-cert-hash sha256:1q2w3e4r5t6y7u8i9o0p
  7. Kubernetes 환경 구성 확인
    • kubectl get nodes
    • kubectl get nodes -o wide
    • kubectl cluster-info
    • kubectl get pod --all-namespaces

 

실습 환경

더보기

1. AWS EC2 Instance 사용 - 쿠버네티스 최소 사양 맞추기 위해 t2.medium 사용

2. k8s-master Instance 생성 후 Docker 및 Kubernetes 설치

3. k8s-master Instance를 Base로 AMI 생성

 

4. k8s-worker1, k8s-worker2 Instance를 생성한 AMI로 생성

 

5. master, worker1, 2 /etc/hostname 수정

  • master.example.com
  • node1.example.com
  • node2.example.com

6. k8s-master Instace에 EIP 부여 및 모든 인스턴스 재부팅

 

7. k8s-master kubeadm init 시 error 발생

  • error execution phase preflight: [preflight] Some fatal errors occurred:
ubuntu@master:~$ kubeadm init
[init] Using Kubernetes version: v1.25.2
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR IsPrivilegedUser]: user is not running as root
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
ubuntu@master:~$

 

8. 해당 코드 사용하여 문제 해결

sudo rm /etc/containerd/config.toml 
sudo systemctl restart containerd.service
ubuntu@master:~$ sudo kubeadm init
[init] Using Kubernetes version: v1.25.2
[preflight] Running pre-flight checks
	[WARNING SystemVerification]: missing optional cgroups: blkio
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
...
kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
        --discovery-token-ca-cert-hash sha256:1q2w3e4r5t6y7u8i9o0p
ubuntu@master:~$

 

9. kubeadm init 후에 나온 token 저장

cat > token.txt
kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
--discovery-token-ca-cert-hash sha256:1q2w3e4r5t6y7u8i9o0p

 

10. kubectl 명령 사용을 위한 환경 구성

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

 

11. CNI 구성 - Weave-net 이용

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

 

12. kubectl apply -f <CNI 정보> 입력 시 error 발생

  • The connection to the server - did you specify the right host or port?
ubuntu@master:~$ kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
The connection to the server 10.0.1.124:6443 was refused - did you specify the right host or port?
ubuntu@master:~$

 

13. 해당 코드 사용하여 문제 해결

sudo systemctl restart kubelet
ubuntu@master:~$ kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
The connection to the server 10.0.1.124:6443 was refused - did you specify the right host or port?
ubuntu@master:~$ sudo systemctl restart kubelet
ubuntu@master:~$ kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created
ubuntu@master:~$

 

14. k8s-master Instace에서 연결된 node 확인 - Ready로 나오면 정상적으로 연결된 상태

ubuntu@master:~$ kubectl get nodes
NAME                 STATUS     ROLES           AGE   VERSION
master.example.com   NotReady   control-plane   36m   v1.25.2
ubuntu@master:~$

 

15. STATUS가 NotReady로 출력될 시 해당 명령어 재입력

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
ubuntu@master:~$ kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
serviceaccount/weave-net unchanged
clusterrole.rbac.authorization.k8s.io/weave-net unchanged
clusterrolebinding.rbac.authorization.k8s.io/weave-net unchanged
role.rbac.authorization.k8s.io/weave-net unchanged
rolebinding.rbac.authorization.k8s.io/weave-net unchanged
daemonset.apps/weave-net configured
ubuntu@master:~$ kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
master.example.com   Ready    control-plane   39m   v1.25.2
ubuntu@master:~$

 

16. 각 worker node에 저장해두었던 token.txt 값을 입력하여 연결

kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
--discovery-token-ca-cert-hash sha256:1q2w3e4r5t6y7u8i9o0p

 

17. k8s-master Instace에서 연결된 node 확인

kubectl get nodes
ubuntu@master:~$ kubectl get nodes
NAME                 STATUS   ROLES           AGE    VERSION
master.example.com   Ready    control-plane   138m   v1.25.2
node1.example.com    Ready    <none>          22m    v1.25.2
node2.example.com    Ready    <none>          22m    v1.25.2
ubuntu@master:~$

 

Kubernetes Playground

  • https://labs.play-with-k8s.com/
  • Docker에서 제공
  • docker 또는 git 계정으로 로그인
  • 하나의 세션에 대하여 4시간의 사용 시간 부여
  • control-plane, worker node를 직접 구성 - cluster 직접 구성

 

kubeadm

 

kubectl, kubeadm 자동 완성 기능 적용

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

Kubernetes 동작 원리

 

Kubernetes cluster 이해

  • cluster 구성 요소
    • Master node
      • worker node의 가용 리소스 현황을 고려하여 최적의 container 배치  모니터링, container에 대한 효율적인 추적 관리 수행
    • Worker node
      • 각기 다른 목적과 기능으로 세분화된 container들이 실제 배치되는 노드
  • Control Plane Component (Master node)
    • cluster의 master node가 수행하는 각 container 및 worker node 관리는 Control Plane Component를 통해 수행
    • etcd
      • cluster 안의 각 구성 요소들에 대한 정보가 key:value 형태로 저장된 DataBase
      • cluster의 모든 핵심 데이터가 저장되어 있다.
      • kubectl 명령을 통해 조회 가능한 모든 정보는 etcd를 거쳐 오며, 제어 명령을 통해 cluster 변화가 적용되었다면 etcd에 업데이트된다.
    • kube-scheduler
      • Pod를 어느 노드애 배치할지 결정하는 프로세스
      • 실제 해당 노드에 Pod를 배치하는 작업은 kubelet에 의해 수행
      • kube-scheduler는 kube-system namespace에 kube-scheduler-master Pod로 존재
        • kube-scheduler Pod 정의 파일
        • /etc/kubernetes/manifests/kube-controller-manager.yaml
    • API 서버 (kube-apiserver)
      • cluster 각 요소들을 모니터링하며 작업을 수행하도록 해주는 중앙 접근 포인트 역할
      • 유저 인증, 요청사항 검증, 데이터 수신, etcd 업데이트, 스케줄링, kubelet 통신 등 다양한 역할 담당
      • API 서버에 대한 client가 kubectl 명령
      • API는 kube-system namespace에 kube-apiserver-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들이 하나로 패키징 되어있는 형태를 가진다.
      • controller manager는 kube-system namespace에 kube-controller-manager-master Pod로 존재
        • kube-controller Pod 정의 파일
        • /etc/kubernetes/manifests/kube-controller-manager.yaml
  • Node Component (Worker node)
    • 각 node에서 Pod와 container를 구동시키고 관리하기 위해 필요한 요소
    • Kubelet
      • cluster의 각 node에서 Pod 안 container들이 정상 구동되도록 조율하는 agent
      • master node의 scheduler가 Pod를 node에 할당하면, kubelet이 해당 Pod와 container를 배치
      • Pod와 container 상태를 주기적으로 체크하여 결과를 API 서버에 전송하는 역할
      • kubeadm으로 cluster 구축 시 별도로 kubeadm, kubectl과 함께 설치하고 버전을 일치시켜 주어야 한다.
    • Kube-proxy
      • cluster의 각 node에서 구동되는 Kubernetes 네트워크 proxy
      • Service 객체로 들어오는 내/외부 트래픽을 어느 Pod로 포워딩할 것인지에 대한 규칙을 생성하고 관리하는 역할
      • kubeadm은 모든 node에 하나씩 kube-proxy Pod를 daemonset으로 배포
    • Container runtime
      • cluster 내부에 container 이미지를 가져오고 구동시키는 엔진
      • 여러 종류의 container runtime을 지원하기 위해 OCI의 CRI 스펙을 지원하는 container runtime 사용이 가능하게 구성
      • Kubernetes v1.24 이후 Docker 지원이 중단되었지만 containerd와 같은 다른 대체 수단을 지원하고,
        Docker container는 OCI의 CRI 스펙을 준수함으로 동작에는 문제가 없다.

Kubernetes 동작 방식

  • Kubernete는 선언형 API를 사용하는 특징
    • 명령형 API - 일반적으로 사용하는 CLI 명령
    • 선언형 API - 원하는 결과만 제시하고 시스템이 스스로 결과를 얻어주는 API

  • NginX Application을 배포하고 서비스 운영 과정을 Kubernetes에서 동작하는 과정
    1. 개발자 / 운영자는 Nginx Image를 생성
    2. Nignx Image를 public 또는 private registry에 저장
    3. 개발자 / 운영자는 Kubernetes 명령을 통해 container 생성 요청 - 선언형 API 사용

    4. 요청한 명령은 cluster의 control plane (master node) API server에 전달된다.
      → scheduler에 container 생성 요청
    5. scheduler는 node의 상태에 따라 특정 node에 Pod 생성 요청
    6. 해당 node의 kubelet이 scheduler의 요청 정보 수신
    7. 요청 수신 정보에 따라 Pod 생성
    8. container 생성 - 현재 node에 image가 없는 경우 registry로부터 image 다운로드
    9. 생성된 container를 이용하여 Pod 생성
  • 1 ~ 3 - 개발자 / 운영자 host
  • 4 ~ 5 - control plane (master node)
  • 6 ~ 9 - node (worker node)

TIF

이번 주부터 따배쿠를 시작했는데...

안 해봤으면 오늘 Kubernetes 환경 구성하다가 멘탈 털려서 멍 때렸을지도 모르겠다.

EC2 Instance에 xshell로 접속을 하는데 뜬금없이 키 비밀번호를 입력하라는 처음 보는 창이 떴다.

거기부터 꼬여버렸다...

 

강의는 master, worker node들을 만들어서 환경 구성하고 있는데 master node 조차도 제대로 설정하지 못했...지만!

(당황해서 무엇이 문제였는지 모르겠다. 결론은 깔꼼하게 재설치 ^.^)

 

VirtualBox와 playground로 환경 구성하는 것은 다행히도 따배쿠를 통해서 해봤기에,

설치 환경이 VirtualBox에서 AWS EC2로 바뀌었다 뿐이지 다른 건 없어서 금방 따라갈 수 있었다. 

 

 

2022. 10. 07 에 작성된 글입니다.

 

반응형
profile

어쩌다 IT

@jwlish

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!