Dev./Kubernetes & Helm

Kubernetes: 명령어와 익숙해지기

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

Kubernetes 명령어

파드를 생성하고, 서비스를 통해 파드를 관리할 수 있게 레이블을 등록해주는게 일반적인 관리 방식이다. 이 과정에서 어떻게 하면 파드를 잘 생성해서 서비스의 endpoint 에 연결하여 관리가 잘 되는지 확인하는 작업들이 필요해 진다. 필요한 명령어들을 써보면서 메커니즘이 어떻게 돌아가는지 알아보자.

label overwrite

레이블 명이 잘못 입력되었을 때,

k label po lion-manual-v2 env=debug --overwrite

에러현상

The connection to the server 127.0.0.1:54007 was refused - did you specify the right host or port?

쿠버네티스 API 서버에 연결할 수 없음을 나타낸다. 일반적으로 쿠버네티스 클러스트가 실행되지 않거나, 혹은 클러스터 설정이 잘못 되었을 때 발생


label delete

k label po lion-manual-v2 env-

특정 레이블을 출력에 포함 시키는 옵션

k get po -L creation_method,env

특정 레이블을 가진 리소스만 출력

k get po -l env=debug

특정 레이블을 가지지 않는 리소스만 출력

k get po -l '!env'

label 정보를 포함혀어 파드 리스트를 출력

k get pods --show-labels

특정 레이블 정보를 가진 파드 삭제

k delete po -l env=debug

teacherssamko/simple-web:v1 / 8000 port / pod run

k run lion-manual --image=teacherssamko/simple-web:v1 --port 8000

파드 노출시키기

k expose po lion-manual --type=LoadBalancer --name lion-manual-http

서비스 확인하기

k get svc

서비스 URL 확인하기 → expose 시킨 이름으로

minikube service lion-manual-http

#
...
|-----------|------------------|-------------|---------------------------|
| NAMESPACE |       NAME       | TARGET PORT |            URL            |
|-----------|------------------|-------------|---------------------------|
| default   | lion-manual-http |        8000 | <http://192.168.49.2:32730> |
|-----------|------------------|-------------|---------------------------|
...

curl 로 생성된 파드에 요청을 보내기

curl <http://192.168.49.2:32730>

바로 url 을 생성하고 HTTP 요청 보내기

curl $(minikube service lion-manual-http --url=true)

디플로이먼트 생성하기

k create deployment lion-web --port 8000 -r 3 --image teacherssamko/simple-web:v1

디플로이먼트 체크

k get deploy

스케일 3 → 5

k scale --replicas 5 deployment lion-web
# 파드 갯수 늘어났는지 확인
k get po
# 디플로이먼트 확인
k get deploy

모든 po 삭제 → 디플로이로 생성했기 때문에 po 만 삭제할 시 다시 살아남 그래서 디플로이먼트를 삭제해줘야 함

k delete deployment lion-web

다시 lion-manual 과 lion-manual-v2 를 생성하기

k create -f lion-manual.yaml
k create -f lion-manual-label.yaml

to check

k get po -L env,creation_method

#
NAME             READY   STATUS    RESTARTS   AGE     ENV     CREATION_METHOD
lion-manual      1/1     Running   0          2m37s           manual
lion-manual-v2   1/1     Running   0          2m32s   debug   manual

name space 생성

k create ns lion-us

name space 삭제

k delete ns lion-us

name space 넣고 파드 실행

k create -f lion-manual.yaml --namespace lion-ns

디폴트로 설정 되어 있는 config = minikube

k config current-context

#
minikube

다른 네임스페이스로 변경

k config set-context minikube --namespace lion-us

너무 길어서 alias 로 묶어주기

vi ~/.zshrc
# add
alias kc='kubectl config set-context $(kubectl config current-context --namespace)'
source ~/.zshrc

빠르게 네임스페이스 변경 가능

kc default
kc lion-ns

liveness

# lion-liveness-probe.yaml

apiVersion: v1
kind: Pod
metadata:
  name: lion-liveness
spec:
  containers:
    - name: lion
      image: teacherssamko/simple-web:v1
      port:
        - containerPort: 8000
      livenessProbe:
        httpGet:
          path: /
          port: 8000

liveness pod 생성

k create -f lion-liveness-probe.yaml

liveness log check

k logs lion-liveness

#
10.244.0.1 - - [01/Sep/2023 02:14:26] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:14:36] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:14:46] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:14:56] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:15:06] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:15:16] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:15:26] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:15:36] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:15:46] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:15:56] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:16:06] "GET / HTTP/1.1" 200 -

detail of the liveness pod

k describe pod lion-liveness

