Skip to main content

Posts

Let thine heart retain my words: Keep my commandments, and live.

자주쓰는 쿠버네티스 명령어

· 10 min read
Jeongwon Her

kubernetes
쿠버네티스 사용하기

목차

kubectl 설치

설마 kubectl이 없을까요...?
쿠버네티스를 처음 접하신다면 쿠버네티스 구조를 다룬 이글 먼저 보시는걸 추천합니다.

requirements

  • linux
  • kubernetes cluster

바이너리 설치

Details
  1. 바이너리 파일을 다운로드 합니다.
# 다음 명령으로 최신 kubectl을 다운받습니다
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

# kubectl은 kubernetes 클러스터와 마이너 버전 차이만 연동 가능합니다
# 예를 들어, v1.21 kubectl은 v1.20, v1.21, v1.22 클러스터와 연동될 수 있습니다
# version을 수정해 특정 버전을 다운받을 수 있습니다
$ curl -LO https://dl.k8s.io/release/{version}/bin/linux/amd64/kubectl

# (선택사항) sha256 체크섬 검증
$ curl -LO "https://dl.k8s.io/{version}/bin/linux/amd64/kubectl.sha256"
$ echo "$(<kubectl.sha256) kubectl" | sha256sum --check

kubectl: OK # 성공시

  1. 바이너리 파일을 설치합니다.
# 설치하기, 바이너리 파일을 이동하는 것 처럼 보입니다
$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# root 권한이 없어도 ~/.local/bin에 설치할 수 있습니다
$ mkdir -p ~/.local/bin/kubectl
$ mv ./kubectl ~/.local/bin/kubectl
# 그리고 ~/.local/bin/kubectl을 $PATH에 추가해줍니다
$ export $PATH=$PATH:~/.local/bin/kubectl

# 확인해봅시다
$ kubectl cluster-info

Kubernetes master is running at https://server-name:port
KubeDNS is running at https://server-name:port/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

# 실패시 나오는 메시지입니다
The connection to the server <server-name:port> was refused - did you specify the right host or port?
# kubernetes 클러스터와 연결이 안되거나 config 파일에 문제가 있습니다

패키지 관리자 설치

Details

apt나 yum으로 관리되게 설치할 수 있습니다.

데비안

  1. apt 인덱스 업데이트와 필요한 패키지를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl
  1. 구글 클라우드의 퍼블릭 사이닝 키를 다운받습니다.
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
  1. 쿠버네티스 apt 레프지토리를 추가합니다.
$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  1. apt 인덱스 업데이트 후 kubectl을 설치합니다.
$ sudo apt-get update
$ sudo apt-get install -y kubectl

레드햇

yum 레포지토리에 추가 후 설치합니다.

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl

다른 패키지 관리자

Details

직접 해보지 않았습니다

snap

우분투일때

$ snap install kubectl --classic
$ kubectl version --client

brew

maybe mac...

$ brew install kubectl
$ kubectl version --client

명령어

cheat sheet
도커 명령어와 유사한 명령어가 많습니다.

조회

Details

버전 조회

가볍게 시작해봅시다

$ kubectl version 

Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:36:53Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.15", GitCommit:"2adc8d7091e89b6e3ca8d048140618ec89b39369", GitTreeState:"clean", BuildDate:"2020-09-02T11:31:21Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}

노드 조회

$ kubectl get node
NAME STATUS ROLES AGE VERSION
gpuslave Ready <none> 34d v1.16.0
master Ready master 41d v1.16.0
slave Ready <none> 41d v1.16.0

노드 라벨 조회

$ kubectl get nodes –-show-labels

NAME STATUS ROLES AGE VERSION LABELS
master Ready master 37d v1.16.15 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=,type=master

namespace 조회

$ kubectl get namespace
$ kubectl get ns

NAME STATUS AGE
default Active 41d
istio-system Active 41d
kube-node-lease Active 41d
kube-public Active 41d
kube-system Active 41d
nuclio Active 6d8h

리소스 종류 조회

어떤 resource를 공부해야 할지 궁금하다면?
주의: 해당 출력은 깁니다. less나 다른 명령어 조합을 추천합니다

# 간단하지만 도움이 되는
$ kubectl api-resources

리소스 조회

리소스/커스텀 리소스 목록을 조회합니다. all을 사용해 존재하는 모든 리소스를 조회할 수 있습니다.

$ kubectl get {pod|deployment|replicationcontroller|service|all|...} [-n namespace]

# 파드 조회
NAME READY STATUS RESTARTS AGE
my-pod 1/1 Running 0 28h

wide를 사용해 자세한 내용을 출력할 수 있습니다.

$ kubectl get {resource} -o wide

# 파드 조회
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-pod 1/1 Running 0 28h 10.244.0.109 worker <none> <none>

