클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

쿠버네티스 오브젝트를 CRUD(Create, Read, Update, Delete)하기 위해서는 쿠버네티스의 명령어와 옵션에 대해 알아야 합니다.
무수히 많은 명령어와 옵션들이 있지만 가장 자주 사용하는 핵심 명령어는 아래와 같습니다.
이 정도만 알아도 쿠버네티스 오브젝트를 처리하는데는 사실 큰 무리가 없습니다.

아래 명령어들을 CRUD별로 생각하시면 기억하기 쉽습니다.
‘C’는 apply, ‘R’은 get과 describe, ‘U’는 edit, ‘D’는 delete이고 파드 처리 명령어로 logs, exec가 있습니다.

쿠베컨트롤kubectl의 사용 문법은 아래 형식입니다.
kubectl {COMMAND} {리소스 종류} {오브젝트명} {Options}
항상 위 4개 부분이 다 필요한게 아니라, 명령어에 따라 리소스 종류까지만 입력해도 됩니다.
{Options}가 {오브젝트명} 앞에 와도 상관 없습니다.

예1) kubectl get deploy member -o yaml
위 명령을 풀어 쓰면 ‘디플로이먼트 오브젝트 member의 정의 내용을 야믈 형식으로 보여 주세요'가 됩니다.

예2) kubectl get po -n ott
위 명령은 ‘네임스페이스 ott의 모든 파드 목록을 보여 주세요'가 됩니다.

※ 대괄호로 감싼 부분은 생략 가능하다는 의미임

1. 오브젝트 생성
kubectl apply OR create -f {yaml 경로} [-n {네임스페이스}]
  •  yaml 변경 후 update도 kubectl apply로 함
  •  kubectl create와 replace대신 apply 사용 권장
  •  {yaml 경로}는 야믈 파일, 디렉토리, URL로 지정할 수 있음

2 오브젝트 기본정보 조회
kubectl get {리소스종류} [{오브젝트명}] [{Options}] [-n {네임스페이스}]
  •  -w : 오브젝트 상태 변화 실시간 보기 
  •  -o wide : 보다 많은 정보 보기
  •  -o yaml : yaml 보기. -o yaml > {filepath} 로 파일 저장 후 가공하여 많이 사용
  •  -A : 모든 namespace에서 결과 리턴
  •  --show-labels: 리소스 label 같이 표시
kubectl get all도 많이 사용 
watch kubectl get {리소스종류} [{오브젝트명}] [{Options}] [-n {네임스페이스}] 로 실시간 상태 보기도 많이 사용


3 오브젝트 상세정보 조회
kubectl describe {리소스종류} {오브젝트명} [-n {네임스페이스}] 

4 파드 로그 보기
kubectl logs [-f] {파드명} [-c {컨테이너명}] [-n {네임스페이스}] 
  •  ‘-f’ 옵션을 주면 실시간으로 콘솔 로그를 계속 볼 수 있음
  •  ‘-c {컨테이너명}’은 파드안에 2개 이상의 컨테이너가 있는 경우 사용

5 파드 내 명령 실행
kubectl exec -it {파드명} [-n {네임스페이스}] -- {명령}
  •  kubectl exec -it {파드명} -- sh 로 내부로 터미널 접속도 많이 사용 

6. 오브젝트 수정
kubectl edit {리소스종류} {오브젝트명} [-n {네임스페이스}]
  •  명령 실행하면 편집기로 yaml 내용 표시되며 수정 후 저장하면 즉시 변경사항 반영됨

7 오브젝트 삭제
kubectl delete {리소스종류} {오브젝트명 OR yaml 경로} [-n {네임스페이스}]
  •  kubectl delete {리소스종류} --all 로 해당 리소스 종류를 한꺼번에 삭제할 수 있음
  •  yaml 경로는 야믈 파일, 디렉토리, URL로 지정할 수 있음
  •  PVC 삭제 전에 참조하고 있는 모든 파드를 먼저 삭제해야 함
  •  PV 삭제 전에 바인딩 된 PVC를 먼저 삭제해야 함

 kubectl delete {리소스종류} --all  로 리소스종류로 만든 모든 객체를 삭제할 수 있음(사용 시 한번 다 지원도 되는지 생각하고 사용)  


