Dev./Kubernetes & Helm

Kubernetes: Intro

Ivan'show 2023. 9. 12.
728x90
반응형

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
728x90
반응형

댓글