쿠버네티스 사용하기
목차
kubectl 설치
설마 kubectl이 없을까요...?
쿠버네티스를 처음 접하신다면 쿠버네티스 구조를 다룬 이글
먼저 보시는걸 추천합니다.
requirements
- linux
- kubernetes cluster
바이너리 설치
Details
- 바이너리 파일을 다운로드 합니다.
# 다음 명령으로 최신 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 # 성공시
- 바이너리 파일을 설치합니다.
# 설치하기, 바이너리 파일을 이동하는 것 처럼 보입니다
$ 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으로 관리되게 설치할 수 있습니다.
데비안
apt
인덱스 업데이트와 필요한 패키지를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl
- 구글 클라우드의 퍼블릭 사이닝 키를 다운받습니다.
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
- 쿠버네티스
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
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
명령어
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
네트워크
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 치트 시트