본문 바로가기
IT/Kubernetes

[Kubernetes] Kubernetes Architecture 및 설치 & Tips

by 깅지수 2022. 5. 16.

* Cloud Native ecosystem의 software 분류

CNCF Cloud Native Interactive Landscape

 

CNCF Cloud Native Interactive Landscape

Filter and sort by GitHub stars, funding, commits, contributors, hq location, and tweets. Updated: undefined

landscape.cncf.io

 

Kubernetes Architecture

 

* 쿠버네티스 = 클라우드의 운영체제라고도 함 (그만큼 핵심) = 인터넷의 핵심 = k8s (k 와 s 사이에 8글자)

                 = 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼

* 쿠버네티스 기능

  • 서비스 디스커버리와 로드 밸런싱
  • 스토리지 오케스트레이션
  • 자동화된 롤아웃(무언가를 구성)과 롤백(이전 상태로 되돌아감)
  • 자동화된 빈(실행파일/Application) 패킹(bin packing) 
  • 자동화된 복구(self-healing) 
  • 시크릿과 구성 관리

 

* 쿠버네티스 아키텍처

control plane : 1개, Node : 3개 --- 즉, 총 4개의 VM 필요

- Cluster : 여러대의 system/software를 하나로 묶어서 관리 (Cluster는 짝수 갯수로 구성하지 않음 → split brain 문제)

- Node : 실제 container를 실행 (즉, docker/podman 이 설치되어있어야) / Worker - Minions

- Control Plane : Node들을 관리 (하나가 망가지면 모든게 stop 되므로 최소 3개 이상 구성) / Master

- API server : 모든 k8s에 관련된 통신은 API를 거쳐야함 (핵심 명령어 : kubectl - API에게 통신)

- C-M (Controller Manager) : Control Plane 즉, k8s 전체를 control

  • 노드 컨트롤러: 노드가 다운되었을 때 통지와 대응에 관한 책임을 가진다.
  • 레플리케이션 컨트롤러: 시스템의 모든 레플리케이션 컨트롤러 오브젝트에 대해 알맞은 수의 파드들을 유지시켜 주는 책임을 가진다. * k8s의 핵심인 container(Pod)의 복제(replica)를 control
  • 엔드포인트 컨트롤러: 엔드포인트 오브젝트를 채운다(즉, 서비스=네트워크(LB)와 파드를 연결시킨다.) pod에 network 제공
  • 서비스 어카운트 & 토큰(인증) 컨트롤러: 새로운 네임스페이스에 대한 기본 계정과 API 접근 토큰을 생성한다.

- C-C-M (Cloud Controller Manager) : cloud와 연동

- sched (scheduler) : pod를 어떤 node에 배치할것인지

- etcd (etc daemon) : key value storage, key-value 형태로 저장하는 DB, 핵심 = cluster를 구성 [;엣시디]

                             (*/etc에는 설정파일들이 들어있음 (like window의 제어판))

- kubelet (CRI : Container Runtime Interface) : container 담당

- kube-proxy : network 담당

- Add-on : 쿠버네티스 추가 기능

  • kube-dns

 

* 참고 : 쿠버네티스 컴포넌트 | Kubernetes

 

쿠버네티스 컴포넌트

쿠버네티스 클러스터는 컴퓨터 집합인 노드 컴포넌트와 컨트롤 플레인 컴포넌트로 구성된다.

kubernetes.io

 

 

 

Kubernetes 설치

 

* 설치하는 방법

- kubeadm (표준)

- kubespray (kubeadm + Ansible)

- kOps : AWS EC2에 cluster를 만듦

- Docker Desktop을 설치하고 Kubernetes 기능 활성화 (기본적인 기능만 사용할 수 있음)

- minikube (가장 많이 사용)

 

 

* 참고 : kubeadm 설치하기 | Kubernetes

 

kubeadm 설치하기

이 페이지에서는 kubeadm 툴박스 설치 방법을 보여준다. 이 설치 프로세스를 수행한 후 kubeadm으로 클러스터를 만드는 방법에 대한 자세한 내용은 kubeadm을 사용하여 클러스터 생성하기 페이지를 참

kubernetes.io

 

kubeadm, kubelet, kubectl 설치

 

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
sudo apt-get update

 

원하는 version이 있는지 확인

apt-cache madison kubeadm | grep 1.22.8
apt-cache madison kubelet | grep 1.22.8
apt-cache madison kubectl | grep 1.22.8

 

kubeadm, kubelet, kubectl 설치

sudo apt-get install kubeadm=1.22.8-00 kubelet=1.22.8-00 kubectl=1.22.8-00 -y
sudo apt-mark hold kubelet kubeadm kubectl

 

k8s에 인증하기 위한 인증파일 (해당 파일은 노출되면 x)

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

 

 kubectl get nodes

