Облачная платформаAdvanced

Headless Service

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Headless Services являются особым типом Kubernetes Service. Они не предоставляют cluster IP address или load balancing через Service IP address. Вместо этого, когда клиент использует DNS name headless Service для запроса, Kubernetes напрямую возвращает отдельные IP‑address pod‑ов, выбранных Service. Такая архитектура позволяет клиентам подключаться непосредственно к pod‑ам. Headless Services идеальны для некоторых приложений, таких как database clusters и cache clusters.

Headless Services are typically used in:

  • StatefulSets: В StatefulSets, таких как MySQL, Kafka и Elasticsearch, каждый pod имеет уникальные обязанности и не требует load balancing. headless Service предоставляет каждому pod собственную точку доступа.
  • Applications that need custom load balancing: Некоторые приложения должны управлять собственными политиками load balancing, а не полагаться на default load balancing policy Kubernetes.

Creating a Headless Service

  1. Use kubectl to access the cluster. For details, see Accessing a Cluster Using kubectl.
  2. Создайте StatefulSet и связанный безголовый Service.

    vi headless.yaml

    Содержимое файла:

    apiVersion: v1
    kind: Service # Set the resource object type to Service.
    metadata:
    name: nginx-headless
    labels:
    app: nginx
    spec:
    ports:
    - name: web # Name of the port for communications between pods
    port: 80 # Port number for communications between pods
    selector:
    app: nginx # Select the pod labeled with app:nginx.
    clusterIP: None # Set this parameter to None, indicating that a headless Service will be created.
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
    name: web
    spec:
    serviceName: nginx-headless # Name of the headless Service associated with the StatefulSet
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:alpine
    ports:
    - containerPort: 80
    name: web
    imagePullSecrets:
    - name: default-secret

  3. Создайте StatefulSet и безголовый Service.

    kubectl create -f headless.yaml

  4. Проверьте, созданы ли pod'ы.

    kubectl get pods -l app=nginx -o wide

    Отображается информация, аналогичная следующей:

    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    web-0 1/1 Running 0 41s 10.0.0.22 192.168.0.194 <none> <none>
    web-1 1/1 Running 0 38s 10.0.0.23 192.168.0.194 <none> <none>
    web-2 1/1 Running 0 37s 10.0.0.39 192.168.0.21 <none> <none>

  5. Проверьте, создан ли безголовый Service.

    kubectl get svc nginx-headless

    Отображается информация, аналогичная следующей:

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    nginx-headless ClusterIP None <none> 80/TCP 2m20s

  6. Создайте временный pod для получения DNS.

    kubectl run -it --rm --image=busybox:1.28 test-pod -- sh

    Команда для получения DNS выглядит следующим образом:

    nslookup nginx-headless

    Отображается информация, аналогичная следующей:

    Server: 10.247.3.10
    Address 1: 10.247.3.10 coredns.kube-system.svc.cluster.local
    Name: nginx-headless
    Address 1: 10.0.0.22 web-0.nginx-headless.default.svc.cluster.local
    Address 2: 10.0.0.23 web-1.nginx-headless.default.svc.cluster.local
    Address 3: 10.0.0.39 web-2.nginx-headless.default.svc.cluster.local

    Это указывает на то, что каждый pod StatefulSet имеет независимую запись DNS.

  7. Проверьте, доступ к этим pod'ам.

    wget -qO- web-0.nginx-headless