Pod#
container#
- Pod에는 container가 여러개 있을 수 있으며, localhost로 접근할 수 있다.
- Pod가 생성될 때는 IP가 할당되며, 이 IP를 통해 Pod에 접근할 수 있다.
- 쿠버네티스 클러스터 내에서만 IP로 접근 가능하다.
- Pod가 재생성되면 IP 주소가 바뀐다.
apiVersion: v1
# 하나의 Pod
kind: Pod
metadata:
name: pod-1
spec:
# 여러 개의 container
containers:
- name: container1
image: image1
ports:
- containerPort: 8000
- name: container2
image: image2
ports:
- containerPort: 8080
label#
- Pod 뿐만 아니라 다른 오브젝트에도 사용할 수 있지만, Pod에서 가장 많이 사용된다.
- 목적에 따라 오브젝트를 분류하고 분류된 오브젝트만 연결하기 위해서 사용한다.
- key:value
Pod1 Pod2 Pod3
type:web type:db type:server
env:dev env:dev env:dev
================================================================
Pod4 Pod5 Pod6
type:web type:db type:server
env:prod env:prod env:prod
- 위와 같은 dev/prod 환경에서 web/db/server 종류가 있는 경우
- 웹 개발자가 web만 보고 싶다면 type:web label인 Pod만 서비스에 연결해서 확인하면 된다.
- prod환경 운영자는 env:prod label인 Pod만 서비스에 연결해서 확인하면 된다.
# Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
type: db
env: dev
spec:
containers:
- name: container
image: image
# Service 생성
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
type: web
ports:
-port: 8080
node scheduler#
- Pod는 Node들 중 하나에 올라가야 한다.
- 수동으로 지정하는 방법과 자동으로 지정되는 방법이 있다.
- 수동
- Node를 생성할 때 label을 설정하고 Pod를 만들 때 Node를 선택한다.
- NodeSelector, NodeAffinity, Pod Affinity, Anti-Affinity, Toleration, Taint…
apiVersion: v1
kind: Pod
metadata:
name: pod-3
spec:
nodeSelector:
hostname: node1 # node에 지정한 label의 key, value
containers:
- name: container
image: image
- 자동
- Pod가 요구하는 리소스 할당량과 각 Node의 리소스 할당 가능량을 계산해서 scheduler가 선택한다.
Service#
- Service는 자신의 IP를 가지고 있다.
- Service를 Pod에 연결해 놓으면 Service의 IP를 가지고 Pod에 접근할 수 있다.
- Pod의 IP를 가지고 접근할 수도 있지만, Pod의 IP는 변경될 수 있다.
ClusterIP#
- 가장 기본적인 Service이다.
- 클러스터 내에서만 접근이 가능한 IP이다.
- 클러스터 내의 오브젝트에서는 접근 가능하지만 외부에서는 접근할 수 없다.
- 하나의 Pod 뿐만아니라 여러개의 Pod를 연결할 수 있다.
- 요청이 오면 여러개의 Pod로 분산도 해준다.
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
# label을 이용해서 Pod 연결
selector:
app: pod
# 9000번 포트로 요청이 들어오면 8080번 포트로 연결이도 된다.
ports:
- port: 9000
targetPort: 8080
type: ClusterIP
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
app: pod
spec:
containers:
- name: container
image: tmkube:app
ports:
-containerPort: 8080
NodePort#
- Service에 IP가 포함되어 있어 ClusterIP와 같은 기능이 포함되어 있다.
- 클러스터 내부 모든 Node에 포트를 할당하여 Node의 IP로 접근을 하면 Service로 트래픽이 전달된다.
- Service는 다시 자신에게 연결된 Pod로 트래픽을 전달한다.
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
nodePort: 30000
type: NodePort
# 이 옵션을 사용하면 Service가 요청이 들어온 Node의 Pod로 트래픽을 전달한다.
externalTrafficPolicy: local
Load Balancer#
- NodePort의 특징을 포함하고 있다.
- Load Balancer라는 오브젝트가 생성되어 각 Node에 트래픽을 분산 시킨다.
- 외부에서 Load Balancer에 접근하기 위한 IP는 기본적으로 설정되어 있지 않다.
apiVersion: v1
kind: Service
metadata:
name: svc-3
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
nodePort: 30000
type: LoadBalancer
ExternalName#
- 클러스터 외부 서비스에 접근하기 위해 사용하는 서비스이다.