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
'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 |
댓글