Введение
В Kubernetes StatefulSets используются для управления приложениями с сохранением состояния (stateful applications). В отличие от традиционных бессостоянных приложений (stateless applications), приложения с сохранением состояния требуют стабильных уникальных сетевых идентификаторов и постоянного хранения. В этом практическом занятии (lab) мы научимся моделировать стабильность с использованием StatefulSets в Kubernetes.
Запуск кластера Minikube
Перед созданием ресурсов вам нужен работающий кластер Kubernetes. Minikube - это легковесная среда Kubernetes, которая запускается на вашем локальном компьютере.
Перейдите в рабочую директорию:
Откройте терминал и перейдите в папку проекта по умолчанию:
cd /home/labex/projectЗапустите Minikube:
Запустите Minikube для инициализации кластера Kubernetes:
minikube start- Эта команда настраивает однодневный кластер Kubernetes на вашем локальном компьютере.
- В зависимости от производительности вашей системы Minikube может потребовать несколько минут для запуска.
Проверьте, что 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.