json 파일이나 yaml 파일로 출력할 수 있습니다.

$ kubectl get {resource} -o {json|yaml}

확인하고 싶은 필드만 필터링 할 수 있습니다. 🍎

$ kubectl get {resource} -o custom-columns={NAME:json.path,NAME:json.path,CONTAINERS:.spec.containers[*].name...}

리소스

$ kubectl get nodes –-show-labels

자원 사용량 조회

heapster가 설치되어 있어야 합니다.

$ kubectl top node {nodename}

로그 확인

$ kubectl logs {resource}/{name} [-n {namespace}] [-c {container}]

리소스 생성에 문제가 있을 때는 쿠버네티스 로그만 확인할 수 있습니다

$ kubectl describe {resource}/{name} [-n {namespace}]


생성

Details

파일을 통한 리소스 생성

$ kubectl apply -f {file.yaml}

간단한 deploy는 스트림으로 생성하기도 합니다

$ kubectl apply -f -<<EOF
> ...
> EOF

서비스 생성

존재하는 deploy/pod를 서비스로 노출할 수 있습니다.

$ kubectl expose {deploy/pod}/{name} [--name servicename] [--type ClusterIP|LoadBalancer|NodePort]


네트워크

Details

k8s api 서비스 사용

프록시 실행 명령어 입니다.

$ kubectl proxy
# example
# http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/{URI}

포트포워딩

간단히 테스트 할 수 있어 자주 사용합니다

$ kubectl port-forward {resource/name} {port from:port to} [-n {namespace}] [--address={ip}]

# 백그라운드에 계속 유지시키고 싶으면
$ nohup kubectl port-forward {args} > /dev/null &

파일복사

호스트 -> 게스트

$ kubectl cp {host/path} [{namespace}/]{podname}:{guest/path} [-c {container}]

게스트 -> 호스트

$ kubectl cp [{namespace}/]{podname}:{guest/path} [-c {container}] {host/path}


문제 확인

Details

컨테이너 접속

컨테이너를 직접 확인해봅시다

$ kubectl exec -it {podname} [-n {namespace}] [-c {container}] -- /bin/sh

다른 명령어를 실행시켜도 됩니다

$ kubectl exec {resource}/{name} -- {command}

쉘이 실행중이면 attach 명령어를 사용할 수 있습니다

$ kubectl attach {podname} [-n {namespace}] [-c {container}]

kubectl을 사용하지 않고 해당 컨테이너가 실행되고 있는 노드에서 docker 명령어를 사용할 수도 있습니다



수정/삭제

Details

주의: 백업 수단을 만들고 진행하세요
변경 전 kubectl get {resource} -o yaml > {resource}.yaml등의 명령어로 백업하고 진행합니다.


리소스 재시작

$ kubectl rollout restart {resource}/{name} [-n {namespace}] 

리소스 삭제 후 재생성

$ kubectl get {resource}/{name} [-n {namespace}] -o yaml | kubectl replace --force -f-

리소스 롤백

롤백

롤아웃 기록 확인

$ kubectl rollout history {resource}/{name} [-n {namespace}]

REVISION CHANGE-CAUSE
1 <none>

롤백

$ kubectl rollout undo {resource}/{name} [-n {namespace}] [--to-revision={revision}]

리소스 강제 삭제

$ kubectl delete {resource}/{name} [-n {namespace}]  --grace-period=0 -force
$ kubectl patch {resource}/{name} [-n {namespace}] -p '{"metadata": {"finalizers": null}}'

모든 리소스 삭제

$ kubectl delete all --all -n {namespace}

편집

시스템 기본 에디터를 사용합니다(확인 필요)

$ kubectl edit {resource}/{name} [-n {namespace}] 

환경변수로 에디터 선택이 가능합니다

$ KUBE_EDITOR="nano" kubectl edit {resource}/{name} [-n {namespace}] 

노드 라벨 설정

$ kubectl label nodes {node} key={value}

노드 지정

노드셀렉터

$ kubectl edit {resource}/{name} [-n {namespace}] 
#spec>nodeSelector>key=value 값을 설정합니다.

노드 제거

$ kubectl drain {nodename} --delete-local-data --force --ignore-daemonsets
# 제거가 잘 되면 status가 Evit로 표시됩니다


응용

Details

Running 상태가 아닌 pod 삭제

$ kubectl delete pod [-n {namespace}] $(kubectl get pod [-n {namespace}] --field-selector=status.phase!=Running -o=custom-columns='':metadata.name)


Tips

개념 이해에 도움이 되는 글입니다
쿠버네티스 개념
쿠버네티스 아키텍처

Reference

[공식]리눅스에 kubectl 설치 및 설정
[공식]kubectl-commands
[공식]kubectl 치트 시트