https://v1-20.docs.kubernetes.io/ko/docs/reference/kubectl/cheatsheet/
*#쿠버네티스의 리소스 목록 *
$kubectl api-resources
# 리소스별 yaml 템플릿 필더 설명
$ kubectl explain pods
# 리소스 내 필드의 상세 설명
$ kubectl explain pods.metadata
# 리소스의 하위 템플릿 모두 보려면
$ kubectl explain pods --recursive
KIND: Pod
VERSION: v1
DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts.
FIELDS:
apiVersion
kind
metadata
... 생략
pod
#리소스 생성
$ kubectl apply -f pod-sample.yaml
#파드 생명 주기 확인
$ kubectl describe pods kubernetes-simple-pod
$ kubectl get po --no-headers | awk '{print $1}'
$ kubectl describe pods $(kubectl get pods --no-headers | awk '{print $1}')
#jq(JSON processor)를 이용해 json에서 원하는 값 찾기
# -o : output
$ kubectl get nodes -o json | jq -r '.items[].status.addresses[]|select(.type=="InternalIP").address'
*#jq 설치 *
$ brew install jq
# jsonpath에서 원하는 값 찾기
# JSONPath is a query language for JSON
# jsonpath 문법 설명 : https://github.com/json-path/JsonPath
$ kubectl get nodes -o jsonpath='{.items[].status.addresses[?(@.type=="InternalIP")].address}'
# 아래 구문의 결과는 모두 같음
$ kubectl get nodes -o jsonpath='{}'
$ kubectl get nodes -o jsonpath='{$}'
# 아래 구문의 결과는 모두 같음
$ kubectl get nodes -o jsonpath='{$.items}'
$ kubectl get nodes -o jsonpath='{$.items[*]}'
# 아래 구분은 첫번째 결과 1개만 나옴
$ kubectl get nodes -o jsonpath='{$.items[]}'
replicasets
지정된 숫자만큼의 파트가 실행되도록 관리하는 컨트롤러로 쿠버네티스의 가장 기본적인 컨트롤러
예전에는 레플리케이션 컨트롤러로 사용되었으나, 최근에는 기능이 추가된 레플리카세트이 주로 사용됨
집합 기반(set-based : in, notin, exists 등)의 셀럭터(selector)를 지원하는 것이 달라진 점
rolling-update 옵션이 필요한 경우 디플로이먼트(deployment)를 사용해야 함
kubectl apply -f replicaset-nginx.yaml
# 확인 (모두 동일)
kubectl get rs
kubectl get replicaset
kubectl get replicasets
#pods는 남기고 replicaset 만 삭제
kubectl delete replicaset nginx-replicaset --cascade=false
kubectl delete rs nginx-replicaset --cascade=false #동일
#replicaset 과 연결된 pods 같이 삭제
kubectl delete replicaset nginx-replicaset --cascade=true
# 레플리카세트 다시 생성
kubectl apply -f replicaset-nginx.yaml
kubectl get replicaset, pods
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-replicaset-c5k6r 1/1 Running 0 3m55s
nginx-replicaset-sd6tp 1/1 Running 0 3m55s
nginx-replicaset-sjrkd 1/1 Running 0 3m55s
kubectl get pods --no-headers | awk '{print $1}'
nginx-replicaset-c5k6r
nginx-replicaset-sd6tp
nginx-replicaset-sjrkd
kubectl get pods --no-headers | awk '{print $1}'
nginx-replicaset-c5k6r
nginx-replicaset-sd6tp
nginx-replicaset-sjrkd
kubectl get pods --no-headers | awk '{print $1}'|tail -1
nginx-replicaset-sjrkd
#포드 1개(리스트 중에 마지막 1개) 삭제
kubectl delete pods $(kubectl get pods --no-headers | awk '{print $1}'|tail -1)
#포드 확인 : 마지막 포드 삭제되었으나, 새로운 포드가 생성되어 갯수 유지됨
kubectl get pods
#포드의 .metadata.labels.app 필드 변경
kubectl edit pod $(kubectl get pods --no-headers | awk '{print $1}'|tail -1)
nginx-replicaset -> nginx-other로 변경 후 저장
#변경 후 포드 재확인
kubectl get pods -o jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.metadata.labels.app}{'\n'}"
#레플리카세트 정리
kubectl delete replicaset nginx-replicaset --cascade=true
#레플리카세트과 관리하지 않는 포드 정리
kubectl delete pods $(kubectl get pods --no-headers | grep other |awk '{print $1}'|tail -1)
참고 : awk 소개
https://recipes4dev.tistory.com/171
Deployment
레플리카세트에 배포 기능이 추가된 컨트롤러
상태가 없는 앱을 배포할 때 사용하는 컨트롤러
rolling-update : 롤링 업데이트
pause : 앱 배포를 잠시 멈춤
rollback : 이전 버전으로 롤백
kubectl apply -f deployment-nginx.yaml
kubectl get deploy,rs,rc,pods
리소스 업데이트 방법1
vi {파일명}.yaml
kubectl apply -f {파일명}.yaml
kubectl get deploy,rs,rc,pods
이미지 정보 업데이트 방법2
#Before
kubectl get pod -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.spec.containers[].image}{'\n'}"
kubectl set image deployment/nginx-deployment nginx-deployment=nginx:1.9.1
#After
kubectl get pod -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.spec.containers[].image}{'\n'}"
kubectl get deploy nginx-deployment -o=jsonpath="{.spec.template.spec.containers[0].image}"
이미지 정보 업데이트 방법3
kubectl edit deploy nginx-deployment
#nginx:1.9.1 을 nginx:1.10.1 로 변경
#변경 여부 확인
kubectl get deploy nginx-deployment -o=jsonpath="{.spec.template.spec.containers[0].image}"
디플로이먼트 롤백하기
컨테이너 이미지 변경 내역 확인
kubectl rollout history deploy nginx-deployment
특정 리비전의 상세 내용 확인
kubectl rollout history deploy nginx-deployment --revision=3
이전 리비전으로 되돌리기
kubectl rollout undo deploy nginx-deployment
#확인
kubectl get pod -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.spec.containers[].image}{'\n'}"
kubectl get deploy nginx-deployment -o=jsonpath="{.spec.template.spec.containers[0].image}"
특정 리비전으로 되돌리기
kubectl rollout undo deploy nginx-deployment --to-revision=12
kubectl get pods
kubectl get deploy nginx-deployment -o=jsonpath="{.spec.template.spec.containers[0].image}"
파드 개수 조정하기
kubectl get pods
파드 수 조정
kubectl scale deploy nginx-deployment --replicas=5
kubectl get pods
디플로이먼트 배포 정지, 배포 재개, 재시작하기
정지
kubectl rollout pause deployment/nginx-deployment
#정지 이후에는 kubectl set image 명령 등이 진행되지 않음
재개
kubectl rollout resume deploy/nginx-deployment
디플로이먼트 상태 확인
kubectl rollout status deployment/nginx-deployment
#실패 테스트를 위해 2초 데드라인 설정
kubectl patch deployment/nginx-deployment -p '{"spec":{"progressDeadlineSeconds":2}}'
kubectl get deploy nginx-deployment -o=jsonpath="{.spec.progressDeadlineSeconds}{'\n'}"
#nginx:1.14로 변경 테스트
kubectl set image deploy/nginx-deployment nginx-deployment=nginx:1.14
#결과 확인
kubectl describe deploy nginx-deployment
#ProgressDeadlineExceeded로 기준시간(데드라인) 경과로 실패 표시됨
#deployment 삭제
kubectl delete deploy nginx-deployment --cascade=true
#특정 네임스페이스(ingress-nginx)의 특정 이름으로 시작하는 pod(ingress-mall-web)의 쉘 실행하는 명령
kubectl --kubeconfig="kubeconfig_dev.yaml" exec -it $(kubectl --kubeconfig="kubeconfig_dev.yaml" get pods --no-headers --namespace ingress-nginx | grep "^ingress-mall-web" | awk '{print $1}') --namespace ingress-nginx sh
#아래는 이름으로 pod의 full-name을 찾는 방법
kubectl --kubeconfig="kubeconfig_dev.yaml" get pods --no-headers --namespace ingress-nginx | grep "^ingress-mall-web" | awk '{print $1}'
Iterm Alias 지정
cd ~
vi .zshrc
# Kubectl for NCloud
alias kubedev="kubectl --kubeconfig=/Users/{useracclount}/.ssh/ncloud/kubeconfig_xxx.yaml"
alias kubeprod="kubectl --kubeconfig=/Users/{account}/.ssh/ncloud/Kubeconfig_xxx.yaml"
'Kubernetes' 카테고리의 다른 글
Ingress (0) | 2020.06.25 |
---|---|
Service (0) | 2020.06.24 |
Deploy an app (0) | 2020.05.27 |
Simple service echoserver (0) | 2020.05.22 |
Ubuntu Docker: "Error response from daemon: client version 1.40 is too new. Maximum supported API version is 1.39" (0) | 2020.05.22 |