Hazelcast любит Kubernetes. Благодаря выделенному плагин Hazelcast Kubernetes , вы можете использовать динамическое автоматическое обнаружение . Hazelcast в Kubernetes также может работать в нескольких топологиях : встроенная , клиент-серверная или в качестве дополнительной машины . Более того, благодаря диспетчеру пакетов Helm и специальной таблице Hazelcast Helm вы можете развернуть полнофункциональный сервер Hazelcast за считанные минуты. Я уже описывал это в сообщении в блоге Hazelcast Helm Chart , в котором описывался сценарий, когда клиент и сервер были развернуты в одном кластере Kubernetes.
В этой записи блога давайте сосредоточимся на более сложном сценарии, в котором вы хотите настроить свой собственный Hazelcast в кластере Kubernetes, а затем использовать его с клиентом, расположенным вне этого кластера .
Вам также может понравиться: Hazelcast с весенней загрузкой на Kubernetes
Клиент может находиться где угодно — на вашем ноутбуке, в другом кластере Kubernetes или на любом другом сервере. Это не важно Важно то, что это не тот же кластер Kubernetes. Как вы можете себе представить, развертывание кластера Hazelcast является простой частью, но соединение с клиентом может быть немного сложным. Давайте разберем его на два подхода, которые вы можете использовать: Unisocket Client и Smart Client .
Unisocket Client
Простейший возможный сценарий — развернуть кластер Hazelcast в Kubernetes и открыть все модули Hazelcast с одной LoadBalancer
(или NodePort
) службой . При таком подходе мы используем стандартный механизм Kubernetes, который автоматически распределяет нагрузку на трафик участников Hazelcast.
Решение простое, потому что оно очень хорошо вписывается в мир Kubernetes. Вы можете использовать этот метод, выполнив три простых шага:
Шаг 1. Создание кластера Hazelcast с помощью службы LoadBalancer
Вы можете запустить кластер Hazelcast с помощью следующей команды.
YAML
xxxxxxxxxx
1
helm install hazelcast \
2
--set service.type=LoadBalancer,service.clusterIP="" \
3
hazelcast/hazelcast
Эта команда запускает кластер Hazelcast в Kubernetes и предоставляет его LoadBalancer
службе. Обратите внимание, что если у вас не настроен внешний балансировщик нагрузки для кластера Kubernetes (например, локальный запуск Minikube или Docker Desktop), вы можете использовать его NodePort
в качестве типа службы.
Шаг 2: Проверьте публичный IP
Теперь нам нужно проверить IP-адрес LoadBalancer
службы (или IP-адрес узла Kubernetes и порт NodePort
службы).
YAML
xxxxxxxxxx
1
$ kubectl get service hazelcast
2
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3
hazelcast LoadBalancer 10.208.12.138 34.70.99.143 5701:32068/TCP 84s
Наш общественный IP — адрес 34.70.99.143
. Это все, что мы должны были сделать со стороны Kubernetes. У нас уже есть локальный кластер Hazelcast, работающий в Kubernetes, и мы знаем, как получить к нему доступ!
Шаг 3: Настройте клиент Hazelcast
Пришло время настроить клиент Hazelcast. Как упоминалось ранее, клиентское приложение можно запустить где угодно, поскольку оно будет использовать общедоступный IP-адрес для подключения к серверу. Мы можем обновить hazelcast-client.yaml
файл со следующим содержанием.
YAML
xxxxxxxxxx
1
hazelcast-client
2
network
3
cluster-members
4
34.70.99.143
5
smart-routingfalse
Кроме того, вы можете настроить клиент Hazelcast с помощью XML или встроить конфигурацию в ваш исходный код.
При запуске приложения вы должны увидеть, что оно успешно подключено к вашему кластеру Hazelcast.
YAML
xxxxxxxxxx
1
...
2
Members 3
4
Member 10.16.2.6 :5701 - 0af4bcce-af77-4b0a-a225-7dc02eebd06b
5
Member 10.16.0.3 :5701 - 3f3951e0-1e56-4113-beba-f3fd25fbdd59
6
Member 10.16.2.8 :5701 - a466b040-681a-4b52-bdaa-0ebd3e3e458d
7
8
...
Умный клиент
Unisocket очень прост в настройке; однако у него есть один существенный недостаток - низкая производительность . Использование балансировщика нагрузки идеально подходит для распределения трафика между службами без сохранения состояния; Тем не менее, Hazelcast не является лицом без гражданства . Hazelcast больше похож на изолированную базу данных, в которой каждый член содержит свою часть данных.
Вот почему оптимальным является случайное распределение нагрузки для трафика . Это фактически означает, что каждая операция должна быть внутренне перенесена, потому что ваши данные могут быть сбалансированы по нагрузке для элемента 1, а раздел для его ключа хранится в элементе 2. В общем, если производительность важна для вашего варианта использования, то вы нужно использовать умные клиенты .
Интеллектуальный клиент Hazelcast сохраняет сопоставление от ключа к члену, что означает, что он отправляет данные непосредственно участнику, который содержит правильный раздел данных . Этот факт подразумевает, что в среде Kubernetes нам необходимо обеспечить доступ к каждому модулю Hazelcast извне. Есть несколько методов для достижения этой цели.
Одним из способов было бы использовать hostPort
и затем обращаться к модулям по их узлам Kubernetes. Более динамичный подход состоит в том, чтобы предоставить каждому пакету отдельный сервис . Опять же, услуга может быть либо LoadBalancer
или NodePort
. В реальном сценарии это возможно NodePort
, поскольку наличие отдельного общедоступного IP-адреса для каждого модуля является дорогостоящим.
Kubernetes не предлагает функцию автоматического создания службы для каждого модуля. Вы можете написать свой собственный код, но еще лучше повторно использовать проект под названием Metacontroller, который обеспечивает такую функциональность. Затем вы можете использовать плагин Hazelcast Kubernetes для динамического обнаружения общедоступных адресов модулей Hazelcast. Давайте посмотрим, как это работает на практике, и выполним несколько простых шагов.
Шаг 0: Загрузите пример кода
Полное описание и исходный код того, как настроить внешний интеллектуальный клиент Hazelcast, можно найти в соответствующем примере кода . Если вы хотите следовать ему, клонируйте репозиторий и откройте external-client
каталог.
YAML
xxxxxxxxxx
1
git clone https://github.com/hazelcast/hazelcast-code-samples.git
2
cd hazelcast-code-samples/hazelcast-integration/kubernetes/samples/external-client
Шаг 1: Настройте кластер Hazelcast с каждым открытым стручком
В качестве первого шага вам нужно запустить кластер Hazelcast таким образом, чтобы каждый участник имел отдельный публичный IP / порт. Самый простой способ добиться этого - использовать плагин Metacontroller с Service-Per-Pod DecoratorController.
1.1. Установите плагин для метаконтроллера
Чтобы установить плагин Metacontroller , просто выполните следующие команды.
YAML
xxxxxxxxxx
1
# Create metacontroller namespace.
2
kubectl create namespace metacontroller
3
# Create metacontroller service account and role/binding.
4
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/metacontroller/master/manifests/metacontroller-rbac.yaml
5
# Create CRDs for Metacontroller APIs, and the Metacontroller StatefulSet.
6
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/metacontroller/master/manifests/metacontroller.yaml
Если у вас возникли проблемы при создании Metacontroller, это может означать, что у вас нет ClusterRole
доступа к вашему кластеру. Пожалуйста, проверьте это для деталей.
1.2. Установить Service-Per-Pod DecoratorController
Чтобы установить Service-Per-Pod DecoratorController, вам необходимо выполнить следующие команды.
YAML
xxxxxxxxxx
1
kubectl create configmap service-per-pod-hooks -n metacontroller --from-file=hooks
2
kubectl apply -f service-per-pod.yaml
Этот DecoratorController автоматически создает сервис для каждого модуля, отмеченного следующими аннотациями:
YAML
xxxxxxxxxx
1
annotations
2
service-per-pod-label"statefulset.kubernetes.io/pod-name"
3
service-per-pod-ports"5701:5701"
1.3. Настройте учетную запись службы
Hazelcast использует API Kubernetes для обнаружения членов, поэтому требует предоставления разрешений для определенных ресурсов. Чтобы создать учетную запись службы с минимальным количеством ролей, выполните следующую команду.
YAML
xxxxxxxxxx
1
kubectl apply -f rbac.yaml
Сервисная учетная запись hazelcast-service-account
была создана, и вы можете использовать ее на всех последующих этапах.
1.4. Установить кластер Hazelcast
Чтобы установить кластер Hazelcast, необходимо включить Service-Per-Pod
аннотации в конфигурацию Hazelcast StatefulSet (или Deployment). Затем разверните кластер Hazelcast в своей среде Kubernetes.
YAML
xxxxxxxxxx
1
kubectl apply -f hazelcast-cluster.yaml
Вы можете проверить, что для каждого модуля участника Hazelcast была создана служба.
YAML
xxxxxxxxxx
1
$ kubectl get all
2
NAME READY STATUS RESTARTS AGE
3
pod/hazelcast-0 1/1 Running 0 2m
4
pod/hazelcast-1 1/1 Running 0 1m
5
pod/hazelcast-2 1/1 Running 0 1m
6
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
8
service/hazelcast-0 LoadBalancer 10.19.241.253 35.188.83.111 5701:30597/TCP 2m
9
service/hazelcast-1 LoadBalancer 10.19.251.243 35.192.168.46 5701:32718/TCP 2m
10
service/hazelcast-2 LoadBalancer 10.19.254.0 35.193.248.247 5701:30267/TCP 2m
Обратите внимание, что мы могли бы добиться того же, применив некоторые модификации к диаграмме Hazelcast Helm.
Шаг 2. Получение учетных данных API Kubernetes
Теперь у вас есть работающий кластер Hazelcast, развернутый в Kubernetes. Следующим шагом является получение учетных данных для API Kubernetes, чтобы мы могли использовать их в плагине Hazelcast Kubernetes Discovery.
2.1. Проверьте Кубернетес Мастер IP
Чтобы проверить IP-адрес Мастера Kubernetes, используйте следующую команду.
YAML
xxxxxxxxxx
1
$ kubectl cluster-info
2
Kubernetes master is running at https://35.226.182.228
2.2. Проверьте токен доступа и сертификат CA
Сначала вам нужно найти имя секрета для созданной Сервисной учетной записи.
YAML
xxxxxxxxxx
1
$ kubectl get secret
2
NAME TYPE DATA AGE
3
default-token-q9sp8 kubernetes.io/service-account-token 3 2h
4
hazelcast-service-account-token-6s94h kubernetes.io/service-account-token 3 9m
Затем, чтобы получить токен доступа, используйте следующую команду.
YAML
xxxxxxxxxx
1
$ kubectl get secret hazelcast-service-account-token-6s94h -o jsonpath= .data.token | base64 --decode | xargs echo
2
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhbXBsZS1zZXJ2aWNlLWFjY291bnQtdG9rZW4tNnM5NGgiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2FtcGxlLXNlcnZpY2UtYWNjb3VudCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjI5OTI1NzBmLTI1NDQtMTFlOS1iNjg3LTQyMDEwYTgwMDI4YiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhbXBsZS1zZXJ2aWNlLWFjY291bnQifQ.o-j4e-ducrMmQc23xYDnPr6TIyzlAs3pLNAmGLqPe9Vq1mwsxOh3ujcVKR90HAdkfHIF_Sw66qC9hXIDvxfqN_rLXlOKbvTX3gjDrAnyY_93Y3MpmSBj8yR9yHMb4O29a9UIwN5F2_VoCsc0IGumScU_EhPYc9mvEXlwp2bATQOEU-SVAGYPqvVPs9h5wjWZ7WUQa_-RBLMF6KRc9EP2i3c7dPSRVL9ZQ6k6OyUUOVEaPa1tqIxP7vOgx9Tg2C1KmYF5RDrlzrWkhEcjd4BLTiYDKEyaoBff9RqdPYlPwu0YcEH-F7yU8tTDN74KX5jvah3amg_zTiXeNoe5ZFcVdg
Чтобы получить сертификат CA, используйте следующую команду.
YAML
xxxxxxxxxx
1
$ kubectl get secret hazelcast-service-account-token-6s94h -o jsonpath= .data.ca\\.crt | base64 --decode
2
-----BEGIN CERTIFICATE-----
4
MIIDCzCCAfOgAwIBAgIQVcTHv3jK6g1l7Ph9Xyd9DTANBgkqhkiG9w0BAQsFADAv
5
MS0wKwYDVQQDEyQ4YjRhNjgwMS04NzJhLTQ2NDEtYjIwOC0zYjEyNDEwYWVkMTcw
6
HhcNMTkwMTMxMDcyNDMxWhcNMjQwMTMwMDgyNDMxWjAvMS0wKwYDVQQDEyQ4YjRh
7
NjgwMS04NzJhLTQ2NDEtYjIwOC0zYjEyNDEwYWVkMTcwggEiMA0GCSqGSIb3DQEB
8
AQUAA4IBDwAwggEKAoIBAQCaty8l9aHeWE1r9yLWKJMa3YQotVclYoEHegB8y6Ke
9
+zKqa06JKKrz3Qony97VdWR/NMpRYXouSF0owDv9BIoLTC682wlQtNB1c4pTVW7a
10
AikoNtyNIT8gtA5w0MyjFrbNslUblXvuo0HIeSmJREUmT7BC3VaKgkg64mVdf0DJ
11
NyrcL+qyCs1m03mi12hgzI72O3qgEtP91tu/oCUdOh39u13TB0fj5tgWURMFgkxo
12
T0xiNfPueV3pe8uYxBntzFn/74ibiizLRP6d/hsuRdS7IA+bvRLKG/paYwyZuMFb
13
BDA+kXXAIkOvCpIQCkAKMpyyDz9lBVCtl3eRSAJQLBefAgMBAAGjIzAhMA4GA1Ud
14
DwEB/wQEAwICBDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBP
15
TBRY1IbkFJuboMKLW9tdpIzW7hf2qsTLOhtlaJbMXrWaXCTrl8qUgBUZ1sWAW9Uk
16
qETwRoCMl1Ht7PhbnXEGDNt3Sw3Y3feR4PsffhcgWH0BK8pZVY0Q1zbZ6dVNbU82
17
EUrrcnV0uiB/JFsJ3rg8qJurutro3uIzAhb9ixYRqYnXUR4q0bxahO04iSUHvtYQ
18
JmWp1GCb/ny9MyeTkwh2Q+WIQBHsX4LfrKjPwJd6qZME7BmwryYBTkGa0FinmhRg
19
SdSPEQKmuXmghPU5GLudiI2ooOaqOXIjVPfM/cw4uU9FCGM49qufccOOt6utk0SM
20
DwupAKLLiaYs47a8JgUa
21
-----END CERTIFICATE-----
Шаг 3. Настройте интеллектуальный клиент Hazelcast
Теперь, когда у вас есть все детали, вы можете поместить их в конфигурацию клиента Hazelcast.
3.1. Настроить клиент Hazelcast
Создайте свою конфигурацию клиента Hazelcast. Если вы следуете загруженному образцу, вы можете просто изменить src/main/resources/hazelcast-client.xml
его, указав свои учетные данные.
XML
xxxxxxxxxx
1
2
<hazelcast-client xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
xsi:schemaLocation="http://www.hazelcast.com/schema/client-config
4
http://www.hazelcast.com/schema/client-config/hazelcast-client-config.xsd"
5
xmlns="http://www.hazelcast.com/schema/client-config">
6
<network>
7
<kubernetes enabled="true">
8
<use-public-ip>true</use-public-ip>
9
<kubernetes-master>https://35.226.182.228</kubernetes-master>
10
<api-token>eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhbXBsZS1zZXJ2aWNlLWFjY291bnQtdG9rZW4tNnM5NGgiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2FtcGxlLXNlcnZpY2UtYWNjb3VudCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjI5OTI1NzBmLTI1NDQtMTFlOS1iNjg3LTQyMDEwYTgwMDI4YiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhbXBsZS1zZXJ2aWNlLWFjY291bnQifQ.o-j4e-ducrMmQc23xYDnPr6TIyzlAs3pLNAmGLqPe9Vq1mwsxOh3ujcVKR90HAdkfHIF_Sw66qC9hXIDvxfqN_rLXlOKbvTX3gjDrAnyY_93Y3MpmSBj8yR9yHMb4O29a9UIwN5F2_VoCsc0IGumScU_EhPYc9mvEXlwp2bATQOEU-SVAGYPqvVPs9h5wjWZ7WUQa_-RBLMF6KRc9EP2i3c7dPSRVL9ZQ6k6OyUUOVEaPa1tqIxP7vOgx9Tg2C1KmYF5RDrlzrWkhEcjd4BLTiYDKEyaoBff9RqdPYlPwu0YcEH-F7yU8tTDN74KX5jvah3amg_zTiXeNoe5ZFcVdg</api-token>
11
<ca-certificate>
12
-----BEGIN CERTIFICATE-----
13
MIIDCzCCAfOgAwIBAgIQVcTHv3jK6g1l7Ph9Xyd9DTANBgkqhkiG9w0BAQsFADAv
14
MS0wKwYDVQQDEyQ4YjRhNjgwMS04NzJhLTQ2NDEtYjIwOC0zYjEyNDEwYWVkMTcw
15
HhcNMTkwMTMxMDcyNDMxWhcNMjQwMTMwMDgyNDMxWjAvMS0wKwYDVQQDEyQ4YjRh
16
NjgwMS04NzJhLTQ2NDEtYjIwOC0zYjEyNDEwYWVkMTcwggEiMA0GCSqGSIb3DQEB
17
AQUAA4IBDwAwggEKAoIBAQCaty8l9aHeWE1r9yLWKJMa3YQotVclYoEHegB8y6Ke
18
+zKqa06JKKrz3Qony97VdWR/NMpRYXouSF0owDv9BIoLTC682wlQtNB1c4pTVW7a
19
AikoNtyNIT8gtA5w0MyjFrbNslUblXvuo0HIeSmJREUmT7BC3VaKgkg64mVdf0DJ
20
NyrcL+qyCs1m03mi12hgzI72O3qgEtP91tu/oCUdOh39u13TB0fj5tgWURMFgkxo
21
T0xiNfPueV3pe8uYxBntzFn/74ibiizLRP6d/hsuRdS7IA+bvRLKG/paYwyZuMFb
22
BDA+kXXAIkOvCpIQCkAKMpyyDz9lBVCtl3eRSAJQLBefAgMBAAGjIzAhMA4GA1Ud
23
DwEB/wQEAwICBDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBP
24
TBRY1IbkFJuboMKLW9tdpIzW7hf2qsTLOhtlaJbMXrWaXCTrl8qUgBUZ1sWAW9Uk
25
qETwRoCMl1Ht7PhbnXEGDNt3Sw3Y3feR4PsffhcgWH0BK8pZVY0Q1zbZ6dVNbU82
26
EUrrcnV0uiB/JFsJ3rg8qJurutro3uIzAhb9ixYRqYnXUR4q0bxahO04iSUHvtYQ
27
JmWp1GCb/ny9MyeTkwh2Q+WIQBHsX4LfrKjPwJd6qZME7BmwryYBTkGa0FinmhRg
28
SdSPEQKmuXmghPU5GLudiI2ooOaqOXIjVPfM/cw4uU9FCGM49qufccOOt6utk0SM
29
DwupAKLLiaYs47a8JgUa
30
-----END CERTIFICATE-----
31
</ca-certificate>
32
</kubernetes>
33
</network>
34
</hazelcast-client>
3.2. Запустите клиентское приложение Hazelcast
При запуске приложения вы должны увидеть, что кластер Hazelcast обнаруживается автоматически. Если вы следуете загруженному примеру кода, вы можете запустить клиентское приложение с помощью следующей команды.
YAML
xxxxxxxxxx
1
mvn spring-boot:run
Пример приложения - это веб-служба, которая использует клиент Hazelcast для подключения к кластеру Hazelcast.
Чтобы проверить, что это работает правильно, вы можете:
- Откройте браузер по адресу:
http://localhost:8080/put?key=sampleKey&value=sampleValue
(вы должны увидеть ответ{"response":null}
) - Откройте браузер по адресу:
http://localhost:8080/get?key=sampleKey
(вы должны увидеть ответ{"response":"sampleValue"}
) - Проверьте журналы приложений и убедитесь, что клиент успешно подключился к кластеру Hazelcast, который содержал три члена.
Заключение
Hazelcast позволяет настроить локальный кластер Hazelcast, работающий в Kubernetes . Чтобы подключиться к нему, вы можете выбрать более простой unisocket клиент или более производительный смарт-клиент . Мы планируем внести некоторые улучшения в прежнее решение. Вы можете ожидать, что вам не нужно будет использовать Kubernetes API (и связанный обмен учетными данными) для обнаружения клиента. Мы также планируем добавить поддержкуhostPort
конфигурации, которая позволит вам пропустить настройку Metacontroller. Мы будем держать вас в курсе. Потому что, как я писал в начале, Hazelcast любит Kubernetes!
Дальнейшее чтение
DZone Refcard: Введение в Hazelcast IMDG
Java: как стать более продуктивным с Hazelcast менее чем за 5 минут