컨테이너 운영환경에서, 컨테이너들을 적절하게 관리하는 솔루션
예를 들어, 서비스 요청이 많아지는 경우 이에 대한 부하를 줄이기 위해 노드 수를 동적으로 늘리는 것과 같은 역할을 한다.
대표적으로 다음과 같은 역할을 한다.
이러한 일들을 자동화 해주는 솔루션이다.
# pod_example.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 8090
kubectl create -f pod_example.yaml
로 오브젝트를 생성한다.가장 기본적인 배포 단위로 컨테이너를 포함한다.
왜 여러 개의 컨테이너를 Pod 단위로 배포할까?
아래와 같은 특징 때문이다.
- Pod 내의 컨테이너는 IP와 Port를 공유하여 서로 localhost로 통신이 가능하다.
- Pod내에 배포된 컨테이너 간에는 디스크 볼륨 공유가 가능하다.
컨테이너가 재실행 될 때 마다 로컬 디스크는 Pod 설정에 따라서 새롭게 정의되어 배포되기 때문에 디스크에 기록된 내용이 유실된다.
컨테이너 재실행에 상관 없이 파일을 영속적으로 저장 해야 하는 경우 Volume이라는 스토리지를 사용한다.
컨테이너의 외부 디스크라고 볼 수 있으며 Pod가 기동할 때 컨테이너에 마운트해서 사용한다.
같은 어플리케이션을 운용하는 Pod 간의 로드 밸런싱 역할을 한다.
또, 동적으로 생성되는 Pod 들의 동적 IP 와 달리 Service 는 지정된 IP 로 생성가능하다. (즉 Pod 접근은 어려운 반면, Service 접근은 더 쉽다)
다음과 같은 특징들이 있다.
apiVersion: v1
kind: Service
metadata:
name: hello-node-svc
spec:
selector:
app: hello-node
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
- name: https
port: 443
protocol: TCP
targetPort: 8082
type: LoadBalancer
80 → 8080 으로, 443 → 8082 로 가도록 한번에 설정할 수 있다.nodePort
를 30036으로 설정하면, 아래 설정에 따라 클러스터 IP의 80포트로도 접근이 가능하지만, 모든 노드의 30036 포트로도 서비스를 접근할 수 있다....
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
nodePort: 30036
ExternalName
타입으로 설정하고, 주소를 DNS로 my.database.example.com
으로 설정해주면 이 my-service는 들어오는 모든 요청을 my.database.example.com
으로 포워딩 해준다. (일종의 프록시와 같은 역할)kind: Service
apiVersion: v1
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
서비스 디스커버리 : 마이크로 서비스 아키텍처에서 기능 컴포넌트에 대한 엔드포인트(IP 주소)를 찾는 기능
clusterIP: None
으로 주면 된다.Controller의 주 역할은 Pod 을 생성, 관리하는 것이다.
예를 들어 다음과 같이 yaml
포맷으로 정의할 수 있다.
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
종류는 다음과 같다.
selector
, replicas
, template
을 기본적으로 정의해야 한다.selector
: label
기준으로 어떤 Pod 들을 관리할지 정의한다.replicas
: 선택된 Pod 들을 몇 개의 인스턴스로 띄울지 정의한다.template
: Pod
을 추가로 기동할 때, 어떤 Pod 을 만들지 정의한다.schedule
을 정의해야 한다.네임 스페이스
한 클러스터 내에 논리적인 분리 단위이다.
예를 들면 namespace:billing
과 namespace:commerce
는 같은 클러스터 내에 있지만 논리적으로 분리된 것이다.
한 클러스터 자원을 가지고 개발 / 운영 / 테스트 3개의 네임 스페이스로 나눌 수 있다.
네임 스페이스 별로 접근 권한, 리소스 할당량을 다르게 지정하여 운영할 수 있다.
네임 스페이스는 논리적인 분리 단위이지, 물리적으로 환경을 분리(Isolation)한 것은 아니기 때문에 다른 네임 스페이스 간의 Pod라도 통신은 가능하다.
kind: Pod
...
metadata: labels: app: myapp
selector 를 사용하여 리소스를 선택할 수 있다.kind: Service
...
spec: selector: app: myapp
쿠버네티스 내부 구조는 크게 마스터와 노드 두 개의 컴포넌트로 분리될 수 있다.
쿠버네티스 클러스터 전체를 컨트롤하는 시스템이다.
다음과 같이 구성되어 있다.
마스터에 의해 명령을 받고 실제 서비스하는 컴포넌트다.
다음과 같이 구성되어 있다.
Reference
https://sungwookkang.com/1484
https://bcho.tistory.com/1256?category=731548
https://dailyheumsi.tistory.com/208
아 근데 무슨 말 인지 잘 모르겠음 여기 올린 포스팅 전부 완벽하게는 아니지만 어느정도는 이해하고 스스로 정리해서 올린건데 이건 일단 그냥 올림.. 뭘 모르겠는지도 모르겠고 ..뭔가 써봐야 알 것 같은 느낌 그냥 지금 드는 생각이라곤 .. 로고가 개 귀엽다 네이더스 생각나 도커가 좀 더 네이더스 같다 굿즈 만들어라 근데 난 안쓸래