쿠버네티스란 컨테이너화된 워크로드와 서비스를 관리하기 위한 오픈소스 컨테이너 오케스트레이션 플랫폼
컨테이너는 원래 프로세스나 애플리케이션을 기반 시스템으로부터 격리하기 위해 만들어졌기 때문에, 개별 컨테이너를 생성하고 배치하는 것은 쉬움
하지만 컨테이너의 수가 많아지게 되면 관리와 운영에 어려움이 따름
각각 독립적으로 배치된 컨테이너를 연결하고 관리하고 확장하면서 이 요소들 전체가 하나로 실행되도록 할 수 있어야 함. 이렇게 다수의 컨테이너 실행을 관리하고 조율하는 것을 컨테이너 오케스트레이션이라고 함
Control plane (Master node): Kubernetes 전체를 통제/관리
Data Plane (Worker node): 실제 사용자의 애플리케이션 배포
컨텍스트 전환
$ Kubectl config use-context minikube
현재 컨텍스트 확인
$ kubectl config current-context
컨텍스트 목록 조회
$ kubectl config get-contexts
kubeconfig 컨텍스트 내용 변경: yaml 파일 편집 or kubectl
alias k=kubectl 으로 alias 설정
노드 확인
$ k get node
네임스페이스 확인
k get ns
포드확인
$ k get pod
$ k get pod -A
$ k get all
$ k get all -A
# etcd pod 상세 확인
$ k describe pod etcd-minikube -n kube-system
-cacert /etc/kubernetes/pki/etcd/ca.crt
-cert /etc/kubernetes/pki/etcd/server.crt
-key /etc/kubernetes/pki/etcd/server.key
-endpoints=[127.0.0.1:2379]
# etcd pod 로 shell 실행
$ kubectl exec -it \
-n kube-system etcd-minikube \
-- sh -c 'ETCDCTL_CACERT=/var/lib/minikube/certs/etcd/ca.crt \
ETCDCTL_CERT=/var/lib/minikube/certs/etcd/peer.crt \
ETCDCTL_KEY=/var/lib/minikube/certs/etcd/peer.key \
ETCDCTL_API=3 \
etcdctl \
get \
--keys-only \
--prefix=true \
"/registry/pods/" '
# etcd pod 로 shell 실행
$ kubectl -n kube-system exec -it etcd-minikube -- /bin/sh
# member 조회
$ ETCDCTL_API=3 etcdctl \
--cacert /var/lib/minikube/certs/etcd/ca.crt \
--cert /var/lib/minikube/certs/etcd/peer.crt \
--key /var/lib/minikube/certs/etcd/peer.key \
put Name limsangkyu
$ ETCDCTL_API=3 etcdctl --cacert /var/lib/minikube/certs/etcd/ca.crt --cert
/var/lib/minikube/certs/etcd/peer.crt --key /var/lib/minikube/certs/etcd/peer.key
get Name
# 모든 값 출력
$ ETCDCTL_API=3 etcdctl \
--cacert /var/lib/minikube/certs/etcd/ca.crt \
--cert /var/lib/minikube/certs/etcd/peer.crt \
--key /var/lib/minikube/certs/etcd/peer.key \
get / --prefix --keys-only
# kube-apiserver pod 상세 확인
$ k describe pod kube-apiserver-minikube -n kube-system
pod를 manual scheduling 해주어야 함
사용자가 특정 노드에 pod를 배치하고 싶을 때
→ nodeSelecor, Node Affinity, Node Anti-Affinity, Inter Pod Affinity, Inter Pod Anti-Affinity
관리자가 특정 노드에는 pod가 배치되는 것을 막고 싶을 때
→ Taints, Tolerations
어떤 pod가 어떤 node에 스케줄링 될 수 있는지를 제한
대표적인 예) kubernetes의 control node에는 pod가 스케줄링되지 않도록 taint가 되어있음
Taints: node가 가지게 되는 성격. 예) taint:blue
Toleration: pod가 가지게 되는 taint에 대한 toleration. 예) toleration: blue
# Node
$ kubectl taint nodes node1=blue:NoSchedule(|PreferNoSchedule|NoExecute)
# Pod
apiVersion: v1
kind: pod
metadata:
name: myapp-pod
spec:
containers:
- name: nginx
image: nginx
tolerations:
- key: "app"
operator: "Equal"
value: "blue"
effect: "NoSchedule"
# Labels and Selector
# Node
$ kubectl label nodes node1 size=Large
# Pod
apiVersion: v1
kind: pod
metadata:
name: myapp-pod
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
size: Large
# Labels and NodeAffintiy
# Pod
apiVersion: v1
kind: pod
metadata:
name: myapp-pod
spec:
containers:
- name: nginx
image: nginx
affinitiy
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpreesions:
- key: size
operator: In(|NotIn|Exists) // Exist 인 경우 value가 필요없음
value:
- Large
- Medium
# kube-controller-manager pod 상세 확인
$ k describe pod kube-controller-manager-minikube -n kube-system