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
어떤 종류의 오브젝트를 생성하고자 하는지 명시
오브젝트 이름 부여, 오브젝트를 유일하게 구분지어줄 데이터
- 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 파일 이름>