[구름 k8s] TIL 3-2-1

Peppie·2022년 10월 11일
0

1. kubectl 명령어

kubectl

쿠버네티스 상태 확인원하는 상태를 요청하는 클라이언트 명령, CLI 형태로 사용
참고

  • kubectl 명령 동작시 config 파일은 $HOME/.kube 디렉토리에서 찾으며,
    KUBECONFIG 환경변수 설정 또는 '--kubeconfig' flag를 사용하여 다른 kubeconfig 파일지정 가능

kubectl [ command ][ TYPE ] [ NAME ][ flags ]

  • command : 하나 이상의 리소스에서 수행하려는 동작 지정
    • create
    • run
    • apply
    • get
    • describe
    • delete
    • exec
    • logs
    • config

  • TYPE : 리소스 type 지정
    • 리소스 type은 대소문자 구분 X, 단수형/복수형/약어 형식으로 지정

  • NAME : 리소스 이름 지정
    • 대소문자 구분, 생략하면 모든 리소스를 지정하거나 하나 이상의 file 지정
    • TYPE 및 NAME으로 리소스 지정시 참고 사항
      • 리소스가 모두 동일한 TYPE인 경우 리소스를 그룹화 하려면
        'TYPE name1, name2 name<#>' 형식과 같이 사용
        ex) kubectl get example-pod1 example-pod2

      • 여러 리소스 TYPE를 개별적으로 지정하려면
        'TYPE1/name1 TYPE2/name2 TYPE<#>/name<#>' 형식과 같이 사용
        ex) kubectl get pod/example-pod1 replicationcontroller/example-rc1
  • flags : 선택적 flag 지정 (옵션)
    • -o <flag 내용> : 출력형식 지정 ex) kubectl get nodes -o wide
    • -f <파일명> : 파일 지정

kubectl : kubectl 명령 목록 출력
kubectl [ command ] --help : command에 대한 도움말
kubectl api-versions : 현재 클러스터에서 사용가능한 API 버전 정보
kubectl api-resources : 사용가능한 리소스 목록
kubectl config view : config 파일 내용

대표적인 kubectl 명령

get

리소스 목록 출력; kubectl get [resources]

  • kubectl get all : Pod, Replicaset, Deployment, Service, Job 전체 목록
  • kubectl get nodes : 클러스터 내 노드 목록
  • kubectl get pods : pod 목록
  • kubectl get pods -o wide : pod 목록 정보 상세 출력 (노드 정보 포함)
  • kubectl get pod <pod 이름> -o yaml : pod 정보를 yaml 형식으로 출력
  • kubectl get pods --show-labels : label 포함 출력

apply

원하는 상태 적용, -f <파일명> 형식 많이 사용

  • kubectl apply -f [yaml 파일 (현재 시스템/원격지 시스템 경로 포함)] : 리소스 생성 / 하나 이상의 서비스 생성

create

리소스 생성

describe

리소스 상태의 자세한 정보; kubectl describe [resource 이름]

  • 리소스에 대한 상세 정보 출력
  • 통산 pod가 제대로 동작하지 않는 경우 log 확인 또는 해당 pod의 describe 정보를 확인하여 원인 파악

delete

리소스 제거

  • kubectl delete -f [yaml 파일] : 생성시 사용한 yaml을 이용하여 리소스 삭제
  • kubectl delete [ TYPE ][ NAME ] : TYPE에 해당하는 NAME의 리소스 삭제
  • kubectl delete [ pod NAME ] : 해당 pod 삭제

exec

컨테이너 명령 전달, 컨테이너 접근시 사용

  • kubectl exec [ pod NAME ] -it /bin/bash : 특정 pod에 대하여 명령 실행

logs

컨테이너 로그 정보

  • kubectl logs POD [ -c container ][ --follow ] [ flags ] : pod log 확인

config

kubectl 설정 관리

  • kubectl config view : config 파일 내용 확인

2. namespace

Kubernetes Object

쿠버네티스는 오브젝트 (리소스)와 (오브젝트를 관리하는) 컨트롤러로 나뉨
=> 쿠버네티스는 클러스터의 상태를 나타내기 위해 오브젝트 이용

