# 서비스 ## YAML ## 서비스 apiVersion: v1 kind: Service metadata: name: web-service spec: # type을 생략하여 ClusterIP가 적용된다. selector: # service - 백엔드 pod와 연결 app: web ports: - protocol: TCP port: 80 ### 서비스 API ^ 항목 ^ 설명 ^ | kind | Service 설정 | | apiVersion | v1 설정 | | metadata | name에 네임스페이스 내 유일한 이름을 설정. \\ 여기서 설정한 이름은 내부 DNS에 등록되며, IP 주소 해결에 사용.\\ 또한, 이후 기동된 파드의 환경 변수에 설정 | | spec | | ### 서비스 사양 ^ 항목 ^ 설명 ^ | type | 서비스 공개 방법을 설정\\ 선택이 가능한 타입은 [[ClusterIP]], [[NodePort]], [[LoadBalancer]], [[ExternalName]] 네 가지 | | ports | 서비스에 의해 공개되는 포트번호 | | selector | 여기서 설정한 라벨과 일치하는 파드에 요청을 전송.\\ 서비스 타입이 ClusterIP, NodePort, LoadBalancer인 경우헤 해당되며 \\ ExternalName인 경우는 무시\\ 이 항목을 설정하지 않은 경우, 외부에서 관리하는 엔드포인트를 가진 것으로 간주 | | [[sessionAffinity]] | 설정이 가능한 세션 어피니티는 ClientIP.\\ 생략 시 None으로 설정됨 | | clusterIP | 이 항목을 생락하면 대표 IP 주소가 자동으로 할당.\\ 그리고 None을 설정하면 헤드리스로 동작 | ## 서비스 파드 사양 ^ 항목 ^ 설명 ^ | port | 필수 항목. 이 서비스에 의해 공개되는 포트번호 | | name | port가 하나인 경우는 생략할 수 잇고 여러 개인 경우는 필수 설정 필요\\ 각 포트의 이름은 서비스 스펙 내에서 유일해야 함 | | protocol | 생략 시에는 TCP가 설정됨. TCP 혹은 UDP 설정 가능 | | nodePort | 생략 시에는 시스템이 자동으로 할당\\ type이 NodePort나 LoadBalancer인 경우 모든 노드에서 포트를 공개\\ 설정한 포트가 이미 사용 중인 경우에는 오브젝트 생성에 실패 | | targetPort | 생략 시에는 port와 동일한 값이 사용됨. selector에 의해 대응되는 파드가 공개하는 포트번호 또한 포트 이름을 설정함 | ### Deployment ## 디플로이먼트 apiVersion: apps/v1 kind: Deployment metadata: name: web-deploy spec: replicas: 3 selector: # deployment - pod 대응용 matchLabels: app: web template: # 여기서부터 파드 템플릿 metadata: labels: app: web # 파드의 라벨 spec: containers: - name: nginx image: nginx:latest ## 서비스 타입 개요 ^ 서비스 타입 ^ 접근 가능 범위 ^ | [[ClusterIP]] | 타입을 지정하지 않으면 기본으로 설정되며, 클러스터 내부의 파드에서 서비스의 이름으로 접근 할 수 있다 | | [[NodePort]] | ClusterIP의 접근 범위뿐만 아니라 k8s 클러스터 외부에서도 노드의 IP 주소와 포트번호로 접근 할 수 있다 | | [[LoadBalancer]] | NodePort 의 접근 범위 뿐만 아니라 k8s 클러스터 외부에서 대표 IP 주소로 접근 할 수 있다 | | [[ExternalName]] | k8s 클러스터 내의 파드에서 외부 IP 주소에 서비스의 이름으로 접근할 수 있다 | [[NodePort]]는 쉽고 편리하게 설정할 수 있지만 정식 서비스에 사용하는 것은 추천하지 않는다. ## Docs - [[kube-proxy]] - [[busybox]]