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)
'Backend > Docker, k8s' 카테고리의 다른 글
Docker + Frontend(Nginx, React) + Backend(Nginx, Gunicorn, Django, PostgreSQL) (7) | 2023.06.20 |
---|---|
Docker Compose - tutorial (0) | 2023.06.18 |
Docker - Tutorial (0) | 2023.06.17 |
k8s - Pod (0) | 2023.04.27 |
Docker - ubuntu에 Docker 설치 (0) | 2023.04.26 |