>> NAME     STATUS     ROLES                  AGE     VERSION
     docker   NotReady   control-plane,master   6m23s   v1.22.8

 

=> pod에 network add-on 필요

#Calico => 가장 많이 사용(성능/확장성↑)
kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml

* 참고 : Cluster Networking | Kubernetes

 

Cluster Networking

Networking is a central part of Kubernetes, but it can be challenging to understand exactly how it is expected to work. There are 4 distinct networking problems to address: Highly-coupled container-to-container communications: this is solved by Pods and lo

kubernetes.io

 

 

 

 

** kubelet un-active 오류 / cgroup driver 오류 해결

docker info | grep 'Cgroup Driver'

>>  Cgroup Driver: cgroupfs

 

/etc/docker/daemon.json (sudo vi로 해당파일 만들어주기)

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
sudo systemctl restart docker
docker info | grep 'Cgroup Driver'

>> Cgroup Driver: systemd

 

 

kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
curl https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml -O

vi custom-resources.yaml

...
	cidr : 172.16.0.0/16		#지정해둔 pod endpoint
...
kubectl create -f custom-resources.yaml

 

Kubernetes Cluster 생성

sudo kubeadm init --control-plane-endpoint 192.168.100.100 --pod-network-cidr 172.16.0.0/16 --apiserver-advertise-address 192.168.100.100

 

** kubeadm init 실패 시, 

sudo kubeadm reset

실행 후, 다시 실행

 

 

* 참고 : Creating a cluster with kubeadm | Kubernetes

 

Creating a cluster with kubeadm

Using kubeadm, you can create a minimum viable Kubernetes cluster that conforms to best practices. In fact, you can use kubeadm to set up a cluster that will pass the Kubernetes Conformance tests. kubeadm also supports other cluster lifecycle functions, su

kubernetes.io

 

 

cluster 상태 확인

 

watch kubectl get pods -A
Every 2.0s: kubectl get pods -A                                                          docker: Mon May 16 03:28:18 2022

NAMESPACE          NAME                                       READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-6878748689-dxj85          1/1     Running   0          2m22s
calico-apiserver   calico-apiserver-6878748689-mkxlb          1/1     Running   0          2m22s
calico-system      calico-kube-controllers-5d74cd74bc-k5l4r   1/1     Running   0          5m33s
calico-system      calico-node-qhvgr                          1/1     Running   0          5m33s
calico-system      calico-typha-74f7977b6-5vllg               1/1     Running   0          5m34s
kube-system        coredns-78fcd69978-g5zwh                   1/1     Running   0          24m
kube-system        coredns-78fcd69978-svb5t                   1/1     Running   0          24m
kube-system        etcd-docker                                1/1     Running   1          24m
kube-system        kube-apiserver-docker                      1/1     Running   1          24m
kube-system        kube-controller-manager-docker             1/1     Running   1          24m
kube-system        kube-proxy-kn42x                           1/1     Running   0          24m
kube-system        kube-scheduler-docker                      1/1     Running   1          24m
tigera-operator    tigera-operator-7cf4df8fc7-4nb8h           1/1     Running   0          8m23s

 

kubectl get nodes

>> NAME     STATUS     ROLES                  AGE     VERSION
     docker     Ready   control-plane,master   25m      v1.22.8

 

 

kubectl taint node docker node-role.kubernetes.io/master-

 

 

예제

kubectl create deployment myweb --image=ghcr.io/c1t1d0s7/go-myweb
kubectl get deployments,replicasets,pods

>> NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myweb   1/1     1            1           3m11s

NAME                             DESIRED   CURRENT   READY   AGE
replicaset.apps/myweb-97dbf5749   1         1         1       3m11s

NAME                                READY   STATUS    RESTARTS   AGE
pod/myweb-97dbf5749-9chr4   1/1     Running   0          3m11s

 

 

서비스

kubectl expose deployment myweb --port=80 --protocol=TCP --target-port=8080 --name myweb-svc --type=NodePort
kubectl get services

>> NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP        10.96.0.1       <none>        443/TCP        32m
myweb-svc    NodePort    10.108.88.106   <none>        80:32114/TCP   23s

(로드밸런서)

 

curl 192.168.100.100:32114(#port)

>> Hello World!
myweb-97dbf5749-9chr4

 

 

pod 갯수 증가

kubectl scale deployment myweb --replicas=3
kubectl get pods

>> NAME                    READY   STATUS    RESTARTS   AGE
myweb-97dbf5749-788sd   1/1     Running   0          26s
myweb-97dbf5749-9chr4   1/1     Running   0          9m24s
myweb-97dbf5749-mlj26   1/1     Running   0          26s

 

 

삭제

kubectl delete service myweb-svc
kubectl delete deployment myweb

 

 

** kubernets의 깊게 이해하고 싶다면 참고 : kelseyhightower/kubernetes-the-hard-way: Bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts. (github.com)

 

GitHub - kelseyhightower/kubernetes-the-hard-way: Bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts.

Bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts. - GitHub - kelseyhightower/kubernetes-the-hard-way: Bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts.

github.com

 

 


Tip

 

 

1. oh-my-zsh - powerlevel10k 테마 설치

 

* 참고 : GitHub - romkatv/powerlevel10k: A Zsh theme

 

GitHub - romkatv/powerlevel10k: A Zsh theme

A Zsh theme. Contribute to romkatv/powerlevel10k development by creating an account on GitHub.

github.com

 

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

 

vi ~/.zshrc

수정

ZSH_THEME="powerlevel10k/powerlevel10k"

 

exec zsh

 

변경사항 수정

p10k configure

 

 

2.  kubectx + kubens 설치

 

- kubectx : context 전환

> kubectx config 
kubernetes-admin@cluster.local
myuser@cluster.local

 

> kubectx myuser@cluster.local
Switched to context "myuser@cluster.local"

 

- kubens : namespace 전환

❯ kubens
default
dev
ingress-nginx
kube-node-lease
kube-public
kube-system
metallb-system

 

❯ kubens dev
Context "kubernetes-admin@cluster.local" modified.
Active namespace is "dev".

 

* 참고 : GitHub - ahmetb/kubectx: Faster way to switch between clusters and namespaces in kubectl

 

GitHub - ahmetb/kubectx: Faster way to switch between clusters and namespaces in kubectl

Faster way to switch between clusters and namespaces in kubectl - GitHub - ahmetb/kubectx: Faster way to switch between clusters and namespaces in kubectl

github.com

 

kubectx 

https://github.com/ahmetb/kubectx/releases/download/v0.9.4/kubectx

 

kubens

wget https://github.com/ahmetb/kubectx/releases/download/v0.9.4/kubens

 

실행 가능한 위치로 이동

sudo install kubectx /usr/local/bin
sudo install kubens /usr/local/bin

 

 

3. Lens

: GUI 제공

choco install lens
 
 
 
 
4. k9s
choco install k9s
 
 
 
 
5. minikube
 
: local system에 kubernetes 세팅 할 수 있는 도구

https://minikube.sigs.k8s.io/docs/start/

 

minikube start

minikube is local Kubernetes

minikube.sigs.k8s.io

 

choco install minikube

 

choco install kubernetes-cli --version=1.22.4

 

클러스터 생성/실행

minikube start

 

클러스터 중지

minikube stop

 

클러스터 상태

minikube status

 

VM 접속

minikube ssh

패키지 관리자 X (apt, yum ...)
kubectl 명령 X
docker 명령 O

 

VM 내의 Docker Engine 사용

choco install docker-cli

 

minikube -p minikube docker-env --shell powershell | Invoke-Expression

 

docker ps

 

클러스터 삭제

minikube delete

 

추가 옵션을 사용한 클러스터 생성/시작

minikube start --cpus 4 --memory 4G --disk-size 30G --driver virtualbox --kubernetes-version v1.22.9

 

노드 목록 및 추가

minikube node list
minikube node add		#kubeadm join도 자동으로 해줌

 

 

ip 확인

minikube ip

 

kubectl create deployment myapp --image nginx --replicas 3

kubectl expose deployment myapp --name mysvc --port 80 --target-port 80

kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
myapp-6d8d776547-9hs47   1/1     Running   0          57s
myapp-6d8d776547-kfsxz   1/1     Running   0          57s
myapp-6d8d776547-xqz94   1/1     Running   0          57s

kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   13m
mysvc        ClusterIP   10.111.116.253   <none>        80/TCP    19s

kubectl edit svc mysvc


kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        14m
mysvc        NodePort    10.111.116.253   <none>        80:30004/TCP   67s

192.168.59.101:30004 접속

서비스 목록 확인

minikube service list
|-------------|------------|--------------|-----------------------------|
|  NAMESPACE  |    NAME    | TARGET PORT  |             URL             |
|-------------|------------|--------------|-----------------------------|
| default     | kubernetes | No node port |
| default     | mysvc      |           80 | http://192.168.59.101:30004 |
| kube-system | kube-dns   | No node port |
|-------------|------------|--------------|-----------------------------|

 

 

애드온

minikube addons list

 

minikube addons enable metrics-server
minikube addons enable ingress

 

minikube addons configure metallb

-- Enter Load Balancer Start IP: 192.168.59.200
-- Enter Load Balancer End IP: 192.168.59.209

 

클러스터 기본 옵션 지정

minikube config set cpus 2
minikube config set memory 4G
minikube config set driver virtualbox
minikube config set kubernetes-version v1.22.9
minikube config view