Skip to main content

Service


Service

Deployment and Service

각 Pod는 고유한 IP 주소를 갖습니다. 하지만 Deployment를 사용하여 애플리케이션을 배포할 때, 한 시점에 실행되는 Pod 집합과 다음 시점에서 실행되고 있는 Pod 집합이 다를 수 있습니다. 이런 상황에서 해당 Pod 집합을 사용해야하는 서비스가 존재한다면, 이 변화를 추적해야하는 문제가 생깁니다. 이러한 문제를 해결하기 위해 Service 리소스가 필요합니다.

apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP # ClusterIP(default)|NodePort|LoadBalancer|ExternalName
selector: # selector를 사용하지 않으면 Endpoints를 생성하여 수동으로 매핑
app: my-app # Pod의 label에 해당 key: value 가 있는 것을 선택
ports:
- name: http
port: 8080 # service port
targetPort: 8080 # pod port. pod에 port.name을 정의했다면 name으로 대체 가능
protocol: TCP # TCP(default)|UDP|SCTP|HTTP|PROXY
info

kubectl explain [--recursive] service[.<fieldName>] 을 통해 자세한 설명을 볼 수 있습니다.

FQDN

<name>.<namespace>.svc.cluster.local이 쿠버네티스 DNS에 등록됩니다.

컨테이너 내부에서 Service를 찾을 때, <name>, <name>.<namespace> 등을 사용하여 찾을 수 있습니다. 앞의 일부만 적었을 때, /etc/resolv.conf 파일의 search 옵션에 적힌 값을 기준으로 탐색합니다.

/etc/resolv.conf
...

search <namespace>.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal

...

NodePort

NodePort는 pod ip:targetPort --- service ip:port --- node ip:nodePort 연결을 통해 외부에서 pod로 접근 할 수 있게 만들어주는 서비스 입니다.

$ kubectl describe pods -n kubernetes-dashboard kubernetes-dashboard

...

Labels: k8s-app=kubernetes-dashboard
pod-template-hash=576cb95f94

...

Containers:
kubernetes-dashboard:
...

Port: 8443/TCP

...

kubernetes-dashboard-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: kubernetes-dashboard-nodeport
namespace: kubernetes-dashboard
spec:
type: NodePort
selector:
k8s-app: kubernetes-dashboard
ports:
- port: 443
targetPort: 8443
# nordPort: <30000-32767> # 설정하지 않으면 해당 범위에서 랜덤하게 선택
kubectl apply -f kubernetes-dashboard-nodeport.yaml
kubectl describe svc -n kubernetes-dashboard kubernetes-dashboard-nodeport

Debug

kubectl run tmp-shell --rm -it --image nicolaka/netshoot -- sh

Reference