😎
쿠버네티스
는 컨테이너화된 애플리케이션을 대규모로 관리하고 배포하는 오픈소스 플랫폼입니다. 이 플랫폼에서,서비스
는 파드 간의 통신을 가능하게 하는 핵심 컴포넌트 중 하나입니다.
🤓
쿠버네티스 서비스
는 특정 파드 그룹에 대한 네트워크 트래픽을 라우팅하는 추상화 된 객체입니다. 예를 들어서 3개의 pod를 띄웠다고 가정하겠습니다. 이 경우 3개의 pod는 각자 ip를 가지게 됩니다. 그런데 만약 pod의 개수를 늘리고 줄일 경우에는 해당 pod들의 ip가 변경되게 되는데 파드는 비영구적인 리소스이기 때문입니다.서비스를 사용할 경우 서비스 ip를 통해서 pod들의 ip에 상관없이 접속하는 것이 가능하게 됩니다.(서비스는 ip를 직접 커스텀할 수 있기에 고유한 ip를 가진다고 볼 수 있습니다.)
apiVersion: v1
kind: Service
metadata:
name: test-cluster
labels:
app: new-cluster
spec:
type: ClusterIP
clusterIP: 10.0.0.100
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
😓위 yaml 파일에서
spec.type
을 통해 서비스의 유형을 선택할 수 있으며selector
를 통해 pod들을 선택할 수 있습니다.
clusterIP: 10.0.0.100
를 통해 직접 ip를 설정할 수 있습니다.(vpc로 이해하시면 됩니다.)
위 파일은ClusterIp type
으로 생성하였으며label
이 app:my-app 을 가진pod
를 대상으로 합니다.
port의 경우 protocol은 tcp를 사용하며 이 때 서비스의 80포트로 요청하면 해당pod
의 8080포트로 요청을 하게 됩니다.
ClusterIP 서비스
는클러스터
내에서만 사용가능한 서비스입니다.(외부 접속 안됨)
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080 # 원하는 포트 번호로 설정 (30000-32767 범위 내)
🤨
클러스터
의 각 노드의 특정 포트에서비스
를 노출시키며, 외부에서 해당 포트를 통해 서비스에 접근할 수 있습니다.
clusterIp
의 특징과 함께 각 노드별로 위에서 설정한nodePort: 30080
를 open하게 됩니다.
그래서 만약 공인 ip가 있다면 공인ip:30080에서도 접속이 가능하게 됩니다.(같은 vpc라면 내부 ip로도 가능)
이때nodePort
는 30000-32767범위에서 선택이 가능합니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
😑바로 사용할 수 있는 것은 아니며
gcp
나aws
등에서 지원하는로드밸런서
를 이용해야 사용이 가능합니다.(gke
,eks
등등)
로드밸런서
를 생성한 후에 해당 ip를 위 yaml파일에 등록하시면 됩니다.
apiVersion: v1
kind: Service
metadata:
name: go
spec:
type: ExternalName
externalName: google.com
🤗도메인이름으로 연결하는 서비스입니다.
spec.externalName
은 연결하려는 외부 도메인을 의미합니다.
이후pod
를 하나 생성하고 들어간 다음curl go.default.svc.cluster.local
을 실행하면 구글로 요청하는 것을 확인 할 수 있습니다.
go.default.svc.cluster.local
- go: 이것은 서비스의 이름입니다. 이 경우, externalname1이라는 이름의 서비스를 나타냅니다.
- default: 네임스페이스를 의미합니다.
- svc:
service
의 줄임말입니다.- cluster.local: 클러스터 내부에서만 접근 가능한 기본 도메인 이름을 나타냅니다.
위와 같은 규칙을 가지는 Domain Name을 FQDN라고 합니다.
이 때 같은
네임스페이스
인 경우curl go
로도 요청이 가능합니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
clusterIP: None
selector:
app: hello
ports:
- protocol: TCP
port: 80
targetPort: 80
🤔type을
ClusterIp
로 지정하고 명시적으로clusterIP: None
을 지정할 경우HeadlessService
가 됩니다.
기존clusterIp service
와는 달리 생성후에도 ip가 지정이 되지 않는데 이 때selector
를 통해 해당 파드들을 선택하게 됩니다.
이 후 위ExternalName
에서 알아본FQDN
형태의 도메인 네임으로 요청을 하면 됩니다.
curl my-service.default.svc.cluster.local
🥳서비스를 통해 pod의 상관없이 요청을 할 수 있다는 점이 흥미로웠습니다. 이를 이용한다면 보다 더 안정적인 서비스를 운영 할 수 있을 것 같네요.