Kubernetes 헤드리스 서비스 Kubernetes에서 헤드리스 서비스 구축
8716 단어 containerskubernetes
몇 주 전 앱 중 하나를 개발하는 동안 로드 밸런싱 대신 모든 관련 포드와 통신해야 하는 문제가 발생했습니다. 백엔드에는 7개의 포드가 있으며 모두 동일한 이미지를 사용하지만 다른 위치에서 데이터베이스를 업데이트하기 위한 다른 비밀이 있습니다.
각 위치에 대한 서비스를 작성하고 반복적인 yaml 파일로 엄청난 오버헤드를 생성하는 대신 배포된 서비스를 headless service으로 변경하는 것이 가장 좋은 방법이었습니다.
헤드리스 서비스란 무엇입니까?
헤드리스 서비스는 서비스 IP가 있는 서비스이지만 로드 밸런싱 대신 연결된 Pod의 IP를 반환합니다. 이를 통해 프록시 대신 Pod와 직접 상호 작용할 수 있습니다.
None
에 대해 .spec.clusterIP
를 지정하는 것만 큼 간단하며 선택기를 사용하거나 사용하지 않고 활용할 수 있습니다. 곧 선택기가 있는 예제를 볼 수 있습니다.이 샘플 구성을 확인하십시오.
apiVersion: v1
kind: Service
metadata:
name: my-headless-service
spec:
clusterIP: None # <--
selector:
app: test-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
직접 확인하세요
5개의 팟(Pod)이 있는 배치를 작성하십시오.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
labels:
app: api
spec:
replicas: 5
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: eddiehale/hellonodeapi
ports:
- containerPort: 3000
정기 서비스 만들기
apiVersion: v1
kind: Service
metadata:
name: normal-service
spec:
selector:
app: api
ports:
- protocol: TCP
port: 80
targetPort: 3000
그리고 헤드리스 서비스
apiVersion: v1
kind: Service
metadata:
name: headless-service
spec:
clusterIP: None # <-- Don't forget!!
selector:
app: api
ports:
- protocol: TCP
port: 80
targetPort: 3000
yaml을 적용하고 모든 것이 올바르게 배포되었는지 확인합니다.
$ kubectl apply -f deployment.yaml
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/api-deployment-f457fbcf6-6j8f9 1/1 Running 0 5s
pod/api-deployment-f457fbcf6-9gvbp 1/1 Running 0 5s
pod/api-deployment-f457fbcf6-kqbds 1/1 Running 0 5s
pod/api-deployment-f457fbcf6-m76l9 1/1 Running 0 5s
pod/api-deployment-f457fbcf6-qzhxw 1/1 Running 0 5s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/headless-service ClusterIP None <none> 80/TCP 5s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45h
service/normal-service ClusterIP 10.109.192.226 <none> 80/TCP 5s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/api-deployment 5/5 5 5 5s
NAME DESIRED CURRENT READY AGE
replicaset.apps/api-deployment-f457fbcf6 5 5 5 5s
이제 모두 실행되었으므로 Pod를 배포하고 몇 가지 명령을 실행하여 테스트합니다.
$ kubectl run --generator=run-pod/v1 --rm utils -it --image eddiehale/utils bash
If you don't see a command prompt, try pressing enter.
root@utils:/#
각 서비스에서 실행
nslookup
하여 어떤 DNS 항목이 있는지 확인합니다. nslookup normal-service
하나의 DNS 항목과 IP가 반환되는 경우, 여기서 nslookup headless-service
는 서비스 DNS와 연결된 포드 IP 목록을 반환합니다.root@utils:/# nslookup normal-service
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: normal-service.default.svc.cluster.local
Address: 10.109.192.226
root@utils:/# nslookup headless-service
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: headless-service.default.svc.cluster.local
Address: 10.1.0.41
Name: headless-service.default.svc.cluster.local
Address: 10.1.0.39
Name: headless-service.default.svc.cluster.local
Address: 10.1.0.38
Name: headless-service.default.svc.cluster.local
Address: 10.1.0.40
Name: headless-service.default.svc.cluster.local
Address: 10.1.0.37
청소
utils 포드를 종료합니다.
root@utils:/# exit
exit
Session ended, resume using 'kubectl attach utils -c utils -i -t' command when
the pod is running
pod "utils" deleted
서비스 및 배포 삭제
$ kubectl delete svc headless-service normal-service && kubectl delete deployment api-deployment
service "headless-service" deleted
service "normal-service" deleted
deployment.extensions "api-deployment" deleted
헤드리스 서비스를 사용하면 로드 밸런서 또는 프록시 역할을 하는 서비스가 아니라 각 포드에 직접 연결할 수 있습니다. 이것은 많은 사용 사례를 가질 수 있으며 의견에서 귀하의 경험과 생각을 듣고 싶습니다!
Reference
이 문제에 관하여(Kubernetes 헤드리스 서비스 Kubernetes에서 헤드리스 서비스 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/eddiehale3/building-a-headless-service-in-kubernetes-3bk8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)