안녕하세요~ BTC Hallo팀입니다. 이번시간에는 GKE 활용과 관련해서 쿠버네티스 서비스에 대해서 알아보겠습니다.
쿠버네티스 서비스는 동적으로 변하는 IP를 가지는 Pod들에 고정된 방법으로 접근하고, 동일한 서비스를 제공하는 Pod 그룹에 접근하는 단일 진입점을 생성하는 리소스이다. 각 서비스에는 서비스가 존재하는 동안 변하지 않는 IP와 port가 있다. 클라이언트는 해당 IP:port에 연결할 수 있고, 이 연결은 서비스를 제공하는 Pod 중 하나로 라우팅된다.
서비스 타입
ClusterIP
동일한 서비스를 지원하는 Pod는 하나 이상 존재할 수 있다. 이때 ClusterIP를 통해 백엔드의 동일한 서비스를 제공하는 Pod들로 로드밸런싱이 가능하다. Selector의 Label이 동일한 Pod를 그룹으로 묶고, 같은 서비스를 제공하는 Pod 그룹에 단일 진입점(Virtual IP)을 제공한다. 동일한 그룹으로 묶인 각 Pod들의 Endpoint의 묶음인 것이다. 이러한 ClusterIP는 클러스터 내부에서만 사용가능하다.
다음과 같이 명령어로 실행 가능하다.
kubectl expose deployment testserver --type=ClusterIP --port=8080
다음은 ClusterIP yaml 파일의 예시이다.
- type은 생략 가능하다.
- IP를 직접 할당하는 것도 가능하다. IP할당 생략 시 10.96.0.0/12 범위 내에서 랜덤한 IP가 생성된다.
- sessionAffinity 값을 기본값인 None 대신 ClinetIP로 설정함으로써 세션유지도 가능하다.
apiVersion: v1
kind: Service
metadata:
name: test-svc
spec:
type: ClusterIP
clusterIP: 10.100.100.100
sessionAffinity: ClientIP
selector:
app: test
ports:
- port: 80
targetPort: 8080
NodePort
모든 포트를 대상으로 외부에서 접속이 가능한 포트를 예약하고 열어주는 서비스이다. NodePort를 사용하면 ClusterIP가 생성되고, NodePort도 예약된다. 이를 통해 외부 클라이언트에 Pod set을 노출할 수 있다. 디폴트 NodePort 범위는 30000~32767이다.
다음은 NodePort yaml 파일의 예시이다.
apiVersion: v1
kind: Service
metadata:
name: test-svc-nodeport
spec:
selector:
app: test
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30100
LoadBalancer
Public 클라우드에서 설정 가능한 방식으로, 외부IP를 가지는 로드밸런서를 자동으로 구성하여 할당한다. 그리고 NodePort를 예약 후 해당 포트로 클러스터 외부에서 접속이 가능하다.
다음은 LoadBalancer yaml 파일의 예시이다.
apiVersion: v1
kind: Service
metadata:
name: test-svc-lb
spec:
type: LoadBalancer
selector:
app: test
ports:
- port: 80
targetPort: 8080
ExternalIP
하나 이상의 클러스터 노드로 라우팅 되는 외부IP가 존재하는 경우에 쿠버네티스 서비스를 ExternalIP로 노출시킬 수 있다. 다음은 ExternalIP yaml 파일의 예시이다.
apiVersion: v1
kind: Service
metadata:
name: test-svc-externalip
spec:
selector:
app: test
ports:
- port: 80
targetPort: 8080
externalIPs:
- 10.0.0.1
ExternalName
쿠버네티스 클러스터 내의 Pod들은 ClusterIP를 가지고 있으므로, ClusterIP 대역 밖의 서비스를 호출하는 경우, 복잡한 설정이 필요하다. ExternalName을 통해 복잡한 설정 없이 간단하게 외부 서비스를 클러스터 내부로 호출하는 것이 가능하다. 특히, Public 클라우드를 사용 중 쿠버네티스 클러스터 밖에 존재하는 다른 관리형 서비스를 호출하는 경우에 ExternalName을 통해 간편하게 설정 가능하다.
다음은 ExternalName yaml 파일의 예시이다.
apiVersion: v1
kind: Service
metadata:
name: svc-externalname
spec:
type: ExternalName
externalName: example.com
서비스 생성 흐름
1. Endpoint Controller는 서비스와 Pod를 감시하며 조건에 맞는 Pod의 IP를 수집한다.
2. 수집한 IP를 통해 Endpoint를 생성한다.
3. Kube-Proxy가 Endpoint의 변화를 감시하고, 노드의 iptables를 설정한다.
4. CoreDNS는 서비스를 감시하고, 서비스의 이름과 IP를 CoreDNS에 추가한다.
iptables는 커널 레벨의 네트워크 도구로, iptables 설정으로 여러 IP에 트래픽을 전달한다.
CoreDNS는 클러스터 내부용 DNS로, 이를 통해 IP대신 도메인네임을 사용한다.
감사합니다.
References
https://arisu1000.tistory.com/27838
https://subicura.com/k8s/guide/service.html#service-%E1%84%89%E1%85%A2%E1%86%BC%E1%84%89%E1%85%A5%E1%86%BC-%E1%84%92%E1%85%B3%E1%84%85%E1%85%B3%E1%86%B7
https://bcho.tistory.com/1262
https://www.docker.com/blog/designing-your-first-app-kubernetes-overview/kubernetes-clusterip-service-2/
'CSP (Cloud Service Provider) > GCP' 카테고리의 다른 글
Cloud Run (0) | 2022.11.02 |
---|---|
Secret Manager (0) | 2022.11.01 |
[Google Cloud Platform] GCP 고객 사례 (0) | 2022.10.31 |
Google Cloud Armor (2) (0) | 2022.10.26 |
[GCP]BigQuery Slot의 종류 및 사용방법 (0) | 2022.10.25 |
댓글