Приклад: Розгортання Cassandra з використанням StatefulSet

Цей підручник покаже вам, як запустити Apache Cassandra у Kubernetes. Cassandra, база даних, потребує постійного сховища для забезпечення стійкості даних (стан застосунку). У цьому прикладі використовується власний постачальник насіння Cassandra, що дозволяє базі даних виявляти нові екземпляри Cassandra, коли вони приєднуються до кластера Cassandra.

StatefulSet полегшує розгортання стійких застосунків у вашому кластері Kubernetes. Для отримання додаткової інформації про використані у цьому підручнику функції дивіться StatefulSet.

Цілі

  • Створення та перевірка Cassandra headless Service.
  • Використання StatefulSet для створення кільця Cassandra.
  • Перевірка StatefulSet.
  • Зміна StatefulSet.
  • Видалення StatefulSet та його Podʼів.

Перш ніж ви розпочнете

Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:

Для роботи з цим посібником ви повинні вже мати базові знання про Podʼи, Сервіси, та StatefulSets.

Додаткові інструкції щодо налаштування Minikube

Створення 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ʼів.

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

  1. Отримайте StatefulSet Cassandra:

    kubectl get statefulset cassandra
    

    Відповідь буде схожа на:

    NAME        DESIRED   CURRENT   AGE
    cassandra   3         0         13s
    

    Ресурс StatefulSet розгортає Podʼи послідовно.

  2. Отримайте 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
    
  3. Виконайте інструмент 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.

  1. Виконайте наступну команду:

    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
    
  2. Змініть кількість реплік на 4 і збережіть маніфест.

    Тепер StatefulSet масштабується для роботи з 4 Podʼами.

  3. Отримайте StatefulSet Cassandra, щоб перевірити зміни:

    kubectl get statefulset cassandra
    

    Відповідь буде схожа на:

    NAME        DESIRED   CURRENT   AGE
    cassandra   4         4         36m
    

Очищення

Видалення або зменшення масштабу StatefulSet не призводить до видалення томів, повʼязаних із StatefulSet. Це налаштування захищає вас, оскільки ваші дані цінніші, ніж автоматичне очищення всіх повʼязаних ресурсів StatefulSet.

  1. Виконайте наступні команди (послідовно обʼєднані в одну команду) для видалення всього в 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
    
  2. Виконайте наступну команду для видалення 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_TOKENS32
CASSANDRA_RPC_ADDRESS0.0.0.0

Що далі

Змінено August 27, 2024 at 9:57 PM PST: Removing the reviewers section from the front matter (81a711722d)