본문 바로가기

DevOps/Kubernetes

[Kubernetes] 쿠버네티스 아키텍처

쿠버네티스 아키텍처

  • 쿠버네티스 동작원리
  • namespace
  • yaml
  • api version

 

개발자 혹은 운영자가 컨테이너를 만들어
docker push 를 이용해 hub에 저장합니다.

 

kubectl을 이용해 kuberneties가 hub에 있는 컨테이너를 실행하도록
master node(control plane)에게 요청합니다.

 

master에 있는 api가 요청을 받아들여
worker node(작업 노드)에 스케줄러에게 컨테이너를 실행하도록 요청합니다.

 

스케줄러는 컨테이너를 실행하기 적합한 node를 찾아 해당 kubelet에
컨테이너 실행 요청을 합니다.

 

요청받은 node의 kubelet이 요청을 docker 명령어로 변환해
dockerd에 전달합니다.

 

dockerd은 hub에 해당 컨테이너가 있는지 확인 후 컨테이너로 실행하게됩니다.
k8s는 pod라는 단위로 이를 관리하게 됩니다.

 

쿠버네티스 컴포넌트

  • 마스터 컴포넌트
    • etcd
      : key-value타입의 저장소입니다.
      : worker node들의 상태가 저장되어 있습니다.
    • kube-apiserver
      : k8s API를 사용하도록 요청을 받고 요청이 유호한지 검사합니다.
    • 스케줄러
      : 컨테이너 실행에 있어 어떤 노드가 적합한지 체크합니다.
    • 컨트룰러 매니저
      : 파드를 관찰하며 개수를 보장합니다.
  • 워커노드 컴포넌트
    • kubelet
      : 모든 노드에서 실행되는 k8s 에이전트입니다.
      : 데몬 형식으로 동작합니다.
    • kube-proxy
      : k8s의 네트워크 동작을 관리합니다.
      : iptables rule을 구성합니다.
    • 컨테이너 런타임
      : 컨테이너를 실행하는 엔진입니다.
      : docker, containerd, runc

-애드온 생략 (cAdvisor, CNI, coreDNS ...)

 

 

K8s namespace

물리적인 클러스터는 하나이지만 여러개로 동작하도록 네임스페이스를 만들어 각각 관리하는 방식입니다

  • namespace
    클러스터 하나를 여러 개의 논리 적인 단위로 나눠서 사용
  • 쿠버네티스 클러스터 하나를 여러 팀이나 사용자가 함께 공유
  • 용도에 따라 실행해야 하는 앱을 구분할 때 사용

namespace 사용하기

namespace 보기 kubectl get namespaces

기본은 default namespae가 동작중입니다.
현재 namespace에서 동작중인 pod를 보기위해 아래 명령어들을 사용할 수 있습니다.

kubectl get pod
kubectl get pod --namespace default
kubectl get pod -n default

cat > nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - image: nginx:1.14
      name: nginx
      ports:
        - containerPort: 80
        - containerPort: 443
kubectl create -f nginx.yaml
kubectl get pods -n default

모든 namespace에서 실행중인 모든 pod들을 아래 명령어로 불러올 수 있다.
-> k8s 시스템을 위한 pod들도 가져오기 때문에 파드 관리가 힘들어 질 것이다.

kubectl get pods --all-namespaces

네임스페이스 만들어 사용해보기

  • 네임스페이스 만들어 사용해보기 - CLI방법
kubectl create namespace blue
  • 네임스페이스 만들어 사용해보기 - yaml방법
kubectl create namespace red --dry-run -o yaml > red-ns.yaml

ls

vi red-ns.yaml

creationTimestamp 지우기
spec, status 지우기

kubectl get namespace
  • 만들었던 nginx.yaml파일을 red namespace로 실행해보기
kubectl create -f nginx.yaml -n red

vi nginx.yaml
metadata에 namespace:red로 설정해주면 실행될 때 명령어를 입력하지 않아도 됩니다.

사용할 네임스페이스 switch

쿠버네티스는 기본적으로 default namespace를 사용합니다.
이 기본 설정값을 변경하는 법을 알아보겠습니다.

kubectl config -- help

kubectl config view

kubectl config set-context blue@kubernetes --cluster=kubernetes --user=kubernetes-admin --namespace=blue
kubectl config current-context 현재 기본 namespace가 무엇인지 보는 명령어
kubectl config use-context blue@kubernetes

네임스페이스 삭제하기

네임스페이스 삭제 시 내부 pod, api 들 모두 삭제됩니다.
kubectl delete namespace blue

yaml 템플릿

사람이 쉽게 읽을 수 있는 데이터 직렬화 양식

  • 기본 문법
    - 구조화된 데이터를 표현하기 위한 데이터 포맷
    • Python처럼 들여쓰기로 데이터 계층을 표기
    • 가독성이 좋아 설정 파일에 적합한 형식
    • Scalar 문법 : ':'을 기준으로 key:value 설정
    • 배열 문법 : '-' 문자로 여러개를 나열

API Version

  • alpha -> beta -> stable
  • k8s object 정의 시 apiVersion이 필요
  • k8s가 update하는 API가 있으면 새로운 API가 생성됨

API Object의 종류

  • deployment
  • Pod
  • ReplicaSet
  • ReplicationController
  • Service
  • PersistentVolume

explain으로 버전 확인
kubectl explain pod -> pod의 version을 알려줌