서론
kubectl 명령어를 통해서 어떻게 파드를 생성하고 디버깅하는지 알아보자.
클러스터 컴포넌트 상태 확인, 생성, 수정
우선 클러스터에 포함된 노드의 상태를 알아보자
kubectl get nodes
클러스터에서 구동중인 파드의 상태를 알아보자
kubectl get pods
클러스터의 서비스들의 상태를 알아보자
kubectl get services
get
명령어는 쿠버네티스 클러스터에 존재하는 특정 컴포넌트들의 정보를 리스트 형식으로 가져올 수 있다.
create
명령어는 쿠버네티스 클러스터에 특정 컴포넌트를 생성할 수 있다.
여기 나와있는 컴포넌트들을 생성할 수 있다. (kubectl create -h
를 입력하면 볼 수 있다.)
살펴보면 '파드'가 없다는 것을 확인할 수 있다.
파드는 쿠버네티스 클러스터에서 직접적으로 생성할 수 없다. 파드를 생성하기 위해서는 파드에 대해 추상적으로 레이어드된 deployment 라는 명령을 사용해야 한다.
Usage:
kubectl create deployment NAME --image=image [--dry-run] [options]
deployment를 만들기 위해서 deployment의 NAME을 설정해 주어야 하고, 생성에 필요한 image를 설정해 주어야 한다. image는 docker image를 사용할 수 있다.
Nginx deployment를 실제로 생성해 보자.
kubectl create deployment nginx-deployment --image=nginx
nginx-deployment라고 불리는 deployment를 생성했다.
시간이 조금 지나서 kubectl get deployment
명령어와 kubectl get pods
를 입력하면 아래와 같은 상태를 확인할 수 있다.
따라서 deployment는 파드를 생성하는 청사진(blueprint)으로 볼 수 있다.
그리고 파드를 생성하면 파드의 replica를 관리하는 Replicaset이 지정된다.
kubectl get replicaset
명령어를 통해서 확인해 보자.
NAME 부분에 보이는 hash 값 prefix가 파드에 있는 hash값의 prefix와 동일한 것을 볼 수 있다.
Replicaset을 알아보았지만 실제로 replica의 생성,수정 및 삭제를 위해서 replicaset을 사용할 일이 없다.
deployment를 통해서 직접적으로 설정하는게 더 편리하고 훨씬 좋은 방법이다.
deployment가 replicaset을 관리하고, 파드들의 상태를 설정해주기 때문에 deployment 에서 직접 replica를 변경하는 것이 더 편하고 통일성 있기 때문이다.
deployment와 replicaset의 관계처럼 쿠버네티스는 무언가를 직접적으로 관리하지 않고, 추상화된 계층을 통해서 관리하게 된다. Deployment는 ReplicaSet을 관리하고, ReplicaSet은 Pod를 관리하고 Pod는 Container에 대한 추상화이다.
deployment를 직접 수정해서 파드를 관리해 보자.
kubectl edit deployment nginx-deployment
위 명령어를 입력하면 아래와 같은 파일이 나타날 것이다.
# 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: apps/v1
kind: Deployment
metadata:
...
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx-deployment
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx-deployment
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
...
중간에 spec 부분의 image를 보면 우리가 deployment를 생성할 때 사용했던 nginx가 적혀있음을 볼 수 있다.
nginx의 버전을 nginx:1.16으로 변경하고 저장해 보자.
이때 들여쓰기가 잘못되면 오류가 발생하니 주의하자
nginx -> nginx:1.16
그리고 kubectl get pods
명령어를 입력하면 pod의 이름에 붙어있던 hash값이 달라져 있고, AGE도 갱신되었음을 볼 수 있다.
수정 전 파드는 삭제되고, 새로운 이미지에 맞는 파드로 교체된 것이다.
kubectl get replicaset
명령어를 입력해 보면 이전 replicaset이 사라지고 새로운 replicaset이 생겼음을 확인할 수 있다.
deployment에 관련된 파일을 수정했을 뿐인데 자동으로 파드 및 레플리카셋이 수정됨을 볼 수 있었다.
파드 디버깅
새로운 deployment를 생성해보자.
kubectl create deployment mongo-depl --image=mongo:3.2
mongo 버전을 설정해주지 않고 lastest 이미지로 생성하면 CrashLoopBackOff 에러가 발생할 것이다.
파드의 상태 변화를 관찰하고 싶다면
kubectl describe pod [파드이름]
위 명령어를 사용하면 다음과 같이 파드의 정보와 상태 변화를 볼 수 있다.
파드가 생성되면 아래 명령어를 사용해 로그를 출력할 수 있다.
kubectl logs [파드이름]
파드의 컨테이너 내부로 직접 들어가는 방법도 있다.
kubectl exec -it 파드이름 -- bin/bash
docker에서 컨테이너로 들어가는 것과 거의 동일하다.
나갈 땐 exit
명령어를 사용한다.
deployment 삭제
kubectl delete deployment [deployment이름]
Apply Configuration File
deployment를 생성할 때 커맨드 라인을 통해 원하는 옵션을 줄 수 있다.
kubectl create deployment name image option1 option2 ...
관리자가 원하는 만큼의 옵션을 deployment를 생성할 때마다 터미널에 입력해주는건 매우 비효율적이고 실수를 유발할 수 있다.
어떤 컴포넌트를 원하고, 이름은 무엇인지, 이미지를 어떤걸 사용할지, 옵션을 무엇을 넣을지를 가지고 있는 설정 파일이 있고 이를 실행만 하면 원하는 deployment를 생성할 수 있다면 정말 편할 것이다.
kubectl apply 명령어는 이를 실현해 준다.
apply 명령어는 설정파일을 매개변수로 받는다.
kubectl apply -f [file name]
아래 설정 파일을 nginx-deployment.yaml 로 생성한다. (들여쓰기 주의)
apiVersion: apps/v1 # 쿠버네티스 api 버전
kind: Deployment # 생성할 컴포넌트 종류
metadata:
name: nginx-deployment # deployment의 이름
labels:
app: nginx # label 지정
spec: # deployment의 스펙을 정의
replicas: 1 # 1개의 pod 설정
selector: # deployment가 관리할 pod를 찾는 방법을 정의
matchLabels:
app: nginx
template: # pod의 blueprint
metadata:
labels: # pod의 label
app: nginx
spec: # pod의 스펙을 정의
containers: # 컨테이너 설정
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
이제 deployment를 생성할 수 있다.
kubectl apply -f nginx-deployment.yaml
만약 deployment를 수정하고 싶으면
- nginx-deployment.yaml 파일을 수정한다.
kubectl apply -f nginx-deployment.yaml
명령어를 수행해서 변경사항을 적용시킨다.
쿠버네티스는 nginx-deployment.yaml에 적힌대로 새로운 deployment를 생성하려 하겠지만, 기존에 같은 설정파일로 만들어진 deployment를 감지해서 해당 deployment를 업데이트 한다.
하지만 deployent가 업데이트 되었다고 해서 기존의 deployment가 사라지지는 않는다.
요약
출처 : https://www.youtube.com/watch?v=X48VuDVv0do
번역 : 나
Chapter : Main Kubectl Commands
'DevOps > Kubernetes' 카테고리의 다른 글
[kubernetes] #7 Demo 프로젝트: MongoDB + MongoExpress (0) | 2022.03.03 |
---|---|
[kubernetes] #6 쿠버네티스 YAML 설정 파일 (0) | 2022.03.02 |
[kubernetes] #4 Minikube와 kubectl - 클러스터 구축 (0) | 2022.02.28 |
[kubernetes] #3 쿠버네티스 아키텍처 (0) | 2022.02.27 |
[Kubernetes] #2 핵심 쿠버네티스 컴포넌트 (0) | 2022.02.27 |