K8s 1. 쿠버네티스 아키텍처

skh951225·2023년 3월 19일
0

K8s

목록 보기
2/3

출처 : 따배쿠 4 (Youtube)

k8s 동작 원리

k8s 동작 과정


1. Container image를 구성하고 이를 hub 저장(docker-compose...)
2. 실행시키고 싶은 image를 control plane(master)의 API에게 전달(kubectl create, kubectl run...)
3. control plane의 scheduler가 container를 실행시킬 적당한 워커노드를 찾음
4. 해당 worker node의 kublet에게 container 실행 요청을 전달
5. kubelet은 docker에게 요청 전달
6. docker는 hub의 이미지를 끌어와 container를 run

pod : 쿠버네티스 포드는 Linux 컨테이너를 하나 이상 모아 놓은 것으로, 쿠버네티스 애플리케이션의 최소 단위입니다.
replicaset : 동일한 역할을 하는 하나 이상의 pod(scale out 의 관점)
deployment : Pod, replicaset 의 desired state이며 deployment controller 는 actual state를 desired state로 유지시켜주는 역할을 함

k8s 컴포넌트

1. master 컴포넌트

  • etcd : key-value 타입으로 워커노드들의 상태정보를 저장 (kubelet에 설치되어 있는 cAdvisor를 통해)
  • api : 사용자의 요청을 받아서 문법, 권한 등이 합당한지 검사하고 실행
  • controller : 요청된 명령들이 잘 실행되고 있는지 감시, 만약 비정상적으로 종료된 컨테이너가 존재한다면 api에게 이를 알림
  • scheduler : 컨테이너가 실행될 적당한 노드를 선정하는 역할
  • coreDNS, CNI : 쿠버네티스 내의 통신을 지원해주는 addon 프로그램

2. 워커 노드 컴포넌트

  • kubelet : 모든 노드에서 실행되는 k8s 에이전트, 데몬 형태로 동작
  • kube-proxy : k8s의 네트워크 동작을 관리, iptables rule을 구성
  • 컨테이너 런타임 : 컨테이너를 실행하는 엔진 ex) docker..

k8s 컨테이너 실행 시나리오

  1. API가 컨테이너 실행 명령을 받으면 문법, 권한 등을 확인
  2. 문제 없다면 etcd에 저장된 워커노드들의 상태정보를 받아 scheduler에게 전달
  3. scheduler는 이 정보를 바탕으로 적당한 워커노드들을 선정하여 api에게 응답
  4. api는 kubelet에게 컨테이너 실행 명령을 전달
  5. kubelet은 docker에게 실행 명령을 전달

addon : k8s 기능을 확장하는 역할, base로 설치되는 것도 있음

  • 네트워크 addon : CNI(weave,calico, flaneld, kube-route...)
  • dns addon : coreDNS (base)
  • 컨테이너 모니터링 : cAdvisor (base)
  • 클러스터 로깅
    - 컨테이너 로그, k8s 운영 로그들을 수집해서 중앙화
    - ELK(ElasticSearch(정재), Logstash(수집), Kibana(web ui 지원)), EFK(ElasticSearch, Fluentd(수집), Kibana), DataDog(한번에 3가지)
  • dashboard addon : dashboard

K8s Features

공식문서

1. Automated rollouts and rollbacks
변화를 반영할때 instace를 한번에 다 죽이는게 아니라 순차적으로 update함(rollout), update하는 도중 뭔가 잘못되면 rollback

2. Storage orchestration
원하는 storage system에 자동으로 마운트(docker volume 인듯)

3. Secret and configuration management
사용자의 이미지를 다시 빌드하거나 스택 구성의 시크릿을 노출하지 않고 시크릿과 애플리케이션 구성을 배포하고 업데이트한다.

4. Batch execution
쿠버네티스는 서비스 외에도 배치(batch)와 CI 워크로드를 관리할 수 있으며, 원하는 경우 실패한 컨테이너를 교체할 수 있다.

5. IPv4/IPv6 dual-stack
파드와 서비스에 IPv4와 IPv6 주소 할당

6. Service discovery and load balancing
쿠버네티스를 사용하면 익숙하지 않은 서비스 디스커버리 메커니즘을 사용하기 위해 애플리케이션을 수정할 필요가 없다. 쿠버네티스는 파드에게 고유한 IP 주소와 파드 집합에 대한 단일 DNS 명을 부여하고, 그것들 간에 로드-밸런스를 수행할 수 있다.
service discovery : service client가 service 의 위치(ip,port)를 알아내는 것

7. Self-healing
오류가 발생한 컨테이너를 재시작하고, 노드가 죽었을 때 컨테이너를 교체하기 위해 다시 스케줄하고, 사용자 정의 상태 체크에 응답하지 않는 컨테이너를 제거하며, 서비스를 제공할 준비가 될 때까지 클라이언트에 해당 컨테이너를 알리지 않는다.

8. Automatic bin packing
각 컨테이너에 필요한 CPU, 메모리를 요구사항에 맞게 자동으로 할당해준다

9. Horizontal scaling
간단한 명령어나 UI를 통해서 또는 CPU 사용량에 따라 자동으로 애플리케이션의 스케일을 업 또는 다운한다.

10. Designed for extensibility
Upstream source code 변경없이 kubernetes cluster에 feature를 추가할 수 있다.

Namespace

클러스터 하나를 여러개의 논리적인 단위로 나눠서 사용하는데 namespace 는 이러한 논리적인 단위를 말한다.

  1. 용도에 따라 실행해야하는 앱을 구분할때나

  2. 쿠버네티스 클러스터 하나를 여러팀이나 사용자가 함께 공유할때 유용하게 사용할 수 있다.

    kubectl get namespaces

  • default : 기본적으로 생성되는 base namespace

  • kube-.. : kubenetes 동작에 관련되 namespace

    namespace 만드는 법

  1. kubectl create namespace 네임스페이스이름 : cli 방법

  2. kubectl create namespace 네임스페이스이름 --dry-run -o yaml > .yaml : yaml 파일 생성해서 kubectl create -f .yaml

    namespace switch

    kubectl config view : config 정보 보여줌
    kubectl config set-context blue --cluster=minikube --user=minikube --namespace=blue : minikube cluster 에 minikube 권한을 가지고 blue namespace를 쓰는 blue context를 생성
    kubectl config current-context : 현재 사용중인 context를 보여줌
    kubectl config use-context 컨텍스트 이름 : context switch 해줌
    kubectl delete namespace blue : blue namespace 삭제, namespace안에 포함된 것들이 모두 삭제되니 주의
    kubectl config delete-context 컨텍스트이름 : 컨텍스트 삭제

    Yaml(Yaml Ain't Markup Language)

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

#!syntax yaml
name: Rust
on:
    push:
        branches: [master]
    pull_request:
        branches: [master]
env:
    CARGO_TERM_COLOR: always
jobs:
    build:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v2
            - name: Build
              run: cargo build --verbose
            - name: Run tests
              run: cargo test --verbose

출처 : 나무위키

  • 들여쓰기를 할 때에는 Tab이 아닌 Space Bar를 사용
  • 가독성이 좋아 설정 파일에 적합한 형식
  • Scalar 문법 : ':'을 기준으로 key:value 를 설정
  • 배열 문법 : '-'문자로 여러개를 나열

API version

kuberentes object 정의 시 apiVersion이 필요하며 각 Object마다 version이 다를 수 있다.
kubectl api-resources : object들의 정보
kubectl explain 오브젝트 : 오브젝트에 대한 정보를 보여줌

0개의 댓글