2020/01/07 - [클라우드/Kubernetes] - 쿠버네티스 - 오브젝트 설명
쿠버네티스 - 오브젝트
쿠버네티스 소개 컨테이터 운영환경 중 가장 널리 사용되는 솔루션이 kubernetes(K8s=K와 S사이에 8개의 문자가 있어서) 이다. 구글은 내부 서비스를 클라우드 환경에서 운영하고 있으며 컨테이너 환경을 사용해왔..
base-on.tistory.com
1. kubenetes 설정 보기
kubectl config view
kubectl config view -o jsonpath='{.users[].name}' // 첫 번째 사용자 출력
kubectl config get-contexts //컨텍리스트 출력
kubectl config current-context // 현재 컨텍스트 출력
//기본 인증을 지원하는 새로운 클러스터를 kubeconf에 추가한다
kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword
//해당 컨텍스트에서 모든 후속 kubectl 커맨드에 대한 네임스페이스를 영구적으로 저장한다
kubectl config set-context --current --namespace=[namespace]
// 특정 사용자와 네임스페이스를 사용하는 컨텍스트 설정
kubectl config set-context gce --user=cluster-admin --namespace=foo && kubectl config use-context gce
//사용자 park삭제
kubectl config unset users.park
2. apply
리소스를 정의하는 파일을 통해 어플리케이션을 관리한다. kubectl apply를 통하여 리소스를 생성/업데이트
오브젝트생성(yaml, json 파일을 통해 사용됨)
kubectl apply -f [file_path] //리소스 생성
kubectl apply -f [file_path] [file_path] // 여러 파일로 부터 생성
kubectl apply -f [dir_path] //dir_path에 있는 파일들을 사용해서 리소스생성
kubectl apply -f [url] //url로부터 리소스 생성
kubectl create deployment nginx --image=nginx //nginx 단일 인스턴스를 시작
kubectl explain pods,svc //파드와 서비스 미니패스트 문서를 조회
3. get, describe, diff 리소스 조회 및 검색
2020/01/07 - [클라우드/Kubernetes] - 쿠버네티스 - 오브젝트 설명
-----------------get---------------------
kubectl get [ object(pod,service,pvc..) ] [option]
kubectl get services //네임스페이스 내 모든 서비스 목록조회
kubectl get pods --all-namespace //네임스페이스 내 모든 파드 상세목록 조회
kubectl get pods -o wide //상세하게 조회 (pod가 설치된 노드 위치 등..)
kubectl get pods //파드 목록조회
kubectl get pod my-pod -o -yaml //파드의 yaml파일 조회
kubectl get pod my-pod -o wide --export // 클러스터 명세 없이 파드의 yaml조회
kubectl get service --sort-by=.meta.name //name으로 정렬된하여 출력
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' //재시작 횟수로 정렬된 파드의 목록조회
kubectl get pv -n [name_space] --sort-by=.spec.capactiy.storage //네임스페이스중 용량순으로 출력
kubectl get pods --selector=app=[레이블] -o jsonpath='{.item[*].metadata.labels.version}' //app=[레이블]과 같은 모든 파드의 레이블 버전확인
kubectl get node --selector=='!node-role.kubernetes.io/master' //셀렉터를 이용하여 일치하지 않는 목록출력
kubectl get pods --field-selector=status.phase=Running //네임스페이스의 모든 실행중인 파드를 조회
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' // clusterIP설정 확인
kubectl get pods --show-labels //파드의 레이블 조회
kubectl get events --sort-by=.metadata.creationTimestamp // 타임스템프 이벤트 조회
--------------describe-------------------
kubectl describe [ object ] [name]
kubectl describe nodes [node_name] //노드 상세출력
kubectl describe pods [pod_name] //pod 상세 출력
-----------------diff--------------------
kubectl diff -f ./my-manifest.yaml //매니페스트가 적용된 경우 클러스터의 현재 상태와 클러스터의 상태를 비교
4. 업데이트 rollout ,rolling-update, replace, expose, label, annotatem autoscale
2020/01/07 - [클라우드/Kubernetes] - 쿠버네티스 - 오브젝트 설명
kubectl set image deployment/[이름] www=image:v2 //[이름] 디플로이먼트의 "www" 컨테이너 이미지를 업데이트하는 롤링 업데이트
kubectl rollout history deployment/[이름] // 현 리비전을 포함한 디플로이먼트의 이력을 체크
kubectl rollout undo deployment/[이름] // [이름] 이전 디플로이먼트로 롤백*undo
kubectl rollout undo deployment/[이름] --to-revision=2 // 특정 리비전으로 롤백 * --to-revision=2
kubectl rollout status -w deployment/[이름] // 완료될 때까지 "frontend" 디플로이먼트의 롤링 업데이트 상태를 감시
kubectl rollout restart deployment/[이름] // [이름] 디플로이먼트의 롤링 재시작
# 버전 1.11 부터 사용 중단
kubectl rolling-update [이름]-v1 -f [이름]-v2.json // (사용중단-) [이름]-v1 파드의 롤링 업데이트 *rolling-update
kubectl rolling-update [이름]d-v1 [이름]-v2 --image=image:v2 // (사용중단) 리소스 이름 변경과 이미지 업데이트*--image=image:v2
kubectl rolling-update [이름] --image=image:v2 //(사용중단) 프론트엔드의 파드 이미지 업데이트
kubectl rolling-update [이름]-v1 [이름]-v2 --rollback // (사용중단) 진행중인 기존 롤아웃 중단
cat pod.json | kubectl replace -f - // std로 전달된 JSON을 기반으로 파드 교체
// 리소스를 강제 교체, 삭제 후 재생성함. 이것은 서비스를 중단시킴.
kubectl replace --force -f ./pod.json
// 복제된 nginx를 위한 서비스를 생성한다. 80 포트로 서비스하고, 컨테이너는 8000 포트로 연결한다.
kubectl expose rc nginx --port=80 --target-port=8000
// 단일-컨테이너 파드의 이미지 버전(태그)을 v4로 업데이트
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -
kubectl label pods [이름] new-label=awesome //레이블 추가
kubectl annotate pods [이름] icon-url=http://goo.gl/XXBTWq //어노테이션 추가
kubectl autoscale deployment [이름] --min=2 --max=10 // 디플로이먼트[이름] 오토스케일
4-1. 리소스 패치
patch , node, pod, deployment
--type json -p='json 파일 부분 '
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}' //노드를 부분적으로 업데이트
// 컨테이너의 이미지를 업데이트. 병합(merge) 키이므로, spec.containers[*].name이 필요.
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
// 위치 배열을 이용한 json 패치를 사용하여, 컨테이너의 이미지를 업데이트.
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'
// 위치 배열을 이용한 json 패치를 사용하여 livenessProbe 디플로이먼트 비활성화.
kubectl patch deployment valid-deployment --type json -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'
// 위치 배열에 새 요소 추가
kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'
5. 리소스 편집 edit,KUBE_EDITOR="편집기 이름"
kubectl edit svc/docker-registry // docker-registry라는 서비스 편집 *edit
KUBE_EDITOR="nano" kubectl edit svc/docker-registry // 다른 편집기 사용
6. 리소스 스케일링( scale , --replicas=숫자 --current-replicas=2 --replicas=3 -> 현재 2이면 3으로 변경)
kubectl scale --replicas=3 rs/foo // 'foo'라는 레플리카 셋을 3으로 스케일
kubectl scale --replicas=3 -f foo.yaml // "foo.yaml"에 지정된 리소스의 크기를 3으로 스케일
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql // mysql이라는 디플로이먼트의 현재 크기가 2인 경우, mysql을 3으로 스케일
kubectl scale --replicas=5 rc/foo rc/bar rc/baz // 여러 개의 레플리케이션 컨트롤러 스케일
7. 리소스 삭제 (delete / object, object object , -l 라벨이름 ,-include-uninitialized , --all)
kubectl delete -f ./pod.json // pod.json에 지정된 유형 및 이름을 사용하여 파드 삭제
kubectl delete pod,service baz foo // "baz", "foo"와 동일한 이름을 가진 파드와 서비스 삭제
kubectl delete pods,services -l name=myLabel //name=myLabel 라벨을 가진 파드와 서비스 삭제
kubectl delete pods,services -l name=myLabel --include-uninitialized // 초기화되지 않은 것을 포함하여, name=myLabel 라벨을 가진 파드와 서비스 삭제
kubectl -n my-ns delete pod,svc --all //초기화되지 않은 것을 포함하여, my-ns 네임스페이스 내 모든 파드와 서비스 삭제
//awk pattern1 또는 pattern2에 매칭되는 모든 파드 삭제
kubectl get pods -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n mynamespace pod
8. 실행 중인 파드와 상호 작용(logs , run attach, port -forward, exec , top)
kubectl logs my-pod //파드 로그(stdout) 덤프
kubectl logs -l name=myLabel // name이 myLabel인 파드 로그 덤프 (stdout)
kubectl logs my-pod --previous //컨테이너의 이전 인스턴스 생성에 대한 파드 로그(stdout) 덤프
kubectl logs my-pod -c my-container //파드 로그(stdout, 멀티-컨테이너 경우) 덤프
kubectl logs -l name=myLabel -c my-container // name이 myLabel인 파드 로그 덤프 (stdout)
kubectl logs my-pod -c my-container --previous // 컨테이너의 이전 인스턴스 생성에 대한 파드 로그(stdout, 멀티-컨테이너 경우) 덤프
kubectl logs -f my-pod // 실시간 스트림 파드 로그(stdout)
kubectl logs -f my-pod -c my-container //실시간 스트림 파드 로그(stdout, 멀티-컨테이너 경우)
kubectl logs -f -l name=myLabel --all-containers // name이 myLabel인 모든 파드의 로그 스트리밍 (stdout)
kubectl run -i --tty busybox --image=busybox -- sh // 대화형 셸로 파드를 실행
kubectl attach my-pod -i // 실행중인 컨테이너에 연결
kubectl port-forward my-pod 5000:6000 //로컬 머신의 5000번 포트를 리스닝하고, my-pod의 6000번 포트로 전달
kubectl exec my-pod -- ls / // 기존 파드에서 명령 실행(한 개 컨테이너 경우)
kubectl exec my-pod -c my-container -- ls / // 기존 파드에서 명령 실행(멀티-컨테이너 경우)
kubectl top pod POD_NAME --containers // 특정 파드와 해당 컨테이너에 대한 메트릭 표시
9. 리소스 타입확인 ( api-resources)
kubectl api-resources
--namespaced=true // 네임스페이스를 가지는 지
--namespaced=false // 반대
-o name // 단순하게 출력
-o wide // 자세하게 출력
--verbs=list,get // "list"와 "get"의 요청 동사를 지원하는 모든 리소스 출력
--api-group=extensions // "extensions" API 그룹의 모든 리소스
10. 출력형식
정 형식으로 터미널 창에 세부 사항을 출력하려면, 지원되는 kubectl 명령에 -o (또는 --output) 플래그를 추가
-o=custom-columns=<명세> | 쉼표로 구분된 사용자 정의 열 목록을 사용하여 테이블 출력 |
-o=custom-columns-file=<파일명> | <파일명>파일에서 사용자 정의 열 템플릿을 사용하여 테이블 출력 |
-o=json | JSON 형식의 API 오브젝트 출력 |
-o=jsonpath=<템플릿> | jsonpath 표현식에 정의된 필드 출력 |
-o=jsonpath-file=<파일명> | <파일명> 파일에서 jsonpath 표현식에 정의된 필드 출력 |
-o=name | 리소스 명만 출력하고 그 외에는 출력하지 않음 |
-o=wide | 추가 정보가 포함된 일반-텍스트 형식으로 출력하고, 파드의 경우 노드 명이 포함 |
-o=yaml | YAML 형식의 API 오브젝트 출력 |
11. 로그출력 상세레벨과 디버깅
Kubectl 로그 상세 레벨(verbosity)은 -v 또는--v 플래그와 로그 레벨을 나타내는 정수로 제어
로그 레벨세부 사항
--v=0 | 일반적으로 클러스터 운영자(operator)에게 항상 보여지게 하기에는 유용함. |
--v=1 | 자세한 정보를 원하지 않는 경우, 적절한 기본 로그 수준. |
--v=2 | 서비스와 시스템의 중요한 변화와 관련이있는 중요한 로그 메시지에 대한 유용한 정상 상태 정보. 이는 대부분의 시스템에서 권장되는 기본 로그 수준이다. |
--v=3 | 변경 사항에 대한 확장 정보. |
--v=4 | 디버그 수준 상세화. |
--v=6 | 요청한 리소스를 표시. |
--v=7 | HTTP 요청 헤더를 표시. |
--v=8 | HTTP 요청 내용을 표시. |
--v=9 | 내용을 잘라 내지 않고 HTTP 요청 내용을 표시. |
참고 : https://kubernetes.io/ko/docs/reference/kubectl/cheatsheet/