Использование контроллера StatefulSet

KubernetesKubernetesBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В Kubernetes StatefulSets используются для управления приложениями с сохранением состояния (stateful applications). В отличие от традиционных бессостоянных приложений (stateless applications), приложения с сохранением состояния требуют стабильных уникальных сетевых идентификаторов и постоянного хранения. В этом практическом занятии (lab) мы научимся моделировать стабильность с использованием StatefulSets в Kubernetes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedDeploymentGroup(["Advanced Deployment"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/delete("Delete") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/AdvancedDeploymentGroup -.-> kubernetes/scale("Scale") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") subgraph Lab Skills kubernetes/initialization -.-> lab-9205{{"Использование контроллера StatefulSet"}} kubernetes/get -.-> lab-9205{{"Использование контроллера StatefulSet"}} kubernetes/create -.-> lab-9205{{"Использование контроллера StatefulSet"}} kubernetes/delete -.-> lab-9205{{"Использование контроллера StatefulSet"}} kubernetes/apply -.-> lab-9205{{"Использование контроллера StatefulSet"}} kubernetes/scale -.-> lab-9205{{"Использование контроллера StatefulSet"}} kubernetes/describe -.-> lab-9205{{"Использование контроллера StatefulSet"}} end

Запуск кластера Minikube

Перед созданием ресурсов вам нужен работающий кластер Kubernetes. Minikube - это легковесная среда Kubernetes, которая запускается на вашем локальном компьютере.

  1. Перейдите в рабочую директорию:

    Откройте терминал и перейдите в папку проекта по умолчанию:

    cd /home/labex/project
  2. Запустите Minikube:

    Запустите Minikube для инициализации кластера Kubernetes:

    minikube start
    • Эта команда настраивает однодневный кластер Kubernetes на вашем локальном компьютере.
    • В зависимости от производительности вашей системы Minikube может потребовать несколько минут для запуска.
  3. Проверьте, что Minikube запущен:

    Проверьте статус кластера Minikube:

    minikube status
    • Проверьте, чтобы компоненты, такие как kubelet и apiserver, были перечислены как Running (работающие).
    • Если кластер не запущен, запустите команду minikube start снова.

Если у вас возникли проблемы с запуском Minikube, используйте minikube delete для сброса среды при необходимости.

Создание PV и PVC

Первым шагом является создание Pod с Постоянным Диском (Persistent Volume, PV) и Запросом на Постоянный Диск (Persistent Volume Claim, PVC). PV и PVC используются для постоянного хранения и доступа к данным при перезапусках Pod.

Для этого сначала создадим PV.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

Сохраните приведенный выше код в файле с именем pv.yaml и выполните следующую команду:

kubectl apply -f pv.yaml

Эта команда создаст PV с именем my-pv объемом 1Gi и путем на узле /mnt/data.

Далее создадим PVC, который запрашивает 1Gi хранилища из PV.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Сохраните приведенный выше код в файле с именем pvc.yaml и выполните следующую команду:

kubectl apply -f pvc.yaml

Эта команда создаст PVC с именем my-pvc, который запрашивает 1Gi хранилища.

Создание StatefulSet

Создайте файл с именем statefulset.yaml со следующим содержимым:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19.7
          ports:
            - containerPort: 80
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

В этом файле мы определяем StatefulSet с именем web, который создает три реплики Pod с NGINX. Мы также определяем сервис (service) с именем web, который выбирает Pod с NGINX с использованием метки app: nginx. Наконец, мы определяем шаблон запроса на постоянный диск (persistent volume claim template) для данных Pod с NGINX.

Для создания StatefulSet выполните следующую команду:

kubectl apply -f statefulset.yaml

Вы можете проверить статус StatefulSet, выполнив следующую команду:

kubectl get statefulsets

После запуска StatefulSet вы можете получить доступ к Pod с NGINX, выполнив следующие команды:

kubectl get pods
kubectl exec -it web-0 -- /bin/bash

Замените web-0 именем любого Pod с NGINX, созданного StatefulSet.

Поздравляем, вы успешно создали StatefulSet в Kubernetes!

Обновление StatefulSet

В Kubernetes вы можете обновить Podы StatefulSet, изменив его шаблон. Давайте обновим файл statefulset.yaml для использования версии NGINX 1.20.0.

Обновите файл statefulset.yaml до следующего содержания:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.0
          ports:
            - containerPort: 80
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

Для обновления StatefulSet выполните следующую команду:

kubectl apply -f statefulset.yaml

Вы можете проверить статус StatefulSet, выполнив следующую команду:

kubectl get statefulsets

Поздравляем, вы успешно обновили StatefulSet в Kubernetes!

Масштабирование StatefulSet

В Kubernetes вы можете масштабировать StatefulSet вверх или вниз, изменив поле replicas. Давайте масштабируем наш StatefulSet web до пяти реплик.

Обновите файл statefulset.yaml до следующего содержания:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.0
          ports:
            - containerPort: 80
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

Для обновления StatefulSet выполните следующую команду:

kubectl apply -f statefulset.yaml

Вы можете проверить статус StatefulSet, выполнив следующую команду:

kubectl get statefulsets

Поздравляем, вы успешно масштабировали StatefulSet в Kubernetes!

Удаление StatefulSet

В Kubernetes вы можете удалить StatefulSet, выполнив следующую команду:

kubectl delete statefulset web

Это удалит StatefulSet web и все его Podы.

Поздравляем, вы завершили лабораторную работу по моделированию стабильности с использованием StatefulSet в Kubernetes!

Резюме

В этой лабораторной работе мы научились моделировать стабильность с использованием StatefulSet в Kubernetes. Мы создали StatefulSet, обновили StatefulSet, масштабировали StatefulSet и удалили StatefulSet. Это базовые операции, которые вам придется выполнять при работе с StatefulSet в Kubernetes.