Приклад: Розгортання Cassandra з використанням StatefulSet
Цей підручник покаже вам, як запустити Apache Cassandra у Kubernetes. Cassandra, база даних, потребує постійного сховища для забезпечення стійкості даних (стан застосунку). У цьому прикладі використовується власний постачальник насіння Cassandra, що дозволяє базі даних виявляти нові екземпляри Cassandra, коли вони приєднуються до кластера Cassandra.
StatefulSet полегшує розгортання стійких застосунків у вашому кластері Kubernetes. Для отримання додаткової інформації про використані у цьому підручнику функції дивіться StatefulSet.
Примітка:
Cassandra та Kubernetes використовують термін вузол для позначення члена кластера. У цьому підручнику Podʼи, що належать StatefulSet, є вузлами Cassandra та є членами кластера Cassandra (званого кільцем (ring)). Коли ці Podʼи працюють у вашому кластері Kubernetes, панель управління Kubernetes розміщує ці Podʼи на Вузлах Kubernetes.
Коли вузол Cassandra стартує, він використовує список насіння для відкриття виявлення інших вузлів у кільці. У цьому підручнику розгортається власний постачальник насіння Cassandra, який дозволяє базі даних виявляти нові Podʼи Cassandra в міру їх появи у вашому кластері Kubernetes.
Цілі
- Створення та перевірка Cassandra headless Service.
- Використання StatefulSet для створення кільця Cassandra.
- Перевірка StatefulSet.
- Зміна StatefulSet.
- Видалення StatefulSet та його Podʼів.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Для роботи з цим посібником ви повинні вже мати базові знання про Podʼи, Сервіси, та StatefulSets.
Додаткові інструкції щодо налаштування Minikube
Увага:
Minikube стандартно використовує 2048 МБ пам’яті та 2 ЦП. Запуск Minikube зі стандартною конфігурацією ресурсів призводить до помилок недостатності ресурсів під час виконання настанов цього посібника. Щоб уникнути цих помилок, запустіть Minikube з наступними налаштуваннями:
minikube start --memory 5120 --cpus=4
Створення headless Service для Cassandra
У Kubernetes Service описує набір Podʼів, які виконують одну й ту ж задачу.
Наступний Service використовується для DNS-пошуку між Podʼами Cassandra та клієнтами у вашому кластері:
apiVersion: v1
kind: Service
metadata:
labels:
app: cassandra
name: cassandra
spec:
clusterIP: None
ports:
- port: 9042
selector:
app: cassandra
Створіть Service для відстеження всіх членів StatefulSet Cassandra з файлу cassandra-service.yaml
:
kubectl apply -f https://k8s.io/examples/application/cassandra/cassandra-service.yaml
Перевірка (необов’язково)
Отримайте інформацію про Cassandra Service.
kubectl get svc cassandra
Відповідь буде
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cassandra ClusterIP None <none> 9042/TCP 45s
Якщо ви не бачите Service з назвою cassandra
, це означає, що його створення не вдалося. Прочитайте Налагодження Service, щоб отримати довідку з усунення загальних проблем.
Використання StatefulSet для створення кільця Cassandra
Маніфест StatefulSet, наведений нижче, створює кільце Cassandra, що складається з трьох Podʼів.
Примітка:
У цьому прикладі використовується стандартний провізор для Minikube. Будь ласка, оновіть наступний StatefulSet для хмари, з якою ви працюєте.apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cassandra
labels:
app: cassandra
spec:
serviceName: cassandra
replicas: 3
selector:
matchLabels:
app: cassandra
template:
metadata:
labels:
app: cassandra
spec:
terminationGracePeriodSeconds: 500
containers:
- name: cassandra
image: gcr.io/google-samples/cassandra:v13
imagePullPolicy: Always
ports:
- containerPort: 7000
name: intra-node
- containerPort: 7001
name: tls-intra-node
- containerPort: 7199
name: jmx
- containerPort: 9042
name: cql
resources:
limits:
cpu: "500m"
memory: 1Gi
requests:
cpu: "500m"
memory: 1Gi
securityContext:
capabilities:
add:
- IPC_LOCK
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- nodetool drain
env:
- name: MAX_HEAP_SIZE
value: 512M
- name: HEAP_NEWSIZE
value: 100M
- name: CASSANDRA_SEEDS
value: "cassandra-0.cassandra.default.svc.cluster.local"
- name: CASSANDRA_CLUSTER_NAME
value: "K8Demo"
- name: CASSANDRA_DC
value: "DC1-K8Demo"
- name: CASSANDRA_RACK
value: "Rack1-K8Demo"
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
readinessProbe:
exec:
command:
- /bin/bash
- -c
- /ready-probe.sh
initialDelaySeconds: 15
timeoutSeconds: 5
# Ці точки монтування томів є постійними. Вони подібни до вбудованих заявок,
# але не зовсіс, тому що імена повинні точно збігатись з одним з томів
# томів Podʼів stateful.
volumeMounts:
- name: cassandra-data
mountPath: /cassandra_data
# Це перетворюється у заявки на томи контролером
# та монтується в шлях, зазначений вище.
# не використовуйте це в операційній діяльності, допоки тип ssd є GCEPersistentDisk чи інший ssd pd
volumeClaimTemplates:
- metadata:
name: cassandra-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: fast
resources:
requests:
storage: 1Gi
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: fast
provisioner: k8s.io/minikube-hostpath
parameters:
type: pd-ssd
Створіть StatefulSet Cassandra з файлу cassandra-statefulset.yaml
:
# Використовуйте це, якщо ви можете застосувати cassandra-statefulset.yaml без змін
kubectl apply -f https://k8s.io/examples/application/cassandra/cassandra-statefulset.yaml
Якщо вам потрібно змінити cassandra-statefulset.yaml
для вашого кластера, завантажте https://k8s.io/examples/application/cassandra/cassandra-statefulset.yaml та застосуйте цей маніфест, з теки, в яку ви зберегли змінену версію:
# Використовуйте це, якщо ви змінили cassandra-statefulset.yaml локально
kubectl apply -f cassandra-statefulset.yaml
Перевірка StatefulSet Cassandra
Отримайте StatefulSet Cassandra:
kubectl get statefulset cassandra
Відповідь буде схожа на:
NAME DESIRED CURRENT AGE cassandra 3 0 13s
Ресурс
StatefulSet
розгортає Podʼи послідовно.Отримайте Podʼи, щоб побачити статус створення в зазначеному порядку:
kubectl get pods -l="app=cassandra"
Відповідь буде схожа на:
NAME READY STATUS RESTARTS AGE cassandra-0 1/1 Running 0 1m cassandra-1 0/1 ContainerCreating 0 8s
На створення всіх трьох Podʼів може піти декілька хвилин. Після їх розгортання ця ж команда повертає вихідні дані, схожі на:
NAME READY STATUS RESTARTS AGE cassandra-0 1/1 Running 0 10m cassandra-1 1/1 Running 0 9m cassandra-2 1/1 Running 0 8m
Виконайте інструмент nodetool Cassandra всередині першого Podʼа, щоб переглянути стан кільця.
kubectl exec -it cassandra-0 -- nodetool status
Відповідь буде схожою на:
Datacenter: DC1-K8Demo ====================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 172.17.0.5 83.57 KiB 32 74.0% e2dd09e6-d9d3-477e-96c5-45094c08db0f Rack1-K8Demo UN 172.17.0.4 101.04 KiB 32 58.8% f89d6835-3a42-4419-92b3-0e62cae1479c Rack1-K8Demo UN 172.17.0.6 84.74 KiB 32 67.1% a6a1e8c2-3dc5-4417-b1a0-26507af2aaad Rack1-K8Demo
Зміна StatefulSet Cassandra
Використовуйте kubectl edit
, щоб змінити розмір StatefulSet Cassandra.
Виконайте наступну команду:
kubectl edit statefulset cassandra
Ця команда відкриває редактор у вашому терміналі. Рядок, який вам потрібно змінити, — це поле
replicas
. Наведений нижче приклад — це уривок з файлу StatefulSet:# Будь ласка, відредагуйте об’єкт нижче. Рядки, що починаються з '#', будуть проігноровані, # і пустий файл призведе до відмови редагування. Якщо під час збереження файлу виникне помилка, # цей файл буде знову відкритий із відповідними несправностями. # apiVersion: apps/v1 kind: StatefulSet metadata: creationTimestamp: 2016-08-13T18:40:58Z generation: 1 labels: app: cassandra name: cassandra namespace: default resourceVersion: "323" uid: 7a219483-6185-11e6-a910-42010a8a0fc0 spec: replicas: 3
Змініть кількість реплік на 4 і збережіть маніфест.
Тепер StatefulSet масштабується для роботи з 4 Podʼами.
Отримайте StatefulSet Cassandra, щоб перевірити зміни:
kubectl get statefulset cassandra
Відповідь буде схожа на:
NAME DESIRED CURRENT AGE cassandra 4 4 36m
Очищення
Видалення або зменшення масштабу StatefulSet не призводить до видалення томів, повʼязаних із StatefulSet. Це налаштування захищає вас, оскільки ваші дані цінніші, ніж автоматичне очищення всіх повʼязаних ресурсів StatefulSet.
Попередження:
Залежно від класу сховища та політики вилучення, видалення PersistentVolumeClaims може призвести до вилучення також повʼязаних томів. Ніколи не припускайте, що ви зможете отримати доступ до даних, якщо їх томи будуть видалені.Виконайте наступні команди (послідовно обʼєднані в одну команду) для видалення всього в StatefulSet Cassandra:
grace=$(kubectl get pod cassandra-0 -o=jsonpath='{.spec.terminationGracePeriodSeconds}') \ && kubectl delete statefulset -l app=cassandra \ && echo "Sleeping ${grace} seconds" 1>&2 \ && sleep $grace \ && kubectl delete persistentvolumeclaim -l app=cassandra
Виконайте наступну команду для видалення Service, який ви налаштували для Cassandra:
kubectl delete service -l app=cassandra
Змінні середовища контейнера Cassandra
Podʼи в цьому посібнику використовують образ gcr.io/google-samples/cassandra:v13
з реєстру контейнерів Google. Докер-образ вище базується на debian-base і містить OpenJDK 8.
Цей образ включає стандартну установку Cassandra з репозиторію Apache Debian. За допомогою змінних середовища ви можете змінити значення, які вставляються в cassandra.yaml
.
Змінна середовища | Стандартне значенняанням |
---|---|
CASSANDRA_CLUSTER_NAME | 'Test Cluster' |
CASSANDRA_NUM_TOKENS | 32 |
CASSANDRA_RPC_ADDRESS | 0.0.0.0 |
Що далі
- Дізнайтеся, як Масштабувати StatefulSet.
- Дізнайтеся більше про KubernetesSeedProvider
- Подивіться інші налаштування постачальника насіння