이번 실습에서 구성한 환경은 잦은 에러때문에 추후에 환경 구성에 수정이 있었음
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을 하는 파일시스템을 찾아 삭제함
- 필수 port 번호 확인 후 포트 개방
https://kubernetes.io/ko/docs/reference/ports-and-protocols/
2. Master node, Worker node 에 container runtime 환경 구성 - Docker 설치
참고 - https://docs.docker.com/engine/install/ubuntu/#set-up-the-repository
$ 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 에 사용
# 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
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml |
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 에 추가
- Kubernetes playground
https://labs.play-with-k8s.com
docker 에서 제공
docker hub 계정으로 로그인
하나의 세션에 대해서 4시간의 사용 시간 부여
control-plane, worker node 를 직접 구성 - cluster 직접 구성
- 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 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 생성
'Kubernetes > [구름] 쿠버네티스 전문가 양성 과정 k-digital' 카테고리의 다른 글
[11주-10.12] kubernetes 환경 개선 / pod 상세 (0) | 2022.10.26 |
---|---|
[11주-10.11] kubectl 명령어 (1) | 2022.10.23 |
[10주-10.6] Kubernetes 개요 (0) | 2022.10.21 |
[10주-10.5] Docker Network, Compose (0) | 2022.10.21 |
[10주-10.4] Docker Image 생성 (0) | 2022.10.05 |