В Kubernetes, как выбрать модуль по имени в сервисном селекторе? - PullRequest
1 голос
/ 31 января 2020

Я хочу увеличить указанное c количество модулей, которые являются независимыми и не сбалансированы по нагрузке. (Цель состоит в том, чтобы использовать их для отправки и получения определенного трафика c в и из какой-либо внешней конечной точки.) Я планирую сделать это, явно создавая модули (фрагмент yaml, как показано ниже)

    apiVersion: v1
    kind: Pod
    metadata:
      name: generator-agent-pod-1
      labels:
        app: generator-agent
        version: v1
    spec:
      containers:
        ...

(В этом случае имя будет автоматически сгенерировано как generator-agent-pod-1, generator-agent-pod-2, et c.)

Затем я собираюсь создать один сервис для каждого модуля: так что, по сути, будет generator-agent-service-1, generator-agent-service-2, et c., И, таким образом, я могу использовать службу, чтобы получить доступ к модулю снаружи.

Теперь у меня два вопроса: 1. Как выбрать службу? конкретный c модуль по имени (а не по меткам)? что-то эквивалентное:

apiVersion: v1
kind: Service
metadata:
  name: generator-agent-service-1
  labels:
    app: agent-service
spec:
  type: NodePort
  ports:
  - port: 8085
    protocol: TCP
  selector:
    metadata.name: generator-agent-pod-1

(Эта служба не получает никаких конечных точек, поэтому, я полагаю, неправильный селектор.)

Есть ли лучший способ решения этой проблемы (Кубернетес или иным образом)?

Спасибо!

1 Ответ

2 голосов
/ 31 января 2020

Существует также опция для определения службы без селектора pod. а затем вручную сопоставить Службу с сетевым адресом и портом, где она работает, добавив объект конечной точки вручную.

Пример для справки:

Создано два модуля типа nginx

$ kubectl get all -o wide
NAME            READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
pod/nginx-one   1/1     Running   0          4m56s   192.168.58.199   k8s-node02   <none>           <none>
pod/nginx-two   1/1     Running   0          4m50s   192.168.85.193   k8s-node01   <none>           <none>

NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/kubernetes          ClusterIP   10.96.0.1       <none>        443/TCP   29m     <none>

Создайте два сервиса, используя ниже yamls, обратите внимание, что поле выбора Pod не используется в yaml ниже

service1.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-one-service
spec:
  ports:
    - protocol: TCP
      port: 80

service2.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-two-service
spec:
  ports:
    - protocol: TCP
      port: 80


$ kubectl get svc
NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes          ClusterIP   10.96.0.1       <none>        443/TCP   32m
nginx-one-service   ClusterIP   10.102.230.78   <none>        80/TCP    7m16s
nginx-two-service   ClusterIP   10.98.86.67     <none>        80/TCP    6m56s

Опишите службу и конечная точка не сопоставлена, поскольку мы не указали селектор .

ubuntu@k8s-master:~$ kubectl describe service nginx-one-service
Name:              nginx-one-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.102.230.78
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

ubuntu@k8s-master:~$ kubectl describe service nginx-two-service
Name:              nginx-two-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.98.86.67
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

Теперь вы можете выбрать отображение конечной точки вручную, используя следующие значения:

endpoint1.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: nginx-one-service
subsets:
  - addresses:
      - ip: 192.168.85.193
    ports:
      - port: 80

endpoint2.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: nginx-two-service
subsets:
  - addresses:
      - ip: 192.168.85.193
    ports:
      - port: 80

Теперь получите конечная точка при создании

$ kubectl get endpoints
NAME                ENDPOINTS             AGE
kubernetes          131.160.188.46:6443   35m
nginx-one-service   192.168.58.199:80     5m30s
nginx-two-service   192.168.85.193:80     4m59s

и список серверов ie, и конечная точка должна быть отображена, как показано ниже

ubuntu@k8s-master:~$ kubectl describe service nginx-one-service
Name:              nginx-one-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.102.230.78
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         192.168.58.199:80
Session Affinity:  None
Events:            <none>

ubuntu@k8s-master:~$ kubectl describe service nginx-two-service
Name:              nginx-two-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.98.86.67
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         192.168.85.193:80
Session Affinity:  None
Events:            <none>
...