
Pod은 자체 IP를 가지지만 계속 생성/제거 되기 때문에 IP가 변동된다.
그래서 이러한 Pod과 직접 통신하는 것은 권장되지 않는다.
그래서 Pod들과 연결된 Service라는 별도의 개체를 만들어서 IP를 할당하고
Service를 통해서 Pod 들과 통신한다.
외부에서 Pod으로 접속하는게 아닌,
Cluster에 있는 Pod이 다른 Pod에 접속하기 위해 만드는 서비스다.
내부적으로 도메인을 등록하여 같은 클러스터에서 도메인으로 접근할 수 있다.
apiVersion: v1
kind: Deployment
metadata:
name: deploymentName
spec:
selector:
matchLabels:
app: appName
tier: tierName
template:
metadata:
labels:
app: appName
tier: tierName
spec:
containers:
- name: containerNAme
image: imagePath
ports:
- containerPort: port
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: serviceName
spec:
ports:
- port: port
protocol: TCP
selector:
app: appName
tier: tierName
Service의 spec.ports.port와Deployment의spec.template.spec.containers.ports.containerPort 값이 동일한 경우 spec.ports.port로 접근하면 spec.template.spec.containers.ports.containerPort로 붙는다.
두 값이 다른 경우
spec.ports.targetPort로 서비스가 접근할 Pod의 port를 지정하면 된다.

Endpoint Contoller
kube Proxy
CoreDNS
ClusterIP는 내부에서만 접근이 가능하다.
NodePort의 경우 Clutser 외부에서 접근하기 위함이다
apiVersion: v1
kind: Service
metadata:
name: serviceName
spec:
type: NodePort
ports:
- port: 3000
protocol: TCP
nodePort: 31000
selector:
app: appName
tier: tierName
spec.type을 따로 지정 안해주면 ClusterIP가 된다.

Node가 여러개인 경우 한 Service로 접속할 수 있도록 한다.

Node가 사라진 경우 다른 Node를 통해 접속하도록 해야한다.
LoadBalancer는 더 앞에서 NodePort 여러개를 관리해준다.
살아있는 Node를 통해서 접속할 수 있도록 해준다.
apiVersion: v1
kind: Service
metadata:
name: serviceName
spec:
type: LoadBalancer
ports:
- port: 30000
targetPort: 3000
protocol: TCP
selector:
app: appName
tier: tierName