Justin의 개발 로그
article thumbnail

https://v1-20.docs.kubernetes.io/ko/docs/reference/kubectl/cheatsheet/

kubenetes_intro.zip
0.01MB

 

*#쿠버네티스의 리소스 목록 *

$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


annotations <map[string]string>
clusterName
...
labels <map[string]string>
managedFields <[]Object>
apiVersion
fieldsType
fieldsV1 <map[string]>
...
name
namespace
...
uid
spec
activeDeadlineSeconds

... 생략

 

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
profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!