Kubernetes - CLI API

jsbak·2023년 6월 4일
0

Cloud

목록 보기
55/59

CLI 기본 사용법

  • kubectl [명령어] [오브젝트] [이름] [옵션]

워크 스페이스 생성

$ mkdir workspace && cd $_
  • 노드정보 확인
$ kubectl get node

kubectl run : 포드에서 특정 이미지 생성 및 실행

  • $ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json] [--command] -- [COMMAND] [args...]
  • 클러스터에서 하나 이상의 컨테이너 이미지 인스턴스 실행을 시작
NameShorthandDefaultUsage
image실행할 컨테이너의 이미지입니다.
# "Pod" 안에 "nginx" 이미지를 이용한 컨테이너를 만듬.
$ kubectl run nginx-pod --image=nginx # pending > ContainerCreating > Running


# get
# https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#get
# ps 출력 형식으로 모든 포드 나열
$ kubectl get pod

# 모든 서비스를 ps 출력 형식으로 함께 나열
$ kubectl get service

kubectl expose : 리소스를 새 Kubernetes 서비스로 노출

  • $ kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
  • 실행 중인 인스턴스 간에 트래픽 부하를 분산하고 클러스터 외부에서 컨테이너에 액세스하기 위한 HA 프록시를 생성할 수 있습니다.
    • 파드 접속점 제공
NameShorthandDefaultUsage
name새로 생성된 object의 이름입니다.
port서비스가 제공되어야 하는 포트입니다. 지정되지 않은 경우 노출되는 리소스에서 복사됨
type이 서비스에 대해 ClusterIP, NodePort, LoadBalancer 또는 ExternalName을 입력합니다. 기본값은 'ClusterIP'
external-ip서비스에 대해 수락할 추가 외부 IP 주소(Kubernetes에서 관리하지 않음). 이 IP가 노드로 라우팅되면 생성된 서비스 IP 외에도 "추가 외부 주소 IP" 에서 서비스에 액세스 가능
# "ClusterIP" 유형은 내부에서 "nginx-pod" 파드로 접속 
# 클러스터 안에서만 이용되는 클러스터 아이피 제공
$ kubectl expose pod nginx-pod --name clusterip --type=ClusterIP --port 80

$ kubectl get service
$ curl 10.110.73.199

# "NodePort, LoadBalancer" 유형은 외부에서 접속하는 경우
# 포트 번호를 정할수도 있지만 접속 가능한 랜덤 포트 제공
# Node 의 IP에 포트번호를 이용하여 접속 가능

$ kubectl expose pod nginx-pod --name nodeport --type=NodePort --port 80


# 외부 IP 로 접속 하면 내부의 클러스터 IP로 라우팅 된다.
$ kubectl expose pod nginx-pod --name loadbalancer --type=LoadBalancer --external-ip 192.168.0.29 --port 80

  • 로드밸런서 - 클러스터 IP 접속(내부접속), 외부IP:외부PORT 접속, 외부IP 접속
  • 접속할수 있는 방법을 서비스라고 한다.

  • 비교

kubectl describe : 특정 리소스 또는 리소스 그룹의 세부 정보를 표시

  • $ kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)
  • 이벤트 또는 컨트롤러와 같은 관련 리소스를 포함하여 선택한 리소스에 대한 자세한 설명을 출력
  • 이름으로 단일 개체, 해당 유형의 모든 개체를 선택하거나 이름 접두사 또는 레이블 선택기를 제공
$ kubectl describe pod nginx-pod

# "clusterip" 라는 서비스를 자세히 표시
$ kubectl describe service clusterip

$ kubectl describe service nodeport


Namespace : 리소스 그룹, 기본값(default)
Labels : 연결/연동에 사용 (태그와 유사), 라벨을 정하지 않으면 이미지이름을 알아서 정함
IP : 컨테이너 IP
Events : 로그 역할

Selector : Labels 에 해당되는 Pod 에 연결시켜준다.
TargetPort :
Endpoints : 도커의 엔드포인트

kubectl exec : 컨테이너에서 명령을 실행

  • $ kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...]
NameShorthandDefaultUsage
stdinifalsePass stdin to the container
ttytfalseStdin is a TTY
$ kubectl exec -it nginx-pod -- bash
	# `-c` string : , `-c` 옵션이 있으면 문자열에서 명령을 읽습니다. 
# kubectl exec -it nginx-pod -- bash -C 'echo "web01" > /usr/share/nginx/html/index.html'

# "pod" 가 하나인 경우 손쉽게 바꿔보기
$ echo "<h1>web01</h1>" > /usr/share/nginx/html/index.html

kubectl cp : 파일과 디렉터리를 컨테이너 간에 복사

  • $ kubectl cp <file-spec-src> <file-spec-dest>
