Конфигурационная опция Service registration
Необязательный блок конфигурации service_registration настраивает имеющийся в StarVault механизм регистрации сервисов. Блок конфигурации service_registration предназначен для случаев, когда планируется использование системы для обнаружения сервисов типа Kubernetes, но используете другую систему для бэкенда хранения.
Когда Consul настроен как бэкенд хранения, StarVault естественным образом использует Consul для регистрации сервисов, так что строка конфигурации service_registration не нужна.
Для случаев, когда хотите использовать другой бэкэнд хранения, например Raft, но при этом иметь возможность регистрации сервисов, можно использовать блок конфигурации service_registration:
service_registration "kubernetes" {
namespace = "my-namespace"
pod_name = "my-pod-name"
}
storage "raft" {
path = "/path/to/raft/data"
node_id = "raft_node_1"
}
1. Конфигурирование блока service_registration
Настройка регистрации сервисов осуществляется в конфигурационном файле StarVault с помощью блока service_registration:
service_registration [NAME] {
[PARAMETERS...]
}
service_registration "kubernetes" {
namespace = "my-namespace"
pod_name = "my-pod-name"
}
Для параметров конфигурации, которые также считывают переменную окружения, переменная окружения имеет приоритет над значениями в файле конфигурации.
2. Регистрация сервисов в Kubernetes
При регистрации сервисов в Kubernetes поды StarVault помечаются тегами, которые отражают их текущий статус и позволяют затем их использовать с селекторами. Регистрация сервисов возможна только тогда, когда StarVault работает в режиме высокой доступности.
2.1. Конфигурирование блока service_registration для регистрации сервисов в Kubernetes
service_registration "kubernetes" {}
Для успешной регистрации сервиса StarVault должен иметь возможность применять метки к подам в Kubernetes. Чтобы служебная учетная запись, ассоциированная с подами StarVault, могла обновлять спецификацию собственных подов, необходимы следующие правила управления доступом на основе ролей:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: starvault
name: starvault-discovery-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "update", "patch",”watch”,”list”]
2.2. Примеры включения регистрации сервисов в Kubernetes
После правильной настройки, включение регистрации сервисов приведет к тому, что поды Kubernetes получат следующие метки:
apiVersion: v1
kind: Pod
metadata:
name: starvault
labels:
starvault-active: "false"
starvault-initialized: "true"
starvault-perf-standby: "false"
starvault-sealed: "false"
starvault-version: 1.2.0
После выключения поды StarVault будут иметь следующие метки:
apiVersion: v1
kind: Pod
metadata:
name: starvault
labels:
starvault-active: "false"
starvault-initialized: "false"
starvault-perf-standby: "false"
starvault-sealed: "true"
starvault-version: 1.2.0
2.3. Описание меток подов
-
starvault-active(string: "true"/"false") – Метка "StarVault active" обновляется динамически при каждой смене статуса активности StarVault. Значение "True" указывает, что этот под Vault ведущий. Значение "False" указывает на то, что этот под StarVault резервный. -
starvault-initialized(string: "true"/"false") – Метка "StarVault initialized" обновляется динамически при каждой смене статуса инициализации StarVault. Значение "True" указывает на то, что Vault инициализирован. Значение "False" указывает на то, что StarVault не инициализирован. -
starvault-perf-standby(string: "true"/"false") – Метка "StarVault performance standby" обновляется динамически при каждой смене статуса StarVault "ведущий/резервный". Это поле имеет значение только в том случае, если под является членом резервного рабочего кластера. В противном случае ему будет присвоено значение "false". Значение "True" указывает на то, что данный под StarVault — резервный рабочий под. Значение "False" указывает на то, что под StarVault — ведущий рабочий под. -
starvault-sealed(string: "true"/"false") – Метка "StarVault sealed" обновляется динамически при каждой смене статуса StarVault "запечатан/распечатан". Значение "True" указывает на то, что StarVault запечатан. Значение "False" указывает на то, что StarVault распечатан. -
starvault-version(string: "1.2.0") – Метка "StarVault version" – это строка, которая не меняется на протяжении жизненного цикла пода.
2.4. Пример сервиса
Присвоив поду метки, можно создавать сервисы с помощью селекторов, чтобы фильтровать поды с определенными ролями StarVault HA, тем самым обеспечивая прямую связь с подмножествами подов StarVault.
Обратите внимание на строку: starvault-active: "true".
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/instance: starvault
app.kubernetes.io/name: starvault
helm.sh/chart: starvault-1.2.0
name: starvault-active
namespace: starvault
spec:
clusterIP: 10.7.254.51
ports:
- name: http
port: 8200
protocol: TCP
targetPort: 8200
- name: internal
port: 8201
protocol: TCP
targetPort: 8201
publishNotReadyAddresses: false
selector:
app.kubernetes.io/instance: starvault
app.kubernetes.io/name: starvault
component: server
starvault-active: "true"
type: ClusterIP
Кроме того, задав publishNotReadyAddresses: false, можно удалить отказавшие поды из пула сервиса.
После создания, сервис из примера можно использовать как выделенную конечную точка, которая всегда будет достигать активного узла. При настройке репликации StarVault ее можно использовать в качестве основного адреса:
$ starvault write -f sys/replication/performance/primary/enable \
primary_cluster_addr='https://starvault-active.starvault.svc.cluster.local:8201'
2.5. Примеры обновлений
Метки подов в сочетании со стратегией обновления OnDelete сильно облегчают процесс управления обновлениями:
$ helm upgrade starvault oci://hub.orionsoft.ru/public/starvault --set='server.image.tag=1.2.0' --reuse-values
$ kubectl delete pod --selector=starvault-active=false \
--selector=vault-version=1.2.0
$ kubectl delete pod --selector=starvault-active=true \
--selector=vault-version=1.2.0
При удалении экземпляра пода параметр Statefulset, определяющий желаемое состояние кластера, перепланирует удаленные поды, использовав для них последний образ.