공부하기싫어
article thumbnail

kubectl 명령어

kubenetes 상태를 확인하고 원하는 상태를 요청하는 client 명령

CLI 형태로 사용

kubectl 명령 동작 시 config file 은 $HOME/.kube 디렉토리에서 찾으며 KUBECONFIG 환경 벼수를 설정하거나 '--kubeconfig' flag를 사용하여 다른 kubeconfig 파일을 지정할 수 있다.

kubectl 명령 reference - https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

 

 

  • kubectl [command] [type] [name] [flags]

command : 하나 이상의 리소스에서 수행하려는 동작 지정

- ex) create, run, apply, get, describe, delete, exec, logs, config

 

type :

- 리소스 타입 지정

- 리소스 type 은 대소문자를 구분하지 않으며 단수형, 복수형 또는 약어 형식으로 지정함

 

name : 

- 리소스 이름 지정

- 대소문자 구분

- 생략하면 모든 리소스를 지정하거나 하나 이상의 file을 지정

- type 및 name으로 리소스 지정 시 참고 사항

리소스가 모두 동일한 type인 경우 리소스를 그룹화 하려면 'TYPE name1, name2' 형식과 같이 사용

ex) kubectl get nodes worker1.example.com, worcker2.example.com

여러 리소스 type을 개별적으로 지정하려면 'TYPE1/name1 TYPE2/name2' 형식과 같이 사용

 

flags : 선택적 flag 지정 (옵션)

-o [flag] : 출력 형식 지정

- f [file] : 파일 지정

 

kubectl : kubectl 명령 목록 출력

kubectl [command] --help : command 에 대한 도움말

kubectl api-versions : 현재 cluster에서 사용 가능한 API 버전 정보

kubectl api-resources : 사용할 수 있는 resource 목록

kubectl config view : config 파일 내용

 

명령 설명
get 리소스 목록 출력
apply 원하는 상태 적용, -f <파일명> 형식 많이 사용
create 리소스 생성
describe 리소스 상태의 자세한 정보
delete 리소스 제거
exec container 명령 전달, container 접근시 사용
logs container 로그 정보
config kubectl 설정 관리

 

kubectl get [resource]

- kubectl get all : pod, replicaset, deployment, service, job 전체 목록

- kubectl get nodes : cluster 내 node 목록

- kubectl get pods : pod 목록

- kubectl get pods -o wide : pod 목록 정보 상세 출력 (node 정보 포함)

- kubectl get pod [pod name] -o yaml : pod 정보를 yaml 형식으로 출력

- kubectl get pods --show-labels : label 포함 출력

kubectl get all

 

kubectl describe [resource]

- resource에 대한 상세 정보 출력 (초기화되지 않는 리소스 포함)

- 통산 pod가 제대로 동작하지 않는 경우 log를 확인하거나 해당 pod의 describe 정보를 확인하여 원인 파악

describe

 

kubectl applly -f [yaml 파일]

- 리소스 생성

- 하나 이상의 서비스 생성

 

kubectl delete -f [yaml 파일]

- 생성 시 사용한 yaml을 이용하여 리소스 삭제

kubectl delete [type] [namee]

- type 에 해당하는 name의 리소스 삭제

kubectl delete [pod name]

- 해당 pod 삭제

 

kubectl logs POD [-c container] [--follow] [flags]

- pod log 확인

 

kubectl exec [pod name] -it /bin/bash

- 특정 pod에 대하여 명령 실행

 

kubectl config view

- config 파일 내용 확인

 

 

 

NAMESPACE

  • kubernetes Object

kubernetes object(resource)와 object를 관리하는 controller로 나누어저 있다.

kubernetes object

- kubernetes 시스템에서 영속성을 가지는 object

- object를 생성하면 kubernetes 시스템은 원하는 상태를 보장하기 위해 지속적으로 동작

kubernetes는 cluster의 상태를 나타내기 위해 object를 이용함

object를 2개의 필드에 의해서 구성

- status : kubernetes 시스템과 component에 의해 제공되고 업데이트된 object의 현재 상태 설명

- spec : object 특성으로 추구하는 상태

Controller 는 status와 spec이 일치하도록 object 관리

 

 

  • kubernetes 기본 object
  • pod

kubernetes에서 가장 기본적인 배포 단위

container를 포함하는 단위

kubenetes의 특징중 하나로 container를 개별적으로 배포하는 것이 아닌 pod 단위로 배포