매번 ‘-n {네임스페이스}’ 옵션을 붙여 주는 것이 불편할 겁니다.
아래 명령으로 현재 네임스페이스를 바꿀 수 있습니다.
$ kubectl config set-context --current --namespace={네임스페이스}

좀 더 편하게 현재 네임스페이스를 변경하고 싶으면 쿠베엔에스kubens라는 유틸리티를 설치하십시오.
앞으로 네임스페이스를 변경할 일이 많으므로 설치하여 주시기 바랍니다.

[root@osboxes ~]# git clone https://github.com/ahmetb/kubectx /opt/kubectx
Cloning into '/opt/kubectx'...

[root@osboxes ~]# ln -s /opt/kubectx/kubens /usr/local/bin/kubens

[root@osboxes ~]# ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
[root@osboxes ~]# which kubens
/usr/local/bin/kubens


‘-c’ 옵션으로 현재 네임스페이스를 확인할 수 있고 ‘kubens {네임스페이스}’명령으로 현재 네임스페이스를 편하게 바꿀 수 있습니다.

[root@osboxes ~]# kubens -c
ott
[root@osboxes ~]# kubens default
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "default".
[root@osboxes ~]# kubens ott
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "ott".


또한 ‘kubectx’는 쿠버네티스 클러스터를 변경해 주는 유틸리티입니다. 멀티 클러스터를 운영할 때는 꼭 필요한 유틸리티입니다. 사용법은 ‘kubens’와 동일합니다.

위 명령어들은 여러분 각자 한번 실습해 보십시오.
앞으로 과정을 진행하면서 많이 사용할 것이므로 별도의 실습 과정은 생략 하겠습니다.
다만 apply와 delete 명령에서 URL과 디렉토리를 사용하는 방법만 한번 해보겠습니다.

URL을 사용하여 서비스 ‘member’를 삭제하고 다시 생성해 보겠습니다.
아래와 같이 URL을 이용하여서도 오브젝트를 생성하고 삭제할 수 있습니다.

[root@osboxes temp]# k delete -f https://hiondal.github.io/k8s-yaml/3.4/svc-member.yaml
service "member" deleted
[root@osboxes temp]# k apply -f https://hiondal.github.io/k8s-yaml/3.4/svc-member.yaml
service/member created


이번에는 디렉토리를 지정하여 오브젝트를 지우고 생성해 보겠습니다.
깃허브에서 ‘~/k8s/temp’디렉토리로 서비스 ‘member’와 컨피그맵 ‘member-cm’에 대한 야믈 파일을 다운로드 하십시오. 기존에 테스트로 만든 mying.yaml과 mysvc.yaml, mycm.yaml이 생겼을 겁니다.

[root@osboxes temp]# cd ~/k8s/temp
[root@osboxes temp]# wget -O mysvc.yaml https://hiondal.github.io/k8s-yaml/3.4/svc-member.yaml
[root@osboxes temp]# wget -O mycm.yaml https://hiondal.github.io/k8s-yaml/3.4/cm-member.yaml
[root@osboxes temp]# ll
total 12
-rw-r--r--. 1 root root 128 Jan  8 11:17 mycm.yaml
-rw-r--r--. 1 root root 633 Jan  9 01:52 mying.yaml
-rw-r--r--. 1 root root 183 Jan  8 11:17 mysvc.yaml


이제 디렉토리를 지정하여 한꺼번에 오브젝트들을 지워 보겠습니다.

