Backend/Docker, k8s
k8s - Service
tyoon9781
2023. 4. 28. 00:00
Service는 고정 IP를 통해 Client로부터 Pod의 일회성으로 인한 IP변동에 대해 알 필요가 없도록 하는 기술이다.
ClusterIP
기본 서비스 타입. 클러스터 내부에서 사용 가능
예시1 : hostname-server.yaml (deployment)
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostname-server
labels:
app: hostname-server
spec:
replicas: 2
selector:
matchLabels:
app: hostname-server
template:
metadata:
labels:
app: hostname-server
spec:
containers:
- name: hostname-server
image: takytaky/hostname
ports:
- containerPort: 80
예시2 : clusterip-hostname.yaml (service)
apiVersion: v1
kind: Service
metadata:
name: clusterip-hostname-service
spec:
type: ClusterIP
selector:
app: hostname-server
ports:
- protocol: TCP
port: 80
targetPort: 80
.spec.type : ClusterIP는 기본
.spec.selector: app.hostname-server
ports: port(svc):80, targetPort(container): 80
service endpoint를 확인하려면
kubectl describe svc {service_name}
linux 내에서 확인하려면
iptables -t nat -s | grep {service_name}
이런 규칙은 Master node뿐만 아니라 worker node에도 똑같이 설정되어 있다. 이런 규칙을 배포하는 pod가 바로 kube-proxy이다. 아래 명령어로 확인해보자
kubectl get ds -n kube-system
* sessionAffinity : 연결 요청시 규칙
- NONE : 임의 pod 연결
- ClientIP : 같은 Client면 같은 pod을 연결
- timeoutSeconds : 클라이언트 정보가 유지되는 시간(기본값 3hours)동안 같은 pod 연결
service 제거를 하려면
kubectl delete svc {service_name}
NodePort : ClusterIP + Export IP(Node IP)를 같이 사용
apiVersion: v1
kind: Service
metadata:
name: nodeport-hostname-service
spec:
type: NodePort
selector:
app: hostname-server
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
.spec.ports
- port(svc가 수신할 port)
- targetPort(container가 수신할 port)
- nodePort(30000~32767 범위) (Node가 수신할 port)