Kubernetes
등장 배경
마이크로 서비스 아키텍쳐가 자리잡아 가면서 컨테이너를 여러가지를 띄우는 개발환경이 구축되다보니 이걸 어떻게 관리할까에 대한 고민에서 시작되었다.
그래서 구글에서 자신들의 관리 컨테이너 관리 툴을 오픈소스로 공개한 게 쿠바네티스이다.
쿠바네티스는 클러스터들을 모아두고 사용자가 원하는 만큼 원하는 컨테이너를 랜덤 서버에 띄워주고 스케일링도 처리해준다. 사용자는 쿠버네티스 마스터를 통해 원하는 컨테이너로 접근만해서 작업하면 되기 때문에 굉장히 편리하다.
특징
- 배포 및 스케일링 자동화
- service discovery
- load balancing
- 자가 치유
- 고 가용성
- IPv4, IPv6 이중 스택
- 자동화된 롤아웃 과 롤백
- 스토리지 오케스트레이션
- 시크릿과 구성관리
- 자동 빈 패킹
- 배치 실행
- 스케일링
쿠바네티스 아키텍쳐
클러스터 아키텍처
쿠버네티스 뒤편의 구조와 설계 개념들이다. 마스터 노드가 존재하고 실제 작업을 처리하는 워크노드가 있다.
마스터 노드 안쪽
워커 노드 안쪽
노드
쿠버네티스는 컨테이너를 파드내에 배치하고 노드에서 실행함으로 워크로드를 구동한다. 노드는 클러스터에 따라 가상 또는 물리적 머신일 수 있다. 각 노드는 컨트롤 플레인에 의해 관리되며 파드를 실행하는 데 필요한 서비스를 포함한다.
노드 토폴로지
쿠버네티스 클러스터 내의 노드 배치 및 구성을 나타낸다. 쿠버네티스는 클러스터 내의 노드들이 어떻게 연결되어 있는지, 어떤 특성들을 가지고 있는지를 이해하여 워크로드를 더 효율적으로 스케쥴링 할 수 있다.
클라우드 컨트롤러 매니저
클라우드 인프라스트럭처 기술을 통해 클라우드에서 쿠버네티스를 실행할 수 있다. 쿠버네티스는 컴포넌트간의 긴밀한 결합 없이 자동화된 API 기반의 인프라 스트럭처를 신뢰한다.
클라우드 컨트롤러 매니저를 통해 클러스터를 클라우드 공급자의 API 에 연결하고, 해당 클라우드 플랫폼과 상호작용하는 컴포넌트와, 클러스터와 단독 상호작용하는 컴포넌트를 구분할 수 있게 해준다.
클라우드 컨트롤러 매니저의 기능
- 노드 컨트롤러
- 라우트 컨트롤러
- 서비스 컨트롤러
컨테이너
런타임 의존성과 함께 애플리케이션을 패키징하는 기술
컨테이너 환경 변수
쿠버네티스 컨테이너 환경은 컨테이너에 몇가지 중요한 리소스를 제공한다.
- 하나의 이미지와 하나 이상의 볼륨이 결합된 파일 시스템
- 컨테이너 자신에 대한 정보
- 클러스터 내의 다른 오브젝트에 대한 정보
워크로드
워크로드는 쿠버네티스에서 구동되는 애플리케이션이다. 워크로드가 단일 컴포넌트이거나 함께 작동하는 여러 컴포넌트이든 관계없이, 쿠버네티스에서는 워크로드를 일련의 파드 집합 내에서 실행한다. 쿠버네티스에서 파드는 클러스터 내에서 실행중인 컨테이너 집합을 나타낸다.
쿠버네티스 파드에는 정의된 라이프 사이클이 있다.
Pending → Running → Succeeded | Failed
수명과 관련해서 파드는 비교적 임시 엔티티로 간주된다. 파드가 생성되고, 고유 ID(UID)가 할당되고 종료 또는 삭제될 때까지 남아 있는 노드에 스케쥴 된다. 만약 노드가 종료되면, 해당 노드에 스케쥴된 파드는 타임아웃 기간 후에 삭제되도록 스케쥴 된다.
파드 네트워크 준비성 (readiness) 이라는 개념이 있는데, 파드가 노드에 스케쥴링 되고 kubelet 이 해당 파드를 승인하여 모든 볼륨이 마운트 되는 일련의 과정들이 완료가 되면 컨디션을 체크하는 과정이다.
MINIKUBE
쿠바네티스는 클러스터로 여러 서버가 필요한데 로컬에서는 서버가 하나이기 떄문에 미니 큐브라는 것을 설치
# 다운로드 페이지
<https://minikube.sigs.k8s.io/docs/start/>
curl -LO <https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64>
sudo install minikube-darwin-amd64 /usr/local/bin/minikube
# start your cluster
minikube start
#
kimminhyeok@Ivans-Mac workspace % minikube start
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ │
│ You are trying to run the amd64 binary on an M1 system. │
│ Please consider running the darwin/arm64 binary instead. │
│ ... │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
😄 minikube v1.31.2 on Darwin 13.4.1
✨ Automatically selected the docker driver
📌 Using Docker Desktop driver with root privileges
👍 Starting control plane node minikube in cluster minikube
🚜 Pulling base image ...
💾 Downloading Kubernetes v1.27.4 preload ...
> preloaded-images-k8s-v18-v1...: 327.74 MiB / 327.74 MiB 100.00% 25.69 M
> gcr.io/k8s-minikube/kicbase...: 447.62 MiB / 447.62 MiB 100.00% 25.76 M
🔥 Creating docker container (CPUs=2, Memory=4000MB) ...
🐳 Preparing Kubernetes v1.27.4 on Docker 24.0.4 ...
▪ Generating certificates and keys ...
▪ Booting up control plane ...
▪ Configuring RBAC rules ...
🔗 Configuring bridge CNI (Container Networking Interface) ...
🔎 Verifying Kubernetes components...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟 Enabled addons: storage-provisioner, default-storageclass
❗ /usr/local/bin/kubectl is version 1.25.4, which may have incompatibilities with Kubernetes 1.27.4.
▪ Want kubectl v1.27.4? Try 'minikube kubectl -- get pods -A'
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
# to check
minikube kubectl -- get po -A
#
kimminhyeok@Ivans-Mac workspace % kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system ... 1/1 Running 0 10s
kube-system ... 1/1 Running 0 24s
kube-system ... 1/1 Running 0 24s
kube-system ... 1/1 Running 0 25s
kube-system ... 1/1 Running 0 10s
kube-system ... 1/1 Running 0 24s
kube-system ... 1/1 Running 0 23s
# node check
kubectl get nodes
#
kimminhyeok@Ivans-Mac workspace % kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 15m v1.27.4
# alias config
vi ~/.zshrc
# add
alias k="kubectl"
# source
source ~/.zshrc
# check
k get nodes
#
kimminhyeok@Ivans-Mac workspace % k get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 15m v1.27.4
pod → 쿠버네티스의 리소스를 가지고 있는 최소 컨테이너
Dash board check
# dash board check
minikube dashboard
#
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ │
│ You are trying to run the amd64 binary on an M1 system. │
│ Please consider running the darwin/arm64 binary instead. │
│ ...
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
🔌 Enabling dashboard ...
▪ Using image docker.io/kubernetesui/metrics-scraper:v1.0.8
▪ Using image docker.io/kubernetesui/dashboard:v2.7.0
💡 Some dashboard features...
minikube addons enable metrics-server
🤔 Verifying dashboard health ...
🚀 Launching proxy ...
🤔 Verifying proxy health ...
🎉 Opening <http://127.0.0.1>:...
직접 파드 생성
# simple-web pod 하나 생성
k run simple-web --image=teacherssamko/simple-web:v1 --port=8000
#
kimminhyeok@Ivans-Mac workspace % k run simple-web --image=teacherssamko/simple-web:v1 --port=8000
pod/simple-web created
# get pod check
k get pods
#
kimminhyeok@Ivans-Mac workspace % k get pods
NAME READY STATUS RESTARTS AGE
simple-web 1/1 Running 0 30s
# describe
k describe pod
#
kimminhyeok@Ivans-Mac workspace % k describe pod
Name: simple-web
Namespace: default
Priority: 0
Service Account: default
Node: minikube/192.168.49.2
Start Time: Thu, 31 Aug 2023 14:12:27 +0900
Labels: run=simple-web
Annotations: <none>
Status: Running
IP: 10.244.0.5
...
...
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 42s default-scheduler Successfully assigned default/simple-web to minikube
Normal Pulling 41s kubelet Pulling image "teacherssamko/simple-web:v1"
Normal Pulled 36s kubelet Successfully pulled image "teacherssamko/simple-web:v1" in 5.405375336s (5.405390961s including waiting)
Normal Created 35s kubelet Created container simple-web
Normal Started 35s kubelet Started container simple-web
get 을 이용해서 파드를 검색할 때 좀 더 많은 정보를 얻을 수 도 있다.
k get po -o wide
파드에 할당된 주소로 접근할 수 있을까 ?
curl <http://10.244.0.5:8000>
# fail
curl: (28) Failed to connect to 10.244.0.5 port 8000 after 75008 ms: Couldn't connect to server
k expose po simple-web --type=LoadBalancer --name simple-web-http
#
kimminhyeok@Ivans-Mac workspace % k expose po simple-web --type=LoadBalancer --name simple-web-http
service/simple-web-http exposed
기본 파드 자체로는 접근할 수 없다. 그래서 파드를 노출시킨다는 명령어를 사용해서 노출을 시키던지, 아니면 서비스를 이용해서 관리가 되도록 한다.
k get services
#
kimminhyeok@Ivans-Mac workspace % k get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 49m
simple-web-http LoadBalancer 10.98.178.4 <pending> 8000:31443/TCP 9s
File 로 파드생성
vi lion-manual.yaml
apiVersion: v1
kind: Pod
metadata:
name: lion-manual
spec:
containers:
- image: teacherssamko/simple-web:v1
name: lion-manual
ports:
- containerPort: 8000
k create -f lion-manual.yaml
#
kimminhyeok@Ivans-Mac k8s % k create -f lion-manual.yaml
pod/lion-manual created
# check
kimminhyeok@Ivans-Mac k8s % k get po
NAME READY STATUS RESTARTS AGE
lion-manual 1/1 Running 0 22s
# check2
kimminhyeok@Ivans-Mac k8s % k get po lion-manual -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-08-31T06:22:00Z"
name: lion-manual
namespace: default
resourceVersion: "5942"
uid: 59b253d1-66a7-40bc-b13b-e24561f3520f
spec:
containers:
- image: teacherssamko/simple-web:v1
imagePullPolicy: IfNotPresent
name: lion-manual
ports:
- containerPort: 8000
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-vsc8g
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: minikube
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: kube-api-access-vsc8g
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2023-08-31T06:22:00Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2023-08-31T06:22:01Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2023-08-31T06:22:01Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2023-08-31T06:22:00Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://8820a93879cdb95002c312eac294c10fa71e7e1323ee88f8fdde4a0cf14cb799
image: teacherssamko/simple-web:v1
imageID: docker-pullable://teacherssamko/simple-web@sha256:9fb3b39fb6a9847d398dd421876c4a606d3cadf9d9e08d8c6acfe94d6a40ab35
lastState: {}
name: lion-manual
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2023-08-31T06:22:01Z"
hostIP: 192.168.49.2
phase: Running
podIP: 10.244.0.11
podIPs:
- ip: 10.244.0.11
qosClass: BestEffort
startTime: "2023-08-31T06:22:00Z"
# label 추가: lion-manual-label.yaml
apiVersion: v1
kind: Pod
metadata:
name: lion-manual-v2
labels:
creation_method: manual
env: lecture
spec:
containers:
- image: teacherssamko/simple-web:v2
name: lion-manual-v2
ports:
- containerPort: 8000
# 생성 후 체크
kimminhyeok@Ivans-Mac k8s % k get po -L creation_method,env
NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV
lion-manual 1/1 Running 0 23m manual
lion-manual-v2 1/1 Running 0 3m32s manual lecture
# 레이블 명 변경하기
k label pods lion-manual-v2 ENV=debug --overwrite
# result
kimminhyeok@Ivans-Mac k8s % k get po -L creation_method,ENV
NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV
lion-manual 1/1 Running 0 27m manual
lion-manual-v2 1/1 Running 0 6m54s manual debug
'Dev. > Kubernetes & Helm' 카테고리의 다른 글
Kubernetes: ConfigMap (0) | 2023.09.18 |
---|---|
Kubernetes: svc - pod 구조 이해 (0) | 2023.09.17 |
Kubernetes: 서비스, 파드의 관리자 (0) | 2023.09.16 |
Kubernetes: 리소스 생성해보기 (0) | 2023.09.15 |
Kubernetes: 명령어와 익숙해지기 (0) | 2023.09.15 |
댓글