[root@osboxes temp]# k delete -f .
configmap "member-cm" deleted
ingress.networking.k8s.io "ottnew" deleted
service "member" deleted


이번에는 디렉토리를 지정하여 한꺼번에 오브젝트들을 생성해 보겠습니다.

[root@osboxes temp]# k apply -f .
configmap/member-cm created
ingress.networking.k8s.io/ottnew created
service/member created


당연히 특정 오브젝트를 지울때 야믈파일을 지정해서 지우는것도 됩니다. 인그레스 ‘ottnew’는 더 이상 필요 없으므로 야믈 파일을 이용하여 지우겠습니다.

[root@osboxes temp]# k delete -f mying.yaml
ingress.networking.k8s.io "ottnew" deleted
[root@osboxes temp]# k get ing
NAME   CLASS    HOSTS                      ADDRESS         PORTS   AGE
ott    <none>   ott.169.56.70.201.nip.io   169.56.70.201   80      7h18m

 

참고) 객체 삭제가 안되는 경우 강제 삭제

'--force --grace-period=0' 옵션을 사용하세요.  --grace-period는 안전한 삭제를 위해 대기하는 시간입니다. 

예) k delete pod member-xxxx --force --grace-period=0  

참고) 강제삭제로도 안되는 경우 삭제하는 방법

특히 PV가 강제 삭제로도 안 지워지는 경우가 많습니다. 아래 명령으로 지우세요. 

kubectl patch pv {pv 객체명} -p '{"metadata":{"finalizers":null}}'

metadata.finalizers가 없어서 위 명령으로 안 지워지면 'edit'명령으로 열어 'finalizers: null'을 추가하면 됩니다. 

https://happycloud-lee.tistory.com/174

 

pv,pvc,namespace 강제 삭제

[출처] nevido.tistory.com/640 pv나 pvc삭제시 kubectl delete pv/pv-name or pvc/pvc-name으로 안될때 --grace-period=0 이 옵션을 해보고 안되면 --grace-period=0 --force 이것도 안될경우 edit후 - kubernetes.io/pv-protection 해당 부

happycloud-lee.tistory.com

 

 


쿠버네티스 쉽게 이해하기 시리즈 목차

[쿠버네티스 쉽게 이해하기 1] 쿠버네티스 설치하기
[쿠버네티스 쉽게 이해하기 2] 쿠버네티스 아키텍처
[쿠버네티스 쉽게 이해하기 3] 한장으로 이해하는 쿠버네티스 리소스
[쿠버네티스 쉽게 이해하기 4] 쿠버네티스 개발에서 배포까지 실습
[쿠버네티스 쉽게 이해하기 5] 쿠버네티스 오브젝트 정의 파일 쉽게 만들기
[쿠버네티스 쉽게 이해하기 6] 꼭 알아야 할 쿠버네티스 주요 명령어
[쿠버네티스 쉽게 이해하기 7] 파드 실행 및 통제를 위한 워크로드 컨트롤러
[쿠버네티스 쉽게 이해하기 8] 파드 로드 밸런서 서비스
[쿠버네티스 쉽게 이해하기 9] 서비스 로드 밸런서 인그레스
[쿠버네티스 쉽게 이해하기 10] 환경변수 컨피그맵과 시크릿
[쿠버네티스 쉽게 이해하기 11] 데이터 저장소 사용을 위한 PV/PVC
[쿠버네티스 쉽게 이해하기 12] 헬스 체크를 위한 스타트업 프로브, 라이브니스 프로브, 레디니스 프로브
[쿠버네티스 쉽게 이해하기 13] 통합 로깅을 위한 EFK 스택
[쿠버네티스 쉽게 이해하기 14] 인증Authentication과 알백RBAC 방식의 인가Authorization
[쿠버네티스 쉽게 이해하기 15] 더 알면 좋을 주제들: 무중단 배포, 모니터링, HPA

댓글

클라우드 네이티브 애플리케이션 부트캠프 알림