리뷰 (Review)
- 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 환경 구성
- 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 번호 확인 후 포트 개방
- 스왑의 비활성화, kubelet이 제대로 작동하게 하려면 반드시 스왑을 하지 않도록 설정한다.
- Master node, Worker node에 container runtime 환경 구성 - Docker 설치 (40일차에 설치 순서 참고)
- kubeadm, kubectl, kubelet 설치 - Master, Worker node에 모두 설치
- 설치 가이드
- kubeadm - 클러스터를 부트스트랩 하는 명령
- kubectl - 클러스터와 통신하기 위한 CLI
- kubelet - 클러스터의 모든 머신에서 실행되는 Pod와 Container 시작과 같은 작업을 수행하는 component
- 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
- mkdir -p $HOME/.kube
- worker node에서 master node에 연결하여 cluster 구성을 완료
- 해당 값은 kubeadm init 이후에 마지막 2줄에 나오는 값
- kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
--discovery-token-ca-cert-hash sha256:1q2w3e4r5t6y7u8i9o0p
- Master node에 cluster 구성
- CNI 구성
- cluster에 CNI add-on
- kubectl apply <CNI 정보>
- Worker node에서 Master node 연결
- sudo kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
--discovery-token-ca-cert-hash sha256:1q2w3e4r5t6y7u8i9o0p
- sudo kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
- 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들이 실제 배치되는 노드
- Master node
- 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에서 동작하는 과정
- 개발자 / 운영자는 Nginx Image를 생성
- Nignx Image를 public 또는 private registry에 저장
- 개발자 / 운영자는 Kubernetes 명령을 통해 container 생성 요청 - 선언형 API 사용
- 요청한 명령은 cluster의 control plane (master node) API server에 전달된다.
→ scheduler에 container 생성 요청 - scheduler는 node의 상태에 따라 특정 node에 Pod 생성 요청
- 해당 node의 kubelet이 scheduler의 요청 정보 수신
- 요청 수신 정보에 따라 Pod 생성
- container 생성 - 현재 node에 image가 없는 경우 registry로부터 image 다운로드
- 생성된 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 에 작성된 글입니다.
'구름 쿠버네티스' 카테고리의 다른 글
구름 쿠버네티스 전문가 과정 6기 - 48일차 (1) | 2023.11.06 |
---|---|
구름 쿠버네티스 전문가 과정 6기 - 47일차 (3) | 2023.11.03 |
구름 쿠버네티스 전문가 과정 6기 - 45일차 (2) | 2023.11.01 |
구름 쿠버네티스 전문가 과정 6기 - 44일차 (1) | 2023.10.30 |
구름 쿠버네티스 전문가 과정 6기 - 43일차 (3) | 2023.10.27 |