반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- blue/green
- Argo
- xdp
- mlops
- 오퍼레이터
- argocd
- gitops
- Continuous Deployment
- Model Serving
- eBPF
- seldon core
- Kubeflow
- operator
- tekton
- CANARY
- Kubernetes 인증
- kubernetes operator
- opensearch
- CI/CD
- 카오스 엔지니어링
- Litmus
- knative
- opentelemetry
- keda
- nginx ingress
- serving
- Pulumi
- Kopf
- MLflow
- Kubernetes
Archives
- Today
- Total
Kubernetes 이야기
kubectl 활용 팁 본문
반응형
Kubectl는 Kubernetes에서 엔지니어들이 가장 많이 사용하는 도구일 것이다. Kubectl에서 자주 사용되는 명령어들을 알아보자.
명령 자동 완성
명령 자동 완성을 사용하면 Tab 키를 사용하여 kubectl 명령의 개별 부분을 자동 완성할 수 있다. 자동 완성을 위해서는 .bashrc 파일에 아래를 추가한다.
source <(kubectl completion bash)
만약 bash-completion 이 설치되어 있지 않으면 리눅스에 설치를 진행해야 한다.
ubuntu : sudo apt-get install bash-completion
redhat : yum install bash-completion
리소스 사양 조회
yaml을 만들 때 Kubernetes의 리소스 사양을 조회하고자 하는 경우가 있다. 이때는 kubectl explain [resource] 로 조회할 수 있다.
$ kubectl explain deployments --recursive | more
KIND: Deployment
VERSION: apps/v1
DESCRIPTION:
Deployment enables declarative updates for Pods and ReplicaSets.
FIELDS:
apiVersion <string>
kind <string>
metadata <Object>
annotations <map[string]string>
creationTimestamp <string>
deletionGracePeriodSeconds <integer>
deletionTimestamp <string>
finalizers <[]string>
generateName <string>
generation <integer>
labels <map[string]string>
managedFields <[]Object>
apiVersion <string>
fieldsType <string>
fieldsV1 <map[string]>
manager <string>
operation <string>
subresource <string>
time <string>
name <string>
namespace <string>
...
apiserver의 resource들은 다음 명령을 통해 조회할 수 있다.
$ kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
...
Context
기본 Namespace 변경
# kubectl config set-context $(kubectl config current-context) --namespace=<namespace>
현재 Context 조회 및 변경
# kubectl config current-context
# kubectl config use-context <context>
Yaml 생성
Pod 생성
kubectl run pod --image=nginx:latest \
--labels type=web \
--dry-run=client -o yaml > pod.yaml
Service 생성
kubectl expose pod mypod \
--port=80 \
--name mypod-service \
--type=NodePort \
--dry-run=client -o yaml > mypod-service.yaml
deployment 생성
kubectl create deployment mydeployment \
--image=nginx:latest \
--dry-run=client -o yaml > mydeployment.yaml
생성된 deployment의 service 생성
kubectl expose deployment mydeployment \
--type=NodePort \
--port=8080 \
--name=mydeployment-service \
--dry-run=client -o yaml > mydeployment-service.yaml
Job 생성
kubectl create job myjob \
--image=nginx:latest \
--dry-run=client -o yaml
Cronjob 생성
kubectl create cj mycronjob \
--image=nginx:latest \
--schedule="* * * * *" \
--dry-run=client -o yaml
Labels 정보 조회
$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
canary-58dc8b498f-bbrss 1/1 Running 0 8d app=canary,pod-template-hash=58dc8b498f
hello-84695987b6-l2rkh 1/1 Running 0 3d app=hello,pod-template-hash=84695987b6
...
특정 Label을 가진 Pod 조회
# kubectl get pods -l 'app in (production,hello),region notin (busan)'
JSONPath 표현식
특정 필드의 값을 조회하는 경우 custom-columns 를 사용한다.
# Select all elements of a list
kubectl get pods -o custom-columns='NAME:metadata.name,DATA:spec.containers[*].image'
# Select a specific element of a list
kubectl get pods -o custom-columns='DATA:spec.containers[0].image'
# Select those elements of a list that match a filter expression
kubectl get pods -o custom-columns='DATA:spec.containers[?(@.image!="nginx")].image'
# Select all fields under a specific location, regardless of their name
kubectl get pods -o custom-columns='DATA:metadata.*'
# Select all fields with a specific name, regardless of their location
kubectl get pods -o custom-columns='DATA:..image'
Go-template
# range fetch fields
kubectl get pod -n kube-system -ogo-template='{{range .items}}{{ .metadata.name }}{{end}}'
# printf change format
kubectl get pod -n kube-system -ogo-template='{{range .items}}{{ printf "%s\n" .metadata.name }}{{end}}'
# printf multi fields
kubectl get pod -n kube-system -ogo-template='{{range .items}}{{ printf "%-20s%-50s\n" .metadata.namespace .metadata.name }}{{end}}'
# get nodePort if exists
kubectl get svc -nkube-system -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}{{end}}'
Kubectl get
# Name으로 정렬된 서비스의 목록 조회
kubectl get services --sort-by=.metadata.name
# 원시 출력
kubectl get --raw=/apis/apps/v1/deployments
# metrics 정보
kubectl get --raw /metrics
# 모든 Namespace의 Warning이벤트만 조회
kubectl get events -w --field-selector=type=Warning -A
# 재시작 횟수로 정렬된 파드의 목록 조회
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
# PersistentVolumes을 용량별로 정렬해서 조회
kubectl get pv --sort-by=.spec.capacity.storage
# app=cassandra 레이블을 가진 모든 파드의 레이블 버전 조회
kubectl get pods --selector=app=cassandra -o \
jsonpath='{.items[*].metadata.labels.version}'
# 'ca.crt'와 같이 점이 있는 키값을 검색한다
kubectl get configmap myconfig \
-o jsonpath='{.data.ca\.crt}'
# 네임스페이스의 모든 실행 중인 파드를 조회
kubectl get pods --field-selector=status.phase=Running
# 모든 노드의 외부IP를 조회
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
# 외부 도구 없이 디코딩된 시크릿 출력
kubectl get secret my-secret -o go-template='{{range $k,$v := .data}}{{"### "}}{{$k}}{{"\n"}}{{$v|base64decode}}{{"\n\n"}}{{end}}'
# 파드에 의해 현재 사용되고 있는 모든 시크릿 목록 조회
kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
# 타임스탬프로 정렬된 이벤트 목록 조회
kubectl get events --sort-by=.metadata.creationTimestamp
리소스 패치
# 노드를 부분적으로 업데이트
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" } }]'
# 디플로이먼트의 scale 서브리소스를 패치하여 레플리카 수 업데이트
kubectl patch deployment nginx-deployment --subresource='scale' --type='merge' -p '{"spec":{"replicas":2}}'
리소스 삭제
kubectl delete pods,services -l name=myLabel # 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
RBAC 권한 조회
# kubectl auth can-i --list
# kubectl -n kube-system auth can-i --list --as system:serviceaccount:kube-system:default
kubectl plugin 만들기
/usr/local/bin/kubectl-xxx 이름으로 bash나 python, go 실행프로그램을 작성한다.
#!/bin/bash
for argv in "$*"
do
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' $argv
done
해당 shell 이름이 kubectl-img인 경우 chmod +x kubectl-img 로 변경한다. 이제 다음과 같이 kubectl 명령을 수행하면 image이름을 출력하는 plugin이 된다.
# kubectl img -n test
NAME IMAGES
canary-58dc8b498f-bbrss mirrorgooglecontainers/echoserver:1.10
hello-84695987b6-l2rkh docker.io/kmaster8/helloworld:2.0
production-846769889f-g2dck mirrorgooglecontainers/echoserver:1.10
production-846769889f-t8bwv mirrorgooglecontainers/echoserver:1.10
참고
반응형
'Kubernetes > 일반' 카테고리의 다른 글
minikube 설치 (0) | 2022.10.03 |
---|---|
kubernetes 1.24에서 service accounts와 secret (0) | 2022.10.01 |
Kubernetes EndpointSlices (0) | 2022.09.06 |
Kubernetes에서 NodeLocal DNSCache 사용 (0) | 2022.09.06 |
Finalizers, ownerReferences (0) | 2022.08.30 |
Comments