새로운 회사에 와서 이제는 진짜 드디어 Kubernetes를 공부할 때가 왔다.
사실 코프링도 대기중임 만관부~
→ 이게 나여서 진짜 핵심만 개념 공부를 해보았다.
공부 Reference
그냥 한마디로 컨테이너들을 프로덕션 환경에서 안정적으로 배포하기 위한 툴이라고 생각하자.
갑자기 문제가 생겨서 어떤 앱이 죽거나, 서버가 다운되거나.. 등등의 이슈가 생겨도 알아서 서버를 다시 살리고, 다른 앱을 새로 키는 등의 관리를 하는 걸 자동으로 해주는 툴이다.
k8s에는 크게 세가지 요소가 있다.
공식문서의 이 그림이 하나의 Cluster를 나타낸다.
k8s가 관리하는 가장 큰 단위를 Cluster 라 한다. 유저가 설정한 Cluster 안에서 k8s는 자동으로 자원을 관리하고, 죽은 앱들을 살리는 작업들을 한다.
Pod는 k8s가 컨테이너를 관리하고 실행하는 논리적인 단위이다.
지선생님이 주신 예시 pod세팅 yaml 파일을 간단히 봐보자.
여기에 있는 모든 세팅을 실제로 다 사용할 가능성은 적어보이긴 한다.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
labels:
app: my-app
tier: backend
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
resources:
requests: # Minimum resource requirements
memory: "64Mi"
cpu: "250m"
limits: # Maximum resources the container can use
memory: "128Mi"
cpu: "500m"
env: # Environment variables
- name: ENVIRONMENT
value: production
volumeMounts: # Mounting storage volumes
- name: config-volume
mountPath: /etc/config
volumes: # Declaring storage volumes
- name: config-volume
configMap:
name: my-config-map
nodeSelector: # Run pod on nodes with specific labels
disktype: ssd
restartPolicy: Always # Pod restart policy (Always, OnFailure, Never)
securityContext: # Security settings for the pod
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
dnsPolicy: ClusterFirst # DNS policy for the pod (ClusterFirst, Default)
우리는 개념을 핵심만 배우는 것이기 때문에, 전부는 말고 슬쩍만 보면
image: nginx-latest
→ 띄우고 싶은 컨테이너 이미지를 설정한다
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
→ 이 Pod에 할당할 최대와 최소 CPU및 메모리 할당 정보다
restartPolicy: Always
→ 이 Pod이 죽으면 어떻게 할껀지에 대한 설정이다.
이렇게 알 수 있듯이, 어떤 컨테이너를 k8s Cluster안에서 어떤 세팅으로 실행하고 관리하게 할 것인지에 대한 정보를 갖는 논리적인 단위를 Pod이라 한다.
Node는 기본적으로는 Pod들이 실제로 실행되어 동작하는 물리/논리 서버의 컴퓨팅 단위이다.
k8s의 Node에는 크게 두가지가 있다.
하나씩 구성을 알아보자
이름에서 알 수 있듯이 Worker Node들을 관리하는 Node이다.
하지만 위에서 말했듯, Node는 Pod들이 실행되는 컴퓨팅 단위이다.
따라서 Master Node에는 k8s가 클러스터를 관리하기 위해 구현해놓은 구현체들이 Pod의 단위로 실행되고 있다. 그래서 Control Plane이라고도 한다.
이 구현체들은 다음과 같다.
controller
라는 프로세스 들을 실행하는 곳.controller
는 k8s Cluster를 전반적으로 관리하는 loop마찬가지로 이름에서 알 수 있듯이, 실제 일을 하는 Node, 우리의 경우에는 우리가 지정한 Pod들이 실행되는 컴퓨팅 단위이다. 이 또한 컨테이너를 실행하고 관리하기 위한 구현체들이 실행된다.
여기까지 개념을 잡았을 때 처음에는 이런 의문이 들었다.
Master Node의 kube-scheduler에서는 Pod들이 Node에 배정이 됐나 안됐나를 확인해서 배정한다고 했는데, Pod(컨테이너)은 애초에 Node(컴퓨팅 단위)가 없으면 실행할 수 없는 것 아니야?
약간 운영체제식 질문으로 풀어보면 프로그램이 컴퓨터 없이 어떻게 실행돼? 라는 생각이 들었다.
그러나 잘 읽어보면 Pod는 컨테이너를 실행하기 위한 k8s의 논리적인 단위이기 때문에 실행인 상태일수도, 실행되지 않은 상태일수도 있는 것이다.
이 말은, 위의 질문에 비유에 대입해보면 다음과 같은 느낌이다.
k8s | 운영체제 |
---|---|
Pod | 프로그램 |
컨테이너 인스턴스 | 실행 중인 프로세스 |
Node | CPU |
프로그램이 실행중일수도, 잠깐 스케쥴링돼 대기중일수도 있으니까.. 이 비유가 적절한진 모르겠지만 나는 이렇게 이해했다.