쿠버네티스 관리 도구 kubectl 설치와 사용법
Kubectl 소개
kubectl은 k8s API를 사용하여 쿠버네티스의 Control Plane과 통신하여 클러스터를 터미널에서 커맨드로 관리할수 있는 도구 입니다.
일반적으로 쿠버네티스 클러스터를 관리할때는 쿠버네티스 기본 대시보드나 Rancher, GKE, AKS 등 웹기반의 UI를 사용하거나 터미널 기반의 UI 도구인 k9s를 사용하지만 그런 도구들을 사용할수 없는 환경일 경우 가장 기본적인 kubectl을 사용해야 하기때문에 사용방법을 알 필요가 있습니다.
kubectl는 클러스터 단위로 명령을 수행하는데 사용할 클러스터를 kubectl이 설치된 장비의 $HOME 경로 .kube
디렉토리 내부에 존재하는 config 파일에서
탐색합니다. config 파일 내에 등록된 클러스터가 여러개라면 kubectl 명령어로 사용할 클러스터를 지정할수 있습니다.
kubectl 개념
kubectl은 쿠버네티스 클러스터를 관리하기 위해 REST API를 사용합니다. kubectl은 REST API를 통해 컨트롤 플레인에 요청을 보내고, 컨트롤 플레인은 요청을 처리하여 클러스터를 관리합니다.
kubectl 아키텍처 구성
- 클라이언트: kubectl은 사용자와 컨트롤 플레인 사이의 중개자 역할을 하는 클라이언트입니다. kubectl은 사용자의 명령을 받아 REST API를 통해 컨트롤 플레인에 요청을 보냅니다.
- 컨트롤 플레인: 컨트롤 플레인은 클러스터를 관리하는 데 필요한 컴포넌트의 집합입니다. 컨트롤 플레인은 리소스를 생성, 업데이트, 삭제하고, 클러스터의 상태를 모니터링하고, 컨테이너화된 애플리케이션을 배포하고 관리합니다.
kubectl 동작 순서
kubectl은 다음과 같은 단계로 쿠버네티스 클러스터를 관리합니다.
-
사용자는 kubectl 명령을 실행합니다.
ex) kubectl create -f pod.yaml
-
kubectl은 명령을 해석하고 REST API 요청을 생성합니다.
ex) POST /api/v1/namespaces/default/pods
-
kubectl은 REST API 요청을 컨트롤 플레인에 보냅니다.
-
컨트롤 플레인은 REST API 요청을 처리합니다.
-
컨트롤 플레인은 클러스터를 업데이트합니다.
kubectl 설치 방법
kubectl 설치는 curl 명령어를 사용해서 바이너리로 설치하는 방법과 k8s 레포지토리를 추가하고 패키지 관리 명령어로 설치하는 방법이 있는데 레포지토리를 추가하여 설치하는 방법으로 설명 드리겠습니다.
Debian 계열 (Ubuntu Linux)
- apt 패키지 업데이트
- apt-transport-https는 https를 통해 외부 레포지토리에서 패키지를 다운로드 할수 있도록 하는 패키지입니다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
- k8s 레포지토리 public 싸인키를 다운로드
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
- apt에 k8s 레포지토리 추가, k8s의 버전은 환경에 맞춰서 변경필요함 (기본값: v1.28)
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
- apt 패키지 업데이트후 kubectl 설치
sudo apt-get update
sudo apt-get install -y kubectl
Redhat 계열
- k8s 레포지토리 추가, Debian 설치방법과 마찬가지로 k8s 버전은 설치된 k8s의 버전과 동일하게 한다.(기본값: v1.28)
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
EOF
- kubectl 설치
sudo yum install -y kubectl
설치, 버전 확인
- 클러스터 정보 확인
kubectl cluster-info
Kubernetes control plane is running at https://xxx.xxx.xxx.xxx:6443
CoreDNS is running at https://100.100.106.150:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
- 버전 확인
kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.26.0
Kustomize Version: v4.5.7
Server Version: v1.24.10
WARNING: version difference between client (1.26) and server (1.24) exceeds the supported minor version skew of +/-1
kubectl 커맨드 사용방법
클러스터 연결, 목록
- kubectl 커맨드를 사용하려면 관리할 클러스터를 먼저 선택해야 합니다.
kubectl config use-context <cluster_name>
.kube
에 등록된 클러스터 목록을 보는 명령어
kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* cluster1 cluster1 cluster1
cluster2 cluster2 cluster2
cluster3 cluster3 cluster3
네임스페이스 지정 옵션 -n
- kubectl 커맨드로 리소스 관련 명령을 수행할때 네임스페이스, 노드 목록같은 클러스터 전반적인 리소스를 조회하는 경우를 제외하면 네임스페이스 지정은 필수로 들어가야 합니다.
- 네임스페이스를 지정하지 않을경우 default 네임스페이스로 수행됩니다.
kubectl get <resource_name> -n NAMESPACE
# 특정 네임스페이스 조회
kubectl get pods -n hello-world
# 모든 네임스페이스 조회
kubectl get pods --all-namespaces
리소스 조회 get
get
옵션을 사용하여 지정된 네임스페이스의 리소스 정보를 확인할수 있습니다.- 조회 가능한 리소스 종류는 200개 정도 되는데 주로 pods, nodes, events, secrets, services(svc), endpoints, configmaps, namespaces(ns), persistentvolumes(pv), persistentvolumeclaims(pvc) 등 입니다.
- 위 리소스 목록중에 괄호안에 있는 값은 축약어 입니다.
# 원본 명령어
kubectl get [(-o|--output=)json|yaml|wide|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...] (TYPE [NAME | -l label] | TYPE/NAME ...) [flags]
- 사용 예제
# 모든 리소스 조회
kubectl get all -n hello-world
# 네임스페이스 목록 조회
kubectl get namespaces
# 노드 목록 조회
kubectl get nodes
# 파드목록 조회
kubectl get pods -n hello-world
# 서비스 목록 조회
kubectl get svc -n hello-world
리소스 배포, 업데이트 apply, update
- 리소스 배포, 업데이트에는 각각 create, apply 명령어를 사용할수 있는데 각 옵션의 차이점은 create는 해당 리소스가 이미 존재하는 경우 오류가 발생하고 apply는 업데이트가 됩니다.
-f
옵션으로 배포, 업데이트할 yaml파일을 지정해야 합니다.
# 원본 명령어
kubectl create -f FILENAME -n NAMESPACE
kubectl apply -f FILENAME -n NAMESPACE
# 예시
kubectl apply -f test-pod.yaml -n hello-world
kubectl create -f test-pod.yaml -n hello-world
리소스 수정 edit
- 실행중인 리소스를 실시간으로 수정하여 상태를 변경할수 있습니다.
- 예를들어 파드는 cpu, mem 같은 자원값을 변경할수 있고 서비스의 경우 서비스타입을 변경할수 있습니다.
# 원본 명령어
kubectl edit -n NAMESPACE (RESOURCE/NAME | -f FILENAME)
# 디플로이먼트 수정
kubectl edit -n hello-world deployments.apps test-deployment
# 파드 수정
kubectl edit -n hello-world pods test-deployment-5b9858bf69-v644h
# 파일기반 수정(파일 내용이아닌 지정 파일로 만들어진 리소스가 수정됨)
kubectl edit -n hello-world -f test-deploy.yaml
리소스 삭제 delete
- 실행중인 리소스를 삭제하는 명령어 입니다.
# 원본 명령어
kubectl delete -n NAMESPACE ([-f FILENAME] | TYPE [(NAME | -l label | --all)])
# test-deployment 디플로이먼트 삭제 (타입 지정)
kubectl delete -n hello-world deployments.apps test-deployment
# test-deployment 디플로이먼트 삭제 (파일 지정)
kubectl delete -n hello-world -f test-deploy.yaml
컨테이너 로그 확인 logs
- 파드의 컨테이너 로그를 확인하는 명령어 입니다.
-f
옵션으로 리눅스의 tail -f 와 같이 실시간으로 로그를 확인할수 있습니다.-p
옵션으로 이전에 실행된 파드의 로그를 확인할수 있습니다.
# 원본 명령어
kubectl logs [-f] [-p] -n NAMESPACE POD [-c CONTAINER]
# 예시
kubectl logs -f -n hello-world test-deployment-5b9858bf69-4nhd2
리소스 스케일 조정 scale
- 쿠버네티스에서 Replication Controller(rc), Job, Deployment 갯수를 조정하는 명령어 입니다.
- 스케일링이란 서비스의 부하를 분산시키기 위해 리소스의 개수를 늘리거나 파드의 cpu/mem 같은 자원을 늘리는것을 뜻하는데 리소스의 갯수를 늘리는 방식을 수평적 스케일링이라 하고 cpu/mem 같은 자원을 늘리는 방식은 수직적 스케일링 이라고 합니다.
- 쿠버네티스의 대표 기능인 오토스케일링이 바로 서비스의 사용량에 따라 수평적 스케일링을 자동으로 해주는것입니다.
# 원본 명령어
kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME) -n <namespace>
# test-deployment 디플로이먼트를 3개로 조정
kubectl scale -n hello-world deployment/test-deployment --replicas 3
# foo Replication Controller(rc)를 3개로 조정
kubectl scale -n hello-world --replicas=3 rc/foo -n hello-world
'클라우드 > Kubernetes' 카테고리의 다른 글
k9s 설치와 사용방법 (쿠버네티스 UI 관리 도구) (1) | 2023.12.08 |
---|---|
[Kubernetes] CronJob 예제, Completed, Failed 파드 관리하기 (0) | 2023.06.14 |
helm install no matches for kind "Certificate" 에러 해결 & Cert-manager란?? (0) | 2022.12.21 |
Grafana OAuth 방식으로 Keycloak Login 연동하기 #JWT 토큰 발행 (1) | 2022.05.18 |
[Kubernetes] Grafana 에서 Kafka 모니터링 하기 #Prometheus #kafka-exporter (0) | 2022.04.01 |
댓글