Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ДЗ#12 Установка и использование CSI драйвера #13

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 3 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
"https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.22.4-standalone-strict/all.json": "file:///home/urhero/otus/lesson1/yourh3ro_repo/kubernetes-intro/%20namespace.yaml%20"
},
"vs-kubernetes": {
"disable-linters": ["resource-limits"]
"disable-linters": ["resource-limits"],
"vs-kubernetes.helm-path": "/usr/local/bin/helm",
"vs-kubernetes.kubectl-path": "/usr/local/bin/kubectl"
}
}
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,27 @@
# Репозиторий для выполнения домашних заданий курса "Инфраструктурная платформа на основе Kubernetes-2024-02"

[ДЗ#2 Kubernetes controllers. ReplicaSet, Deployment, DaemonSet](kubernetes-controllers/README.md)
[ДЗ#3 Сетевое взаимодействие Pod, сервисы](kubernetes-networks/README.md)
[ДЗ#4 Volumes, StorageClass, PV, PVC](kubernetes-volumes/README.md)
[ДЗ#5 Настройка сервисных аккаунтов и ограничение прав для них](kubernetes-security/README.md)
[ДЗ#6 Шаблонизация манифестов приложения, использование Helm. Установка community Helm charts.](kubernetes-templating/README.md)
[ДЗ#7 Создание собственного CRD](kubernetes-operators/README.md)
[ДЗ#8 Мониторинг приложения в кластере](kubernetes-monitoring/README.md)
[ДЗ#9 Сервисы централизованного логирования для Kubernetes](kubernetes-logging/README.md)
[ДЗ#10 GitOps и инструменты поставки](kubernetes-gitops/README.md)
[ДЗ#11 Хранилище секретов для приложения. Vault.](kubernetes-vault/README.md)
[ДЗ#12 Установка и использование CSI драйвера](kubernetes-csi/README.md)
## Tricks, Tools, Hints

### k9s
[K9s - Kubernetes CLI To Manage Your Clusters In Style!](https://github.com/derailed/k9s) - CUI for k8s clusters
https://habr.com/ru/companies/flant/articles/524196/ - статья по функция и возможностям

Установка:
На странице есть инструкции пол установке под все платформы.
Для Ubuntu 22.04.4 LTS (WSL2)
```sh
curl -L https://github.com/derailed/k9s/releases/download/v0.32.4/k9s_linux_amd64.deb -o k9s.deb
sudo dpkg -i k9s.deb
```

Binary file added img/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image11.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image12.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image13.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image14.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image15.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image17.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image18.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image19.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
91 changes: 91 additions & 0 deletions kubernetes-controllers/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
## ДЗ#2 Kubernetes controllers. ReplicaSet, Deployment, DaemonSet

### Задания:
- Необходимо создать манифест namespace.yaml для namespace с именем homework
- Необходимо создать манифест deployment.yaml. Он должен описывать deployment, который:
- Будет создаваться в namespace homework
- Запускает 3 экземпляра пода, полностью аналогичной по спецификации прошлому ДЗ.
- В дополнение к этому будет иметь readiness пробу, проверяющую наличие файла /homework/index.html
- Будет иметь стратегию обновления RollingUpdate, настроенную так, что в процессе обновления может быть недоступен максимум 1 под

#### Задание с *
- Добавить к манифесту deployment-а спецификацию, обеспечивающую запуск подов деплоймента, только на нодах кластера, имеющих метку homework=true

### Подготовка
1. Необходимо убедиться, что на ноде есть label `homework=true`, это можно посмотреть командой `kubectl get nodes --show-labels`. В моем случае, label уже есть на нужной ноде. Если label нет, его необходимо создать командой `kubectl label nodes <node-name> homework=true`

![alt text](.../img/image.png)

### Запуск
1. Создать namespace командой `kubectl apply -f kubernetes-controllers/namespase.yaml`
2. Создать остальные ресурсы командой `kubectl apply -f kubernetes-controllers/`

![alt text](../img/image2.png)

### Описание решения
1. За создание namespace отвечает файл `kubernetes-controllers/namespase.yaml`, который создает namespace с именем `homework`.
2. Файл `kubernetes-controllers/configmap-nginx-config.yaml` конфигурирует nginx, наследован из Д3#1
3. В файле `kubernetes-controllers/deployment.yaml`
Создает в namespace `homework`

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webserver
namespace: homework
```

3 экземляра пода, под nginx из ДЗ#1

```yaml
spec:
...
replicas: 3
```

Сконфигурирована readiness probe, которая командой `test -s /homework/index.html` проверяет наличие файла `/homework/index.html` и что файл не пуст.

```yaml
readinessProbe:
exec:
command:
- sh
- -c
- test -s /homework/index.html
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3
```

Сконфигурирована стратегия обновления RollingUpdate, в процессе обновления недоступен максимум 1 pod (`maxUnavailable: 1`)

```yaml
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
```

Поды запускаются только на нодах кластера, у которых есть label `homework=true`

```yaml
nodeSelector:
homework: "true"
```

### Проверка
1. Если на нодах нет label `homework=true`, поды не запустятся. Если назначить label, pod-ы запускаются. Эти события видно через `kubectl get events --namespace homework | grep FailedScheduling`

![alt text](../img/image3.png)
![alt text](../img/image5.png)

2. Если удалить из контейнера пода `/homework/index.html`, он переидет в состояние `READY 0/1`, так как readinessProbe оканчивается ошибкой. Эти события так же видно в `kubectl get events --namespace homework | grep Unhealthy`. Для production систем необходимо сконфигурировать `restartPolicy` для подов, но здесь не сконфигурировано для наглядности:

![alt text](../img/image4.png)
![alt text](../img/image6.png)

3. Для проверки `strategy`, необходимо обновить в `deployment.yaml`, для примера я обновили image nginx с `nginx:1.25.5-bookworm` на `nginx:1.26.0-bookworm`. Поды перезапускаются по одному.

![alt text](../img/image7.png)
16 changes: 16 additions & 0 deletions kubernetes-controllers/configmap-nginx-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: homework
data:
nginx.conf: |
server {
listen 8000;
server_name localhost;

location / {
root /homework;
index index.html;
}
}
67 changes: 67 additions & 0 deletions kubernetes-controllers/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: webserver
namespace: homework
labels:
app: webserver
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
replicas: 3
selector:
matchLabels:
app: webserver
template:
metadata:
labels:
app: webserver
spec:
initContainers:
- name: init-websever
image: busybox:1.36.1
command: ["/bin/sh", "-c"]
volumeMounts:
- name: homework-vol
mountPath: /init
args:
- wget -O /init/index.html https://github.com/ || echo '$(date)\n Failed wget to https://github.com/' > /init/index.html

containers:
- name: webserver
image: nginx:1.26.0-bookworm
ports:
- containerPort: 8000
volumeMounts:
- name: homework-vol
mountPath: /homework
- name: nginx-conf
mountPath: /etc/nginx/conf.d/
readOnly: true
lifecycle:
preStop:
exec:
command: ["rm", "-f", "/homework/index.html"]
readinessProbe:
exec:
command:
- sh
- -c
- test -s /homework/index.html
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3

volumes:
- name: homework-vol
emptyDir:
sizeLimit: 250Mi
- name: nginx-conf
configMap:
name: nginx-config

nodeSelector:
homework: "true"
4 changes: 4 additions & 0 deletions kubernetes-controllers/namespase.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: homework
100 changes: 100 additions & 0 deletions kubernetes-csi/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
## ДЗ#12 Установка и использование CSI драйвера

### Задания:
- Данное задание будет выполняться в managed k8s в Yandex cloud
- Разверните managed Kubernetes cluster в Yandex cloud любым удобным вам способом, конфигурация нод не имеет значения
- Создайте бакет в s3 object storage Yandex cloud. Он будет использоваться для монтирования volume внутрь подов.
- Создайте ServiceAccount для доступа к бакету с правами, которые необходимы согласно инструкции YC и сгенерируйте ключи доступа.
- Создайте secret c ключами для доступа к Object Storage и приложите манифест для проверки ДЗ
- Создайте storageClass описывающий класс хранилища и приложите манифест для проверки ДЗ
- Установите CSI driver из репозитория
- Создайте манифест PVC, использующий для хранения созданный вами storageClass с механизмом autoProvisioning и приложите его для проверки ДЗ
- Создайте манифест pod или deployment, использующий созданный ранее PVC в качестве volume и монтирующий его в контейнер пода в произвольную точку монтирования и приложите манифест для проверки ДЗ.
- Под в процессе работы должен производить запись в примонтированную директорию. Убедитесь, что файлы действительно сохраняются в ObjectStorage.
### Запуск
- Создать s3 object storage Yandex cloud, я делал это ранее в ДЗ kubernetes-logging
- Установить yc-csi `helm install --create-namespace yandex-csi-s3 ./csi-s3/`
- Установить манифесты yc-s3-secret.yaml, yc-s3-sc.yaml, yc-s3-pvc.yaml
- Запустить "Полезную нагрузку" yc-s3-test-storage-pod.yaml
### Описание решения
s3 object storage Yandex cloud и аккаунт к нему я делал еще в ДЗ kubernetes-logging, по этому я просто заново сгенерировал ключ:
```sh
urhero@urheroComp:~/otus/homework12/yourh3ro_repo$ yc iam access-key create --service-account-name bucket-acc
access_key:
id: ajeh6rd4bj4sdbeq55j9
service_account_id: ajeka3kirg39l24ouqf7
created_at: "2024-09-16T14:37:57.423849035Z"
key_id: YCAJEEk4qXN_sO0yM5WJ-YlGJ
secret: YCN_rF2gbEDttu3qhgkPBC_BolC********
```
Далее по интрукции установил helm chart https://github.com/yandex-cloud/k8s-csi-s3
И создал необходимые ресурсы:
```yaml
# yc-s3-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: csi-s3-secret
namespace: kube-system
stringData:
accessKeyID: YCAJEEk4qXN_sO0yM5WJ-YlGJ
secretAccessKey: YCN_rF2gbEDttu3qhgkPBC_BolC********
endpoint: https://storage.yandexcloud.net
---
# yc-s3-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: csi-s3-existing-bucket
provisioner: ru.yandex.s3.csi
parameters:
mounter: geesefs
options: "--memory-limit 1000 --dir-mode 0777 --file-mode 0666"
bucket: otus-backet
csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret
csi.storage.k8s.io/provisioner-secret-namespace: kube-system
csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret
csi.storage.k8s.io/controller-publish-secret-namespace: kube-system
csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret
csi.storage.k8s.io/node-stage-secret-namespace: kube-system
csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret
csi.storage.k8s.io/node-publish-secret-namespace: kube-system
volumeBindingMode: Immediate
---
# yc-s3-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-s3-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-s3-existing-bucket
```
После применения этих манифетов я смог создать вод с "полезной" нагрузкой, в который подмонтировал yc s3:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: yc-s3-test-storage-pod
namespace: default
spec:
containers:
- name: yc-s3-test-storage-pod
image: busybox:1.31.1
command: [ "sh", "-c", "dd if=/dev/zero of=/data/storage-test.img bs=1M count=256 && sleep 3600" ]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: csi-s3-pvc
readOnly: false
```
И увидел в консоли yandex cloud созданный файл:
![alt text](../img/image19.png)
11 changes: 11 additions & 0 deletions kubernetes-csi/csi-s3/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
apiVersion: v1
appVersion: 0.41.1
description: Container Storage Interface (CSI) driver for S3 volumes
home: https://github.com/yandex-cloud/k8s-csi-s3
icon: https://raw.githubusercontent.com/yandex-cloud/geesefs/master/doc/geesefs.png
keywords:
- s3
name: csi-s3
sources:
- https://github.com/yandex-cloud/k8s-csi-s3/deploy/helm
version: 0.41.1
41 changes: 41 additions & 0 deletions kubernetes-csi/csi-s3/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Helm chart for csi-s3

This chart adds S3 volume support to your cluster.

## Install chart

- Helm 2.x: `helm install [--set secret.accessKey=... --set secret.secretKey=... ...] --namespace kube-system --name csi-s3 .`
- Helm 3.x: `helm install [--set secret.accessKey=... --set secret.secretKey=... ...] --namespace kube-system csi-s3 .`

After installation succeeds, you can get a status of Chart: `helm status csi-s3`.

## Delete Chart

- Helm 2.x: `helm delete --purge csi-s3`
- Helm 3.x: `helm uninstall csi-s3 --namespace kube-system`

## Configuration

By default, this chart creates a secret and a storage class. You should at least set `secret.accessKey` and `secret.secretKey`
to your [Yandex Object Storage](https://cloud.yandex.com/en-ru/services/storage) keys for it to work.

The following table lists all configuration parameters and their default values.

| Parameter | Description | Default |
| ---------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------ |
| `storageClass.create` | Specifies whether the storage class should be created | true |
| `storageClass.name` | Storage class name | csi-s3 |
| `storageClass.singleBucket` | Use a single bucket for all dynamically provisioned persistent volumes | |
| `storageClass.mounter` | Mounter to use. Either geesefs, s3fs or rclone. geesefs recommended | geesefs |
| `storageClass.mountOptions` | GeeseFS mount options | `--memory-limit 1000 --dir-mode 0777 --file-mode 0666` |
| `storageClass.reclaimPolicy` | Volume reclaim policy | Delete |
| `storageClass.annotations` | Annotations for the storage class | |
| `secret.create` | Specifies whether the secret should be created | true |
| `secret.name` | Name of the secret | csi-s3-secret |
| `secret.accessKey` | S3 Access Key | |
| `secret.secretKey` | S3 Secret Key | |
| `secret.endpoint` | Endpoint | https://storage.yandexcloud.net |
| `secret.region` | Region | |
| `tolerations.all` | Tolerate all taints by the CSI-S3 node driver (mounter) | false |
| `tolerations.node` | Custom tolerations for the CSI-S3 node driver (mounter) | [] |
| `tolerations.controller` | Custom tolerations for the CSI-S3 controller (provisioner) | [] |
Loading
Loading