Kubernetes Object

  • 쿠버네티스 시스템에서 영속성을 가지는 object (resource)
  • object를 생성하면 쿠버네티스 시스템은 원하는 상태를 보장하기 위해 지속적으로 동작

오브젝트 구성 시 2개의 필드에 의해 구성

status

쿠버네티스 시스템과 컴포넌트에 의해 제공 및 업데이트된 오브젝트의 현재 상태 설명

spec

오브젝트 특성으로 추구하는 상태



컨트롤러는 status와 spec이 일치하도록 오브젝트 관리

쿠버네티스 기본 오브젝트

Pod

쿠버네티스에서 가장 기본적인 배포 단위, 컨테이너를 포함하는 단위

  • 쿠버네티스의 특징 중 하나로 컨테이너를 개별적으로 배포하는 것이 아닌 Pod 단위로 배포
  • Pod는 하나 이상의 컨테이너 포함

Volume

컨테이너는 기본적으로 상태가 없는 app container 사용

  • 상태가 없다 : 컨테이너 혹은 노드에 문제가 있어 컨테이너를 새로 실행했을 때 다른 노드에 자유롭게 옮길 수 있다는 뜻 -> 컨테이너 장점
  • but 컨테이너가 실행되지 않거나 삭제된다면 현재까지 저장한 데이터도 사라진다는 단점
  • app의 특성에 따라 컨테이너에 문제가 발생해도 데이터를 보존해야 하는 경우 Volume 사용
  • 볼륨은 컨테이너가 재시작하더라도 데이터 유지

Service

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

  • 서비스는 Pod에게 고유한 IP 주소와 Pod 집합에 대한 단일 DNS를 부여하여 Pod가 cluster 안 어디에 있든 고정 주소를 통해 접근 가능하도록 유도

Namespace

쿠버네티스 클러스터 하나를 여러개의 논리적인 단위로 나눠서 사용

  • Pod와 서비스 등 namespace 별로 생성 및 관리 가능

쿠버네티스 오브젝트 기술 방법 - 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 파일 공통 4개의 공통 태그

apiVersion

오브젝트 생성을 위한 쿠버네티스 API 버전 명시

kind

어떤 종류의 오브젝트를 생성하고자 하는지 명시

metadata

오브젝트 이름 부여, 오브젝트를 유일하게 구분지어줄 데이터

  • name : 동일 namespace상 유일한 값
  • labels : 특정 쿠버네티스 오브젝트만 나열하거나 검색할 때 유용하게 쓰이는 key-value 쌍

spec

생성할 오브젝트의 구체적 내용 정의, 양식은 쿠버네티스 오브젝트 종류마다 다름

자주 쓰이는 spec 항목

  • containers : Pod에는 1개 이상 컨테이너 포함, 컨테이너들에 원하는 만큼 컨테이너 정의
  • image : pull 받아올 도커 이미지 주소
  • replicas : 원하는 Pod 개수
  • selector : 컨트롤러가 어떤 Pod를 감시하는지 명시
  • template : 새로운 Pod를 생성할 때 사용
    selector 값이 템플릿의 라벨과 일치해야 관리되는 Pod를 제대로 선택

namespace

쿠버네티스 클러스터 내의 논리적인 분리 단위 (물리적 분리 의미 X)

namespace 단위로 자원할당, 사용자 접근권한 관리 등 수행 가능

논리적으로 dev (개발) / stg (통합) / prd (운영)로 namespace 분리

  • dev (개발) namespace : 개발 용도로 사용
  • std (통합) namespace : 통합 목적으로 사용
  • 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 <ns 이름>
  • namespace에 오브젝트 생성
    YAML 파일 metadata tag에 namespace: 지정하고 오브젝트 생성
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
  • namespace 지정하여 오브젝트 검색 :
    kubectl get namespace : 전체 namespace 검색
    kubectl get <리소스 이름> --namespace <ns 이름>
    ex) kubectl get pods --namespace default

  • namespace 삭제
    kubectl delete namespace/<이름> ex) kubectl delete namespace/exam-namespace2
    kubectl delete -f <yaml 파일 이름>

0개의 댓글