$ mkdir html
$ tar xvf ./gcp.tar -C html/

# "html" 디렉터리 쨰로 컨테이너에 복사
$ kubectl cp html nginx-pod:/usr/share/nginx


kubectl get : 하나 이상의 리소스(;오브젝트)를 표시

  • $ kubectl get [(-o|--output=)json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file|custom-columns|custom-columns-file|wide] (TYPE[.VERSION][.GROUP] [NAME | -l label] | TYPE[.VERSION][.GROUP]/NAME ...) [flags]
NameShorthandDefaultUsage
outputojson/yaml/name/go-template/go-template-file/template/templatefile/jsonpath/jsonpath-as-json/jsonpath-file/custom-columns-file/custom-columns/wide
show-labelsfalse마지막 열에 모든 라벨을 표시, 기본값: 출력하지 않음.
# 생성한 거의 모든 오브젝트 표시
$ kubectl get all

# "`-o` wide" => 넒게 보여주세요
$ kubectl get nodes -o wide

# "--show-labels" 라벨 출력
$ kubectl get pod -o wide --show-labels

# 헤더(열 이름) 표시 X
$ kubectl get nodes -o wide no-headers

# 출력 결과 중에서 "6열"에 해당되는 부분만 출력
$ kubectl get nodes -o wide --no-headers | awk '{print $6}'

kubectl delete : 리소스 삭제

  • 파일 이름, stdin, 리소스 및 이름 또는 리소스 및 레이블 선택기로 리소스를 삭제
  • $ kubectl delete ([-f FILENAME] | [-k DIRECTORY] | TYPE [(NAME | -l label | --all)])
# "svc" - service 의 준말
# 모든 서비스를 지우겠다.
$ kubectl delete svc --all

# "kubernetes" 삭제되서는 안되는 서비스는 지워지면 다시 생성된다.
$ kubectl get svc

# "nginx-pod" 제거 
$ kubectl delete pod nginx-pod
# pod 와 service 모두 제거
$ kubectl delete pod,svc --all

# <pod> 파드를 `--grace-period=0` 지연 시간 0으로 `--force` 강제로 지움
$ kubectl delete pods <pod> --grace-period=0 --force pod

kubectl options

  • kubectl 모든 명령의 플래그(옵션) 목록을 출력
$ kubectl options

kubectl api-resources : 서버에서 지원되는 API 리소스를 출력

  • 오브젝트(; 리소스) 의 쿠버네티스 현재 버전에서 API 가 어떻게 사용되는지 확인 가능, 네임스페이스 포함 여부, SHORTNAMES 등 확인 가능
    • KIND : yaml 작성할때 리소스의 종류를 표현할 때 이용

kubectl create deployment : 특정한 이름으로 배포 리소스(오브젝트) 생성

  • 하나의 이상의 파드를 만들수 있는 방식 deployment
  • replicasets : deployment 가 나오기 전에의 사용, 복제와 관련된 부분
  • deployment : 두개이상의 파드를 운영하기 적합
NameShorthandDefaultUsage
replicasr1생성할 복제본 수
image[]실행할 이미지 이름
# "nginx-app" 이라고 하는 배포를 `nginx` 이미지로 2개의 복제본을 가지고 생성
$ kubectl create deployment nginx-app --replicas=2 --image=nginx

# 배포 정보 확인
$ kubectl get deployments.apps
$ kubectl get deployments.apps -o wide

# 복제 관련 정보 확인, 목표치(DESIRED) 와 현재 상태 등을 확인 가능
$ kubectl get replicasets.apps
$ kubectl get replicasets.apps -o wide

$ kubectl expose deployment nginx-app --name clusterip-app --type ClusterIP --port 80
$ kubectl expose deployment nginx-app --name nodeport-app --type=NodePort --port 80
$ kubectl expose deployment nginx-app --name loadbalancer-app --type=LoadBalancer --external-ip 192.168.2.46 --port 80

$ kubectl get service
  • deployments.apps 조회
  • replicasets.apps 조회
  • deployment, replicaset, pod 는 연관이 있다.

kubectl scale

  • 배포, 복제 세트, 복제 컨트롤러 또는 상태 저장 세트의 새 크기를 설정합니다.
  • $ kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
$ kubectl scale deployment nginx-app --replicas=4
$ kubectl get pods
----------------------------------------
NAME                        READY   STATUS              RESTARTS   AGE
nginx-app-d6ff45774-4vdjm   1/1     Running             0          138m
nginx-app-d6ff45774-lpg5c   1/1     Running             0          138m
nginx-app-d6ff45774-rs865   0/1     ContainerCreating   0          6s
nginx-app-d6ff45774-znhw5   1/1     Running             0          6s
----------------------------------------

