Kubernetes 헤드리스 서비스 Kubernetes에서 헤드리스 서비스 구축

8716 단어 containerskubernetes
안녕하세요! 이것은 dev.to에 대한 나의 첫 번째 게시물이며 이 훌륭한 커뮤니티의 일부가 된 것을 기쁘게 생각합니다.

몇 주 전 앱 중 하나를 개발하는 동안 로드 밸런싱 대신 모든 관련 포드와 통신해야 하는 문제가 발생했습니다. 백엔드에는 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


헤드리스 서비스를 사용하면 로드 밸런서 또는 프록시 역할을 하는 서비스가 아니라 각 포드에 직접 연결할 수 있습니다. 이것은 많은 사용 사례를 가질 수 있으며 의견에서 귀하의 경험과 생각을 듣고 싶습니다!

좋은 웹페이지 즐겨찾기