Kubernetes: 엔드포인트란?



일반적으로 Kubernetes 배포 뒤에 "숨겨진"ReplicaSets과 유사하게 내부에서 작업하기 때문에 Kubernetes Services를 사용할 때 Endpoints 개체를 볼 수 없습니다.

쿠버네티스 서비스



따라서 Service은 라벨을 사용하여 트래픽을 라우팅할 포드를 선택하는 Kubernetes 추상화입니다. Kubernetes: ClusterIP vs NodePort vs LoadBalancer, Services, and Ingress — an overview with examplesKubernetes: Service, load balancing, kube-proxy, and iptables을 참조하세요.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376


서비스의 selector , 위 예의 app=MyApp 와 일치하는 레이블이 있는 새 포드가 클러스터에 표시되자마자 서비스가 트래픽을 전송하기 시작합니다.

이는 이 포드의 IP 주소를 이 서비스의 엔드포인트 목록에 추가하여 달성됩니다.

간단한 예제를 만들어 보겠습니다.

--------
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
--------
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80


여기서는 NGINX로 포드를 만들고 기본 유형ClusterIP으로 서비스를 만듭니다.

매니페스트를 적용합니다.

$ kubectl apply -f svc-example.yaml
pod/nginx-pod created
service/nginx-svc created


서비스 확인:

$ kubectl get service nginx-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP 172.20.69.253 <none> 80/TCP 26s


쿠버네티스 엔드포인트



이제 자세히 살펴보겠습니다.

$ kubectl describe service nginx-svc
Name: nginx-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: ClusterIP
IP Families: <none>
IP: 172.20.69.253
IPs: <none>
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.21.56.143:80


결국 이 서비스의 엔드포인트, 즉 포드의 IP가 될 수 있습니다.

이 포드를 확인하십시오.

$ kubectl describe pod nginx-pod
Name: nginx-pod
Namespace: default
Priority: 0
Node: ip-10–21–49–33.us-east-2.compute.internal/10.21.49.33
Start Time: Sat, 13 Mar 2021 08:37:55 +0200
Labels: app=nginx
Annotations: kubernetes.io/psp: eks.privileged
Status: Running
IP: 10.21.56.143
…


다음은 위에서 언급한 IP입니다.

이제 전용 API 개체이며 서비스 및 포드와 동일한 방식으로 관찰할 수 있는 Ednpointd를 확인하겠습니다.

$ kubectl get endpoints nginx-svc
NAME ENDPOINTS AGE
nginx-svc 10.21.56.143:80 18m


매니페스트 파일에서 추가 개체로 설명하거나 배포를 생성하여 동일한 라벨을 가진 다른 포드를 추가하는 경우 해당 포드는 서비스의 엔드포인트로 추가됩니다.

--------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: nginx
        ports:
          - name: web
            containerPort: 80
            protocol: TCP
--------
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80


배포 만들기:

$ kubectl apply -f svc-example.yaml
deployment.apps/nginx-deploy created
service/nginx-svc unchanged


끝점을 확인합니다.

$ kubectl get endpoints nginx-svc
NAME ENDPOINTS AGE
nginx-svc 10.21.37.55:80,10.21.54.174:80,10.21.56.143:80 21m


여기에서 이전 포드의 10.21.56.143:80과 위 배포의 replicas에 지정된 포드의 두 개의 새 포드를 볼 수 있습니다.

--selector를 사용하여 해당 포드를 찾으십시오. 마찬가지로 서비스는 포드를 찾아 엔드포인트에 추가합니다.

$ kubectl get pod --selector=app=nginx -o wide
NAME READY STATUS RESTARTS AGE IP
nginx-deploy-7fcd954c94-gbm6d 1/1 Running 0 2m28s 10.21.54.174
nginx-deploy-7fcd954c94-mg8kr 1/1 Running 0 2m28s 10.21.37.55
nginx-pod 1/1 Running 0 23m 10.21.56.143


커스텀 엔드포인트



또한 원하는 리소스를 가리키는 사용자 지정 끝점을 만들 수도 있습니다.

예를 들어 새 서비스를 설명합니다.

kind: Service
apiVersion: v1
metadata:
  name: external-svc
spec:
  ports:
    - name: web
      protocol: TCP
      port: 80
      targetPort: 80


이 경우 selector 필드를 추가하지 않았다는 점에 유의하십시오.

그리고 Endpoints 개체를 설명합니다.

kind: Endpoints
apiVersion: v1
metadata:
  name: external-svc
subsets: 
  - addresses:
        - ip: 139.59.205.180
    ports:
      - port: 80
        name: web


여기:
  • name : 서비스와 동일해야 함
  • addresses : 트래픽을 보낼 주소, 이 예에서는 rtfm.co.ua이 떠나는 DigitalOcean 클라우드에 있는 서버의 IP 주소이지만 서비스가 다음과 같이 그들 사이에서 로드 밸런싱을 수행하도록 곱하기 주소를 설정할 수 있습니다. Kubernetes: Service, load balancing, kube-proxy, and iptables에 설명된
  • ports.portports.name도 해당 서비스
  • 와 동일해야 합니다.

    생성:

    $ kubectl apply -f external-endpoint.yaml
    service/external-svc created
    endpoints/external-svc created
    Check the Service and its Endpoints:
    kubectl describe svc external-svc
    Name: external-svc
    Namespace: default
    Labels: <none>
    Annotations: <none>
    Selector: <none>
    Type: ClusterIP
    IP Families: <none>
    IP: 172.20.45.77
    IPs: <none>
    Port: web 80/TCP
    TargetPort: 80/TCP
    Endpoints: 139.59.205.180:80
    


    포드를 실행하여 이 서비스가 작동하는지 확인합니다.

    $ kubectl run pod — rm -i — tty — image ubuntu — bash
    


    이 포드에 curl를 설치합니다.

    root@pod:/# apt update && apt -y install curl
    


    그리고 이름으로 서비스를 확인하십시오.

    root@pod:/# curl -Ls external-svc | grep \<title\>
    <title>RTFM: Linux, DevOps, and system administration</title>
    


    또는 해당 FQDN을 사용하여:

    root@pod:/# curl -Ls external-svc.default.svc.cluster.local | grep \<title\>
    <title>RTFM: Linux, DevOps, and system administration</title>
    


    외부 이름



    외부 리소스에 액세스하는 또 다른 솔루션은 externalName 유형의 서비스를 사용하는 것입니다.

    --------
    apiVersion: v1
    kind: Service
    metadata:
      name: rtfm-service
    spec:
      ports:
        - port: 80
      type: ExternalName
      externalName: rtfm.co.ua
    


    적용 및 확인:

    $ root@pod:/# curl -Ls rtfm-service | grep \<title\>
    <title>RTFM: Linux, DevOps, and system administration</title>
    


    완료.

    RTFM: Linux, DevOps и системное администрирование에 원래 게시되었습니다.

    좋은 웹페이지 즐겨찾기