Экспериментальная версия. Функциональность может сильно измениться. Совместимость с будущими версиями не гарантируется.

Размещение двух независимых балансировщиков на одной виртуальной машине

На виртуальной машине с операционной системой Linux работают два приложения — HTTP-сервер (TCP 8080) и SMTP-сервер (TCP 2525). Необходимо настроить два отдельных балансировщика для этих сервисов — веб-балансировщик и SMTP-балансировщик.

Создание виртуальной машины

Создайте виртуальную машину my-vm основываясь на примерах из документации DVP.

В примере манифеста ниже добавлен лейбл vm: my-vm для дальнейшей идентификации в балансировщиках.

1apiVersion: virtualization.deckhouse.io/v1alpha2
2kind: VirtualMachine
3metadata:
4  name: my-vm
5  namespace: my-ns
6  labels:
7    vm: my-vm
8spec:
9  virtualMachineClassName: host
10  cpu:
11    cores: 1
12  memory:
13    size: 1Gi
14  provisioning:
15    type: UserData
16    userData: |
17      #cloud-config
18      ssh_pwauth: True
19      users:
20      - name: cloud
21        passwd: '$6$rounds=4096$saltsalt$fPmUsbjAuA7mnQNTajQM6ClhesyG0.yyQhvahas02ejfMAq1ykBo1RquzS0R6GgdIDlvS.kbUwDablGZKZcTP/'
22        shell: /bin/bash
23        sudo: ALL=(ALL) NOPASSWD:ALL
24        lock_passwd: False      
25  blockDeviceRefs:
26    - kind: VirtualDisk
27      name: linux-disk

Манифесты балансировщиков для веб-сервиса и SMTP

Пример манифеста веб-балансировщика:

1apiVersion: network.deckhouse.io/v1alpha1
2kind: ServiceWithHealthchecks
3metadata:
4  name: web
5  namespace: my-ns
6spec:
7  ports:
8  - port: 80
9    protocol: TCP
10    targetPort: 8080
11  selector:
12    vm: my-vm
13  healthcheck:
14    probes:
15    - mode: HTTP
16      http:
17        targetPort: 8080
18        method: GET
19        path: /healthz

Пример манифеста SMTP-балансировщика:

1apiVersion: network.deckhouse.io/v1alpha1
2kind: ServiceWithHealthchecks
3metadata:
4  name: smtp
5  namespace: my-ns
6spec:
7  ports:
8  - port: 25
9    protocol: TCP
10    targetPort: 2525
11  selector:
12    vm: my-vm
13  healthcheck:
14    probes:
15    - mode: TCP
16      tcp:
17        targetPort: 2525

Балансировщики для работы с PostgreSQL-кластером

Создание StatefulSet для PostgreSQL

Для корректной работы StatefulSet потребуется создать стандартный сервис (Service) для формирования DNS-имени отдельных подов. Этот сервис не будет использоваться для прямого доступа к базе данных.

1apiVersion: v1
2kind: Service
3metadata:
4  name: postgres
5spec:
6  selector:
7    app: postgres
8  ports:
9    - protocol: TCP
10      port: 5432
11      targetPort: 5432

Пример манифеста StatefulSet:

1apiVersion: apps/v1
2kind: StatefulSet
3metadata:
4  name: postgres
5  name: my-ns
6spec:
7  serviceName: postgres
8  replicas: 3
9  selector:
10    matchLabels:
11      app: postgres
12  template:
13    metadata:
14      labels:
15        app: postgres
16    spec:
17      containers:
18        - name: postgres
19          image: postgres:13
20          ports:
21            - containerPort: 5432
22          env:
23            - name: POSTGRES_USER
24              value: postgres
25            - name: POSTGRES_PASSWORD
26              value: example

Конфигурация балансировщиков ServiceWithHealthchecks

Создайте Secret для хранения учетных данных для доступа проб к базе данных:

1kubectl -n my-ns create secret generic cred-secret --from-literal=user=postgres --from-literal=password=example cred-secret

Пример манифеста балансировщика для чтения:

1apiVersion: network.deckhouse.io/v1alpha1
2kind: ServiceWithHealthchecks
3metadata:
4  name: postgres-read
5spec:
6  ports:
7  - port: 5432
8    protocol: TCP
9    targetPort: 5432
10  selector:
11    app: postgres
12  healthcheck:
13    probes:
14    - mode: PostgreSQL
15      postgreSQL:
16        targetPort: 5432
17        dbName: postgres
18        authSecretName: cred-secret
19        query: "SELECT 1"

Пример манифеста балансировщика для записи:

1apiVersion: network.deckhouse.io/v1alpha1
2kind: ServiceWithHealthchecks
3metadata:
4  name: postgres-write
5spec:
6  ports:
7  - port: 5432
8    protocol: TCP
9    targetPort: 5432
10  selector:
11    app: postgres
12  healthcheck:
13    probes:
14    - mode: PostgreSQL
15      postgreSQL:
16        targetPort: 5432
17        dbName: postgres
18        authSecretName: cred-secret
19        query: "SELECT NOT pg_is_in_recovery()"