$ kubectl scale deployment nginx-app --replicas=2
$ kubectl get pods
----------------------------------------
NAME                        READY   STATUS    RESTARTS   AGE
nginx-app-d6ff45774-4vdjm   1/1     Running   0          140m
nginx-app-d6ff45774-lpg5c   1/1     Running   0          140m

kubectl delete

  • $ kubectl delete ([-f FILENAME] | [-k DIRECTORY] | TYPE [(NAME | -l label | --all)])
  • deployment를 지우지 않으면 pod 를 지울 수 없다.
# "nginx-app" deployments 를 지운다.( pod까지 싹다.)
$ kubectl delete deployments.apps nginx-app

# 모든 서비스를 지운다. 
$ kubectl delete service --all

# 모두 지운다. 
$ kubectl delete all --all
# 파드만 지운다.
$ kubectl delete pod --all

APP MANAGEMENT COMMAND

kubectl set

  • 애플리케이션 리소스를 구성합니다.
  • 이러한 명령은 기존 애플리케이션 리소스를 변경하는 데 도움이 됩니다.
  • $ kubectl set SUBCOMMAND

kubectl set image

  • 리소스의 기존 컨테이너 이미지를 업데이트
    • 가능한 리소스: pod(po), replicationcontroller(rc), 배포(deploy), daemonset(ds), statefulset(sts), cronjob(cj), replicaset(rs)
  • $ kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N
# "deployment.apps/nginx-deployment" 의 "nginx-deployment-container" 이미지를
# `halilinux/web-site:v1.0`로 변경
$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/web-site:v1.0

# nginx 배포의 nginx 컨테이너 이미지를 'nginx:1.9.1'로 설정하고 해당 busybox 컨테이너 이미지를 'busybox'로 설정합니다.
$ kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1

kubectl rollout

  • 리소스 롤아웃을 관리
  • 가능한 리소스 유형
    • deployments
    • daemonsets
    • statefulsets
  • $ kubectl rollout SUBCOMMAND

kubectl rollout history

  • 이전 롤아웃 버전 및 구성을 확인
  • $ kubectl rollout history (TYPE NAME | TYPE/NAME) [flags]
NameShorthandDefaultUsage
revision0특정 리비전의 podTemplate 을 포함한 세부 정보 보기
# "deployment"의 "nginx-deployment" 롤아웃 기록 보기
$ kubectl rollout history deployment nginx-deployment

# "deployment"의 "abc" 롤아웃 기록 보기
$ kubectl rollout history deployment/abc

# 리비전 2 상세보기
$ kubectl rollout history deployment nginx-deployment --revision=2 

kubectl rollout undo

  • 이전 롤아웃으로 롤백
  • $ kubectl rollout undo (TYPE NAME | TYPE/NAME) [flags]
NameShorthandDefaultUsage
to-revision0롤백할 버전. 기본값은 0 (latest revision)
# 롤백(전 단계로 복원)
$ kubectl rollout undo deployment nginx-deployment 

# 리비전2로 복원
$ kubectl rollout undo deployment nginx-deployment --to-revision=2 

기타

$ kubectl run nginx-pod --image=halilinux/web-site:aws
$ kubectl expose pod nginx-pod --name loadbalancer --type LoadBalancer --external-ip 192.168.2.46 --port 80

# pod, service 등을 짧게 쓸 수도 있다.
$ kubectl api-resourece
$ kubectl get po -o wide
$ kubectl get svc -o wide


# echo 명령 써보기
$ kubectl exec -it nginx-app-d6ff45774-lpg5c  -- /bin/sh -c 'echo "<h1>web02</h1>" > /usr/share/nginx/html/index.html'
$ kubectl exec -it nginx-replicaset-hgtbx -- bash -c 'echo "web01" > /usr/share/nginx/html/index.html'
  • 파드는 도커 컨테이너를 여러개 넘어서 운영한다. ; 하나의 파드 안에 두개 이상의 컨테이너를 넣을 수도 있으나 대개 파드 하나에 컨테이너 하나이다.

❗네임스페이스 관련 추가 ❗

  • 조회
$ kubectl -n jsb get all
$ kubectl get ns jsb
  • 네임스페이스 제거
$ kubectl delete resourcequotas sample-resourcequota
$ kubectl delete ns jsb

❗ 리소스 쿼터 관련 추가 ❗

❗ 라벨 관련 추가❗

$ kubectl label nodes worker1 tier=dev
$ kubecl get nodes --show-labels

  • 노드에서 라벨 제거
$ kubectl label nodes worker1 tier-

profile
끄적끄적 쓰는곳

0개의 댓글