pod는 하나 이상의 container 포함

 

  • volume

container는 기본적으로 상태가 없는 app container 사용

상태가 없다는 것은 container 혹은 node에 문제가 있어 container를 새로 실행했을때 다른 node에 자유롭게 옮길 수 있다는 뜻으로 container 장점

하지만 container가 실행되지 않거나 삭제된다면 현재까지 저장한 데이터는 사라진다는 단점

app의 특성에 따라 container에 문제가 발생해도 데이터를 보존해야 하는 경우 volume 사용

volume 은 container 가 재시작하더라도 데이터 유지

 

 

  • service

pod 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법

service는 pod 에게 고유한 ip 주소와 pod 집합에 대한 단일 DNS 를 부여하여 pod가 cluster 안 어디에 있든 고정 주소를 통해 접근 가능하도록 함

 

 

  • Namespace

kubernetes cluster 하나를 여러개의 논리적인 단위로 나눠서 사용하는 개념

pod와 service 등 namespace 별로 생성하고 관리될 수 있다.

 

 

 

  • kubernetes Object 기술 방법 - yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: python-sample-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: python-sample-app
  replicas: 1
  template:
    metadata:
      labels:
        app: python-sample-app
    spec:
      containers:
      - name: python-sample
        image: dockerimage주소:태그
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 200Mi
        ports:
        - containerPort: 8000
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: myweb
spec:
  containers:
  - name: myweb-container
    image: nginx:latest
    ports:
    - containerPort: 80
  • YAML 파일 공통 tag

- apiVersion

Object를 생성하기 위한 kubernetes api 버전 명세

 

- kind

어떤 종류의 object 를 생성하고자 하는지 명세

 

- metadata

object 이름 부여

object를 유일하게 구분지어줄 데이터

name : 동일 namespace 상 유일한 값

labes : 특정 kubernetes object 만 나열하거나 검색할 때 유용하게 쓰이는 key-value 쌍

 

- spec

생성할 Object의 구체적인 내용을 정의한 spec

spec의 format은 kubernetes object 종류마다 다름

자주 쓰이는 sepc 목록

   - containers : pod에는 1 개 이상 container 포함, container에 원하는 만큼 container 정의

   - image : pull 받아올 docker image 주소

   - replicas : 원하는 pod 개수

   - selector : controller 가 어떤 pod를 감시하는지 명시

   - template : 새로운 pod 를 생성할 때 사용할 template , selector값이 template의 labels 와 일치해야 관리되는 pod를 옳게 설정해야 함

 

 

 

  • namespace

kubernetes cluster 내의 논리적인 분리 단위

namespace 단위로 자원 할당, 사용자 권한 관리 등을 수행할 수 있다.

별도로 namespace 를 지정하지 않으면 항상 default namespace에 object 생성

namespace는 논리적인 분리 단위를 의미하고 물리적인 분리를 의미하지 않음

참고

namespace 기본 설명 : https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/

namespace 생성 : https://kubernetes.io/docs/tasks/administer-cluster/namespaces/#creating-a-new-namespace

namespace design : https://github.com/kubernetes/design-proposals-archive/blob/main/architecture/namespaces.md

하나의 cluster를 논리적으로 dev(개발) / stg(통합) / prd(운영) 로 namespace 분리

 

 

  • namespace 생성
# exam-namespace.yml
apiVersion: v1
kind: Namespace
metadata:
 name: my-namespace
spec:
 limits:
 - default:
     cpu: 1
   defaultRequest:
     cpu: 0.5
   type: container

- YAML 파일 이용 생성 : kubectl apply -f exam-namespace.yml

- kubectl create 명령으로 생성 : kubectl create namespace [namespace 이름]

apply -f
create namespace

 

namespace에 object 생성

apiVersion: v1
kind: Pod
metadata:
 name: nginx-pod
 namespace: exam-namespace2
 labels:
   app: myweb
spec:
 containers:
 - name: myweb-container
   image: nginx:latest
   ports:
   - containerPort: 80

- YAML 파일 metadata tag에 namespace 지정하고 object 생성

 

namespace 지정하여 object 검색

- kubectl get namespace : 전체 namespace 검색

- kubectl get [resource 이름] --namespace [namespace 이름] : kubectl get pods --namespace default

get namespace

 

namespace 삭제

- kubectl delete namespace/[name] : kubectl delete namespace/exam-namespace2

- kubectl delete -f [yaml file]

delete namespace