* 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)
- 시크릿과 구성 관리
* 쿠버네티스 아키텍처
- 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 제공
Lens | The Kubernetes IDE
Lens IDE for Kubernetes. The only system you’ll ever need to take control of your Kubernetes clusters. It's open source and free. Download it today!
k8slens.dev
choco install lens
K9s - Manage Your Kubernetes Clusters In Style
Who Let The Pods Out? K9s is a terminal based UI to interact with your Kubernetes clusters. The aim of this project is to make it easier to navigate, observe and manage your deployed applications in the wild. K9s continually watches Kubernetes for changes
k9scli.io
choco install k9s
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
'IT > Kubernetes' 카테고리의 다른 글
[Kubernetes] Namespace, Label & LabelSelector, Annotations (0) | 2022.05.17 |
---|---|
[Kubernetes] Workload - Pods (0) | 2022.05.17 |
[Kubernetes] Kubernetes Objects (0) | 2022.05.17 |
[Kubernetes] Kubespray로 쿠버네티스 설치하기 (0) | 2022.05.17 |
[Kubernetes] Work node 추가 및 Version Upgrade (0) | 2022.05.16 |