Перейти к основному содержимому
Kubernetes

Две или более реплик за сервисом ClusterIP, доступных только вашему бэкенду.

Markdown

Требования​

  • Кластер Kubernetes и доступ к нему через kubectl.
  • База данных PostgreSQL, выделенная для Human Plugin и доступная из кластера. См. Требования и доступ.
  • Учётные данные реестра и ключ доступа от Unico.

Всё описанное ниже размещается в отдельном пространстве имён:

kubectl create namespace human-plugin

1. Pull-секрет реестра​

kubectl -n human-plugin create secret docker-registry unico-registry \
--docker-server=pkg.unico.run \
--docker-username="<username>" \
--docker-password="<token>"

2. Secret с настройками​

kubectl -n human-plugin create secret generic human-plugin \
--from-literal=HUMAN_API_ACCESS_KEY='<your access key>' \
--from-literal=POSTGRES_ADDRESS_HOST='<database host>' \
--from-literal=POSTGRES_USER='human_plugin' \
--from-literal=POSTGRES_PASSWORD='<database password>'

Добавляйте POSTGRES_ADDRESS_PORT, POSTGRES_DATABASE или POSTGRES_SSL_MODE только если ваша база данных отличается от значений по умолчанию из раздела Конфигурация. Если вы управляете секретами другим инструментом (External Secrets, Sealed Secrets, хранилище секретов), создайте те же ключи с его помощью. Никогда не добавляйте в систему контроля версий манифест Secret со значениями.

3. Deployment и Service​

human-plugin.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: human-plugin
namespace: human-plugin
spec:
replicas: 2
selector:
matchLabels: { app: human-plugin }
template:
metadata:
labels: { app: human-plugin }
spec:
terminationGracePeriodSeconds: 60
imagePullSecrets:
- name: unico-registry
containers:
- name: human-plugin
image: pkg.unico.run/human-plugin-api:latest
imagePullPolicy: Always
ports:
- { name: http, containerPort: 8080 }
envFrom:
- secretRef: { name: human-plugin }
resources:
requests: { cpu: "1", memory: 1Gi }
limits: { cpu: "1", memory: 1Gi }
readinessProbe:
httpGet: { path: /health/ready, port: http }
timeoutSeconds: 5
livenessProbe:
httpGet: { path: /health/live, port: http }
periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: human-plugin
namespace: human-plugin
spec:
selector: { app: human-plugin }
ports:
- { name: http, port: 8080, targetPort: http }
kubectl apply -f human-plugin.yaml
kubectl -n human-plugin rollout status deployment/human-plugin
  • replicas: 2: реплики используют одну базу данных, поэтому можно запускать столько, сколько нужно. Две реплики сохраняют доступность Human Plugin, пока одна перезапускается.
  • terminationGracePeriodSeconds: 60: при остановке Human Plugin ждёт до 55 секунд завершения обрабатываемых запросов. Значение Kubernetes по умолчанию, 30 секунд, может прервать создание процесса.
  • imagePullPolicy: Always: с тегом latest каждый новый Pod загружает самый свежий релиз.
  • Пробы: readiness не пускает трафик на реплику, пока её база данных не ответит, а timeoutSeconds: 5 заставляет пробу завершиться ошибкой, когда база данных перестаёт отвечать. См. Работоспособность и мониторинг.
  • Ресурсы: значения выше являются минимумом для каждой реплики. См. Требования к оборудованию.

4. Ограничьте доступ​

Ваш бэкенд обращается к Human Plugin по адресу http://human-plugin.human-plugin.svc:8080. У Human Plugin нет собственной аутентификации, поэтому:

  • не открывайте Service через Ingress, LoadBalancer или NodePort;
  • разрешите доступ только из пространства имён вашего бэкенда с помощью NetworkPolicy.
network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: human-plugin-allow-backend
namespace: human-plugin
spec:
podSelector:
matchLabels: { app: human-plugin }
policyTypes: [Ingress]
ingress:
- from:
- namespaceSelector:
matchLabels: { kubernetes.io/metadata.name: <your back-end namespace> }
ports:
- { port: 8080 }

Самому Human Plugin нужен исходящий HTTPS к Unico и доступ к вашей базе данных. См. Сеть и безопасность.

5. Проверьте​

kubectl -n human-plugin port-forward svc/human-plugin 8080:8080

В другом терминале проверьте готовность и выполните запрос на создание из Быстрого старта к http://127.0.0.1:8080:

curl --fail http://127.0.0.1:8080/health/ready

Логи​

kubectl -n human-plugin logs deploy/human-plugin --since=10m

Обновление​

kubectl -n human-plugin rollout restart deployment/human-plugin

Новые Pod'ы загружают последний образ и по одному заменяют старые, как только становятся готовыми. См. Эксплуатация.