[쿠버네티스] Architecture 기초
💡 본 내용은 공부한 내용에 기반하였음
Master Node / Control Plane
- Kube-API Server
- 모든 내/외부 명령어가 처리되는 곳
- REST API 제공, Authentication, Authorization, Admission Control 기능 제공
- 수평 확장이(Scale-out)이 가능하도록 설계되어있음
- Kube-Schedular
- NodeName, 즉 아직 할당되지 않은 pod를 감지하고, 실행할 최적의 Node에 배치
- 스케줄링 기준
- 리소스 요구사항 (CPU/Memory)
- 하드웨어/소프트웨어 제약 조건
- Affinity 및 Anti-affinity
- Taint와 Toleration
- Kube-Controller-Manager
- 컨트롤러 프로세스를 구동하는 컴포넌트
- 주요 컨트롤러
- Node Controller : 노드가 다운되었을 때 감지 후 대응
- Replication Controller : 시스템의 모든 Replication Controller 오브젝트에 대해 알맞을 수의 pod를 유지
- Endpoint Controller : Service와 Pod를 연결
- etcd
- 모든 클러스터 데이터를 저장하는 고가용성 key-value 저장소
- K8s의 유일한 Stateful 컴포넌트이며, Single Source of Truth (얘만 있으면 복구 사능)
Worker Node
모든 Worder Node에서 실행되며, pod를 유지 관리하고 런타임 환경 제공
- Kubelet
- 클러스터의 각 노드에서 실행되는 에이전트. PodSpec의 정의에 따라 관리
- API Server와 통신하여 노드의 리소스 상태를 보고하고, Pod의 Health Check
- 쿠버네티스를 통해 생성된 컨테이너만 관리
- Kube-proxy
- 각 노드에서 실행되는 네트워크 프록시
- 노드의 네트워크 규칙(iptables or IPVS)를 유지 관리하고 클러스터 내/외부의 통신 라우팅
- Container Runtime
- 실제로 컨테이너를 실행하는 소프트웨어
- Containerd, CRI-O등 Kubernetes CRI를 구현한 런타임
Core Objects Definition
- Pod
- 쿠버네티스에서 생성하고 관리하는 가장 작은 배포 단위
- 하나 이상의 컨테이너 그룹
- 스토리지/네트워크 공유
- IP는 pod에 부여되기 때문에 내부의 컨테이너는 모두 동일한 IP, 포트로 구현
- Deployment
- Pod와 ReplicaSet에 대한 declarative updates 제공
- Rolling update, rollback, scaling, pausing
- 사용자가 desired state 정의 시, depoloyment controller가 actual state를 이에 맞춤
- Service
- Pod의 집합에 접근할 수 있는 정책을 정의하는 추상적 개념
- Pod는 일시적(Ephemeral)이기에 ip가 변동하므로, 고정된 virtual IP(ClusterIP)를 제공하여 안정적인 네트워크 엔드포인트 보장
- ConfigMap
- 기밀성이 없는 일반적인 설정 데이터를 저장
- etcd에 평문으로 저장되며, 1MB를 초과할 수 없음
- 환경 변주로 주입 시 파일이 변경되면 파드 재생성해야함
- 볼륨으로 마운트시 싱크 주기에 따라 자동 갱신
- Secret
- .env와 비슷한 역할
- 비밀번호, 토큰, 키 등 민감한 데이터를 저장
- base64로 인코딩되어 저장
- 아무나 디코딩 가능하기에 etcd 저장 시
EncyptionConfiguration설정해줘야함
- 아무나 디코딩 가능하기에 etcd 저장 시
- 볼륨 마운트시 노드 디스크에 민감 정보가 기록되는 것을 방지하기 위해 디스크가 아닌 tmpfs(RAM 메모리 파일시스템)에 저장
- PV (PersistentVolume)
- 클러스터 내에 존재하는 실제 스토리지 자원
- Cluster 레벨 리소스이며, namespace에 속하지 않음
- PVC (PersistentVolumeClaim)
- 사용자가 PV를 사용하기 위해 요청하는 일종의 스토리지 요청서(claim)
- Namespace 레벨 리소스
- PVC 생성 시 PV Controller가 클러스터 내의 pv 중 조건이 일치하는 것을 찾아 연결
아래는 예시들이다
ConfigMap
```yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql-config namespace: mysql-2tier ```Secret
```yaml apiVersion: v1 kind: Secret metadata: name: mysql-secret namespace: mysql-2tier data: mysql-root-password: MDMyMw== mysql-user-id: bGVl mysql-user-password: MDMyMw== mysql-database-name: bGVl ```PV
```yaml apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv-2tier spec: # storageClassName: manual 바운드가 안되면 추가 capacity: storage: 5G accessModes: - ReadWriteOnce hostPath: path: "/var//var/lib/mysql" ```PVC
```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc namespace: mysql-2tier spec: accessModes: - ReadWriteOnce resources: requests: storage: 5G ```Deployment
```yaml apiVersion: apps/v1 kind: Deployment metadata: name: mysql-deploy namespace: mysql-2tier spec: selector: matchLabels: app: mysql replicas: template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0.44-debian env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: mysql-root-password # - name: MYSQL_USER # valueFrom: # secretKeyRef: # name: mysql-secret # key: mysql-user-id # - name: MYSQL_PASSWORD # valueFrom: # secretKeyRef: # name: mysql-secret # key: mysql-user-password # - name: MYSQL_DATABASE # valueFrom: # secretKeyRef: # name: mysql-secret # key: mysql-database-name ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-storage mountPath: /var/lib/mysql - name: initdb mountPath: /docker-entrypoint-initdb.d - name: mysql-config-volume mountPath: /etc/mysql/conf.d/ readOnly: true volumes: - name: mysql-storage persistentVolumeClaim: claimName: mysql-pvc - name: initdb configMap: name: mysql-initdb-config - name: mysql-config-volume configMap: name: mysql-config ```Service
```yaml apiVersion: v1 kind: Service metadata: name: mysql-svc namespace: mysql-2tier spec: type: ClusterIP selector: app: mysql ports: - protocol: TCP port: 3306 targetPort: 3306 ``` This post is licensed under CC BY 4.0 by the author.