만약 unhealthy 가 달리게 된다면 health 체크에서 5번 이상 응답이 없으면 서버 에러로 500 을 리턴하고 500 이 3번 반복되면 restart 하게 된다.

# yaml 파일 수정
apiVersion: v1
kind: Pod
metadata:
  name: lion-liveness
spec:
  containers:
    - name: lion
      image: teacherssamko/simple-web:unhealthy
      ports:
        - containerPort: 8000
      livenessProbe:
        httpGet:
          path: /
          port: 8000
# 파드 생성후 로그 출력
kimminhyeok@Ivans-Mac k8s % k logs -f lion-liveness
10.244.0.1 - - [01/Sep/2023 02:18:56] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:19:06] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:19:16] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:19:26] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:19:36] "GET / HTTP/1.1" 200 -
10.244.0.1 - - [01/Sep/2023 02:19:46] "GET / HTTP/1.1" 500 -
10.244.0.1 - - [01/Sep/2023 02:19:56] "GET / HTTP/1.1" 500 -
10.244.0.1 - - [01/Sep/2023 02:20:06] "GET / HTTP/1.1" 500 -
# 재시작 확인
kimminhyeok@Ivans-Mac k8s % k get pod
NAME             READY   STATUS    RESTARTS      AGE
lion-liveness    1/1     Running   2 (21s ago)   4m1s
lion-manual      1/1     Running   0             54m
lion-manual-v2   1/1     Running   0             54m

레플리케이션 컨트롤러

# lion-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: lion
spec:
  replicas: 3
  selector:
    app: lion
  template:
    metadata:
      name: lion
      labels:
        app: lion
    spec:
      containers:
        - name: lion
          image: teacherssamko/simple-web:v1
          ports:
            - containerPort: 8000
# 파드로 띄우기
k create -f lion-rc.yaml

to check

k get rc

#
NAME   DESIRED   CURRENT   READY   AGE
lion   3         3         3       4s
kimminhyeok@Ivans-Mac k8s % k get po --show-labels
NAME             READY   STATUS    RESTARTS      AGE     LABELS
lion-96vvc       1/1     Running   0             14s     app=lion
lion-c2jzs       1/1     Running   0             14s     app=lion
lion-liveness    1/1     Running   5 (10s ago)   9m20s   <none>
lion-manual      1/1     Running   0             59m     creation_method=manual
lion-manual-v2   1/1     Running   0             59m     creation_method=manual,env=debug
lion-pkcm7       1/1     Running   0             14s     app=lion

파드 3개가 한번에 띄워진 것을 확인

What if, 레이블 하나가 바뀐다면 ??

# 파드 하나의 레이블을 바꿔보자
kimminhyeok@Ivans-Mac k8s % k label po lion-96vvc app=tiger --overwrite
pod/lion-96vvc labeled
kimminhyeok@Ivans-Mac k8s % k get po --show-labels
NAME             READY   STATUS    RESTARTS      AGE     LABELS
lion-96vvc       1/1     Running   0             2m16s   app=tiger
lion-c2jzs       1/1     Running   0             2m16s   app=lion
lion-liveness    1/1     Running   6 (22s ago)   11m     <none>
lion-manual      1/1     Running   0             61m     creation_method=manual
lion-manual-v2   1/1     Running   0             61m     creation_method=manual,env=debug
lion-pkcm7       1/1     Running   0             2m16s   app=lion
lion-sjz6l       1/1     Running   0             9s      app=lion

레플리카 컨트롤러가 3개를 관리해야하는데 레이블이 바뀌면서 1개가 죽었거나 없어졌다고 판단해서 하나를 새롭게 띄운 것을 확인 할 수 있다.

레이블을 바꾼 96vv 의 경우 manual 로 만든 파드와 다를바가 없어졌다.

edit 명령어로 수정

k edit rc lion
spec 부분에 있는 selector 의 정보를 lion 에서 tiger 로 변경

#
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: ReplicationController
metadata:
  creationTimestamp: "2023-09-01T02:27:52Z"
  generation: 2
  labels:
    app: lion
  name: lion
  namespace: default
  resourceVersion: "4671"
  uid: 33496328-010b-4a4f-bd84-dd8dc07b939f
spec:
  replicas: 3
  selector:
    app: tiger
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: tiger
      name: tiger
    spec:
	...
	...

이후 파드 개수 확인

kimminhyeok@Ivans-Mac k8s % k get po --show-labels
NAME             READY   STATUS    RESTARTS        AGE   LABELS
lion-8m6t9       1/1     Running   0               3s    app=tiger
lion-8rzcx       1/1     Running   0               3s    app=tiger
lion-96vvc       1/1     Running   0               14m   app=tiger
lion-c2jzs       1/1     Running   0               14m   app=lion
lion-liveness    1/1     Running   8 (6m20s ago)   23m   <none>
lion-manual      1/1     Running   0               73m   creation_method=manual
lion-manual-v2   1/1     Running   0               73m   creation_method=manual,env=debug
lion-pkcm7       1/1     Running   0               14m   app=lion
lion-sjz6l       1/1     Running   0               12m   app=lion

app=lion 으로 되어 있는 파드들 삭제

#
kimminhyeok@Ivans-Mac k8s % k delete po -l app=lion 
pod "lion-c2jzs" deleted
pod "lion-pkcm7" deleted
pod "lion-sjz6l" deleted
kimminhyeok@Ivans-Mac k8s % k get po --show-labels 
NAME             READY   STATUS             RESTARTS        AGE     LABELS
lion-8m6t9       1/1     Running            0               4m37s   app=tiger
lion-8rzcx       1/1     Running            0               4m37s   app=tiger
lion-96vvc       1/1     Running            0               19m     app=tiger
lion-liveness    0/1     CrashLoopBackOff   9 (2m14s ago)   28m     <none>
lion-manual      1/1     Running            0               78m     creation_method=manual
lion-manual-v2   1/1     Running            0               78m     creation_method=manual,env=debug

replicas 를 5개로 변경

k edit rc lion

#
replicas: 3 -> 5
kimminhyeok@Ivans-Mac k8s % k get po --show-labels
NAME             READY   STATUS             RESTARTS        AGE     LABELS
lion-8m6t9       1/1     Running            0               5m13s   app=tiger
lion-8rzcx       1/1     Running            0               5m13s   app=tiger
lion-96vvc       1/1     Running            0               19m     app=tiger
lion-liveness    0/1     CrashLoopBackOff   9 (2m50s ago)   28m     <none>
lion-manual      1/1     Running            0               78m     creation_method=manual
lion-manual-v2   1/1     Running            0               78m     creation_method=manual,env=debug
lion-zhx92       1/1     Running            0               2s      app=tiger
lion-zr697       1/1     Running            0               2s      app=tiger

scale로 복제본 수를 다시 3개로 변경

k scale --replicas 3 rc lion
kimminhyeok@Ivans-Mac k8s % k get po --show-labels      
NAME             READY   STATUS             RESTARTS        AGE     LABELS
lion-8m6t9       1/1     Running            0               6m43s   app=tiger
lion-8rzcx       1/1     Running            0               6m43s   app=tiger
lion-96vvc       1/1     Running            0               21m     app=tiger
lion-liveness    0/1     CrashLoopBackOff   9 (4m20s ago)   30m     <none>
lion-manual      1/1     Running            0               80m     creation_method=manual
lion-manual-v2   1/1     Running            0               80m     creation_method=manual,env=debug
lion-zhx92       1/1     Terminating        0               92s     app=tiger
lion-zr697       1/1     Terminating        0               92s     app=tiger

다시 전체 삭제 후 rc 로 생성

k delete all --all
k get svc

# kubernetes 는 다시 살아남
kimminhyeok@Ivans-Mac k8s % k get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   79s
k create -f lion-rc.yaml
kimminhyeok@Ivans-Mac k8s % k get po --show-labels
NAME         READY   STATUS    RESTARTS   AGE    LABELS
lion-77f69   1/1     Running   0          2m6s   app=lion
lion-wsppf   1/1     Running   0          2m6s   app=lion
lion-zdnsl   1/1     Running   0          2m6s   app=lion

레플리케이션만 삭제

k delete rc lion --cascade=orphan

레플리케이션 컨트롤러는 이제 잘 안쓴다. set 으로 컨트롤 해보자

# lion-rs.yamapiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: lion
  labels:
    app: lion
spec:
  replicas: 3
  selector:
    matchLabels:
      app: lion
  template:
    metadata:
      labels:
        app: lion
    spec:
      containers:
        - name: lion
          image: teacherssamko/simple-web:v1
          ports:
            - containerPort: 8000

k create -f lion-rs.yaml
# 4개로 늘릴 떄
k scale rs lion --replicas 4

레플리케이션 컨트롤러와 다른 점: label 을 어떻게 다를 수 있는 지

cp lion-rs.yaml lion-rs-matchexp.yaml
# matchLabels  변경
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: lion
  labels:
    app: lion
spec:
  replicas: 3
  selector:
		matchExpressions:
			- key: app
				operator: In
				values:
					- lion
  template:
    metadata:
      labels:
        app: lion
    spec:
      containers:
        - name: lion
          image: teacherssamko/simple-web:v1
          ports:
            - containerPort: 8000

matchExpressions 는 레이블을 컨트롤 한다기보다 파드 자체를 컨트롤하는 쪽에 가까워서 더 편하게 사용 가능

k explain rs.spec.selector.matchExpressions

Job

하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료될 떄 까지 계속해서 파드의 실행을 재시도 한다.

# lion-batch.yaml
# 일회성으로 실행하게 되는 작업들
apiVersion: batch/v1
kind: Job
metadata:
  name: lion-batch
spec:
  template:
    spec:
      containers:
      - name: lion-batch
        image: teacherssamko/batch-job
      restartPolicy: Never # OnFailure | Never 만 batch 에서 사용가능
kimminhyeok@Ivans-Mac k8s % k get po               
NAME               READY   STATUS      RESTARTS   AGE
lion-batch-gdzcr   0/1     Completed   0          38s

kimminhyeok@Ivans-Mac k8s % k get job                  
NAME         COMPLETIONS   DURATION   AGE
lion-batch   1/1           37s        46s

multi batch

# lion-multi-batch.yaml
# 일회성으로 실행하게 되는 작업들
apiVersion: batch/v1
kind: Job
metadata:
  name: lion-batch
spec:
  completions: 5 # 고정적인 완료 횟수 추가
  template:
    spec:
      containers:
      - name: lion-batch
        image: teacherssamko/batch-job
      restartPolicy: Never # OnFailure | Never 만 batch 에서 사용가능
kimminhyeok@Ivans-Mac k8s % k get po
NAME               READY   STATUS      RESTARTS   AGE
lion-batch-8txmx   0/1     Completed   0          2m2s
lion-batch-fvvnx   0/1     Completed   0          51s
lion-batch-wzrwn   0/1     Completed   0          86s
lion-batch-xgztf   1/1     Running     0          15s

kimminhyeok@Ivans-Mac k8s % k get job
NAME         COMPLETIONS   DURATION   AGE
lion-batch   3/5           2m5s       2m5s

한번에 여러개를 생성하게 끔 한다. 그러나 지금은 순차적으로 하나씩 생성하는 것 으로 보인다.

# lion-multi-parallel.yaml
# 일회성으로 실행하게 되는 작업들
apiVersion: batch/v1
kind: Job
metadata:
  name: lion-batch
spec:
  completions: 5 # 고정적인 완료 횟수 추가
  parallelism: 2 # 병렬로 한번에 몇개?
  template:
    spec:
      containers:
      - name: lion-batch
        image: teacherssamko/batch-job
      restartPolicy: Never # OnFailure | Never 만 batch 에서 사용가능
kimminhyeok@Ivans-Mac k8s % k get po
NAME               READY   STATUS              RESTARTS   AGE
lion-batch-25j7h   0/1     ContainerCreating   0          2s
lion-batch-rpzfx   0/1     ContainerCreating   0          2s

kimminhyeok@Ivans-Mac k8s % k get job
NAME         COMPLETIONS   DURATION   AGE
lion-batch   0/5           5s         5s
kimminhyeok@Ivans-Mac k8s % k get po 
NAME               READY   STATUS      RESTARTS   AGE
lion-batch-25j7h   0/1     Completed   0          56s
lion-batch-5rbh9   1/1     Running     0          18s
lion-batch-6l2b6   1/1     Running     0          20s
lion-batch-rpzfx   0/1     Completed   0          56s

kimminhyeok@Ivans-Mac k8s % k get job
NAME         COMPLETIONS   DURATION   AGE
lion-batch   2/5           59s        59s
kimminhyeok@Ivans-Mac k8s %

parallelism 을 사용하면 병렬로 진행할 갯수를 구할 수 있다.

크론잡

반복 일정에 따라 잡을 만든다. 하나의 크론잡 오브젝트는 크론탭 파일의 한줄과 같다. 크론 잡은 잡을 크론 형식으로 쓰여진 주어진 일정에 따라 주기적으로 동작시킨다.

# 크론 스케쥴 문법
# ┌───────────── 분 (0 - 59)
# │ ┌───────────── 시 (0 - 23)
# │ │ ┌───────────── 일 (1 - 31)
# │ │ │ ┌───────────── 월 (1 - 12)
# │ │ │ │ ┌───────────── 요일 (0 - 6) (일요일부터 토요일까지;
# │ │ │ │ │                                   특정 시스템에서는 7도 일요일)
# │ │ │ │ │                                   또는 sun, mon, tue, wed, thu, fri, sat
# │ │ │ │ │
# * * * * *
# 매 3분 마다 동작하는 크론잡
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cron-job
spec:
  schedule: "*/3 * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          lables:
            app: cron-job
        spec:
          containers:
          - name: lion-batch
            image: teacherssamko/batch-job
          restartPolicy: OnFailure
728x90
반응형

'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: Intro  (0) 2023.09.12

댓글