У цьому розділі документації Kubernetes зібрані навчальні посібники. Навчальний посібник показує, як досягти мети, що більша за одне завдання. Зазвичай навчальний посібник має декілька розділів, кожен з яких містить певну послідовність дій. До ознайомлення з навчальними посібниками вам, можливо, знадобиться додати у закладки сторінку зі Стандартизованим глосарієм, щоб звертатися до неї пізніше.
Основи
Основи Kubernetes — детальний інтерактивний навчальний посібник, що допоможе вам зрозуміти систему Kubernetes і спробувати деякі базові функції Kubernetes.
Якщо ви хочете написати навчальний посібник, ознайомтеся зі сторінкою Типи вмісту сторінок, щоб дізнатися більше про тип сторінки навчального посібника.
1 - Привіт Minikube
Цей навчальний посібник показує, як запустити демонстраційний застосунок у Kubernetes за допомогою minikube. Навчальний посібник надає образ контейнера, який за допомогою NGINX повертає у відповідь усі отримані запити.
Цілі
Розгорнути демонстраційний застосунок у minikube.
Запустити застосунок.
Переглянути логи застосунку.
Перш ніж ви розпочнете
Цей навчальний посібник передбачає, що ви вже налаштували minikube. Інструкції щодо встановлення дивіться в Кроці 1 на сторінці minikube start.
Примітка
Виконайте лише інструкції з Кроку 1, Встановлення. Решту розглянуто на цій сторінці.
Вам також потрібно встановити kubectl. Інструкції щодо встановлення дивіться в розділі Встановлення інструментів.
Створення кластера minikube
minikube start
Примітка
Команда minikube start створює кластер з одним вузлом. Цей вузол виконує роль і панелі управління, і робочого вузла. Це відрізняється від багатьох промислових кластерів Kubernetes, де вузли панелі управління зазвичай ізольовані від робочих вузлів за допомогою taint або повністю невидимі для користувача.
Перевірка стану кластера minikube
Перевірте стан кластера minikube, щоб переконатися, що всі компоненти працюють.
minikube status
Вивід наведеної вище команди має показувати всі компоненти у стані Running або Configured, як у прикладі виводу нижче:
Відкрийте інформаційну панель Kubernetes. Це можна зробити двома різними способами:
Відкрийте новий термінал і виконайте:
# Запустіть новий термінал та залиште його працювати.minikube dashboard
Тепер поверніться до термінала, де ви запустили minikube start.
Примітка
<p>Команда <code>dashboard</code> вмикає надбудову інформаційної панелі та відкриває проксі в типовому вебоглядачі. Ви можете створювати в інформаційній панелі ресурси Kubernetes, такі як Deployment і Service.</p>
Щоб дізнатися, як уникнути безпосереднього запуску вебоглядача з термінала й отримати URL вебінтерфейсу інформаційної панелі, дивіться вкладку «Скопіювати та вставити URL».
Типово інформаційна панель доступна лише з внутрішньої віртуальної мережі Kubernetes. Команда dashboard створює тимчасовий проксі, щоб інформаційна панель стала доступною ззовні віртуальної мережі Kubernetes.
Щоб зупинити проксі, натисніть Ctrl+C для виходу з процесу. Після завершення команди інформаційна панель продовжує працювати в кластері Kubernetes. Ви можете знову виконати команду dashboard, щоб створити інший проксі для доступу до інформаційної панелі.
Якщо ви не хочете, щоб minikube відкривав вебоглядач за вас, виконайте підкоманду dashboard з прапорцем --url. minikube виведе URL, який ви можете відкрити у вебоглядачі на свій вибір.
Відкрийте новий термінал і виконайте:
# Запустіть новий термінал та залиште його працювати.minikube dashboard --url
Тепер ви можете скористатися цим URL і повернутися до термінала, де ви запустили minikube start.
Створення Deployment
Pod у Kubernetes — це група з одного або декількох контейнерів, що обʼєднані разом з метою адміністрування і роботи в мережі. У цьому навчальному посібнику Pod має лише один контейнер. Kubernetes Deployment перевіряє стан вашого Podʼа і перезапускає контейнер Podʼа, якщо контейнер перестає працювати. Створювати і масштабувати Podʼи рекомендується за допомогою Deploymentʼів.
За допомогою команди kubectl create створіть Deployment, який керуватиме Podʼом. Pod запускає контейнер на основі наданого образу Docker.
# Запустіть тестовий образ контейнера, який містить вебсерверkubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.53 -- /agnhost netexec --http-port=8080
Перегляньте інформацію про Deployment:
kubectl get deployments
У виводі ви побачите подібну інформацію:
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 1m
(Може знадобитися деякий час, поки Pod стане доступним. Якщо ви бачите «0/1», спробуйте ще раз за кілька секунд.)
Перегляньте інформацію про Pod:
kubectl get pods
У виводі ви побачите подібну інформацію:
NAME READY STATUS RESTARTS AGE
hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m
Перегляньте події кластера:
kubectl get events
Перегляньте конфігурацію kubectl:
kubectl config view
Перегляньте логи застосунку для контейнера в Podʼі (замініть імʼя Podʼа на те, яке ви отримали з kubectl get pods).
Примітка
Замініть hello-node-5f76cf6ccf-br9b5 у команді kubectl logs на імʼя Podʼа з виводу команди kubectl get pods.
kubectl logs hello-node-5f76cf6ccf-br9b5
У виводі ви побачите подібну інформацію:
I0911 09:19:26.677397 1 log.go:195] Started HTTP server on port 8080
I0911 09:19:26.677586 1 log.go:195] Started UDP server on port 8081
Типово Pod доступний лише за внутрішньою IP-адресою в межах кластера Kubernetes. Для того, щоб контейнер hello-node став доступний за межами віртуальної мережі Kubernetes, Pod необхідно відкрити як Service Kubernetes.
Попередження
Контейнер agnhost має точку доступу /shell, яка корисна для налагодження, але її небезпечно відкривати для доступу з публічного інтернету. Не запускайте його в кластері, доступному з інтернету, або в промисловому кластері.
Відкрийте Pod для публічного доступу з інтернету за допомогою команди kubectl expose:
Прапорець --type=LoadBalancer вказує, що ви хочете відкрити доступ до Service за межами кластера.
Код застосунку в тестовому образі прослуховує лише TCP-порт 8080. Якби ви використали kubectl expose, щоб відкрити інший порт, клієнти не змогли б підʼєднатися до цього іншого порту.
Перегляньте інформацію про створений вами Service:
kubectl get services
У виводі ви побачите подібну інформацію:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node LoadBalancer 10.108.144.78 <pending> 8080:30369/TCP 21s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23m
Для хмарних провайдерів, що підтримують балансувальники навантаження, для доступу до Service буде надано зовнішню IP-адресу. У minikube тип LoadBalancer робить Service доступним через команду minikube service.
Виконайте наступну команду:
minikube service hello-node
Це відкриє вікно вебоглядача, яке обслуговує ваш застосунок і показує його відповідь.
Увімкнення надбудов
Інструмент minikube містить набір вбудованих надбудов, які можна увімкнути, вимкнути і відкрити в локальному середовищі Kubernetes.
Перегляньте перелік наразі підтримуваних надбудов:
Дізнайтесь про кластери Kubernetes та створіть простий кластер за допомогою Minikube.
3 - Розгортання застосунку
4 - Вивчення застосунку
5 - Налаштування
6 - Stateless-застосунки
7 - Безпека
Безпека є важливою темою для більшості організацій і людей, які запускають кластери Kubernetes. Базовий список перевірки безпеки можна знайти в іншому місці документації Kubernetes.
Щоб дізнатися, як розгортати аспекти безпеки Kubernetes і керувати ними, ви можете пройти посібники з цього розділу.
7.1 - Застосування Стандартів безпеки Podʼів на рівні простору імен
Примітка
Цей посібник призначено лише для нових кластерів.
Pod Security Admission — це контролер допуску, який застосовує Стандарти безпеки Podʼів під час створення Podʼів. Ця можливість загальнодоступна (GA) з v1.25. У цьому посібнику ви примусово застосуєте Стандарт безпеки Podʼів baseline, по одному простору імен за раз.
Creating cluster "psa-ns-level" ...
✓ Ensuring node image (kindest/node:v1.37.0) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-psa-ns-level"
You can now use your cluster with:
kubectl cluster-info --context kind-psa-ns-level
Not sure what to do next? 😅 Check out https://kind.sigs.k8s.io/docs/user/quick-start/
Встановіть контекст kubectl для нового кластера:
kubectl cluster-info --context kind-psa-ns-level
Вивід буде подібний до цього:
Kubernetes control plane is running at https://127.0.0.1:50996
CoreDNS is running at https://127.0.0.1:50996/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Створення простору імен
Створіть новий простір імен з назвою example:
kubectl create ns example
Вивід буде подібний до цього:
namespace/example created
Увімкнення перевірки Стандартів безпеки Podʼів для цього простору імен
Увімкніть Стандарти безпеки Podʼів у цьому просторі імен за допомогою міток, які підтримує вбудований Pod Security Admission. На цьому кроці ви налаштуєте перевірку, яка попереджатиме про Podʼи, що не відповідають останній версії стандарту безпеки Podʼів baseline.
kubectl label --overwrite ns example \
pod-security.kubernetes.io/warn=baseline \
pod-security.kubernetes.io/warn-version=latest
Ви можете налаштувати кілька перевірок стандартів безпеки Podʼів для будь-якого простору імен за допомогою міток. Ця команда застосовуватиме (enforce) Стандарт безпеки Podʼів baseline, а для Стандартів безпеки Podʼів restricted за останньою версією (стандартне значення) виконуватиме warn і audit
Перевірка примусового застосування Стандарту безпеки Podʼів
Створіть Pod рівня baseline у просторі імен example:
kubectl apply -n example -f https://k8s.io/examples/security/example-baseline-pod.yaml
Pod запускається успішно; вивід містить попередження. Наприклад:
Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
pod/nginx created
Створіть Pod рівня baseline у просторі імен default:
Налаштування примусового застосування Стандартів безпеки Podʼів і попереджень застосовано лише до простору імен example. Ви могли б створити такий самий Pod у просторі імен default без жодних попереджень.
Очищення
Тепер видаліть кластер, який ви створили вище, виконавши цю команду:
kind delete cluster --name psa-ns-level
Що далі
Виконайте скрипт оболонки, щоб виконати всі попередні кроки за один раз:
Створіть кластер kind.
Створіть новий простір імен.
Застосуйте Стандарт безпеки Podʼів baseline у режимі enforce, водночас застосувавши Стандарт безпеки Podʼів restricted у режимах warn і audit.
Створіть новий Pod, до якого застосовано такі стандарти безпеки Podʼів
8 - Відкриття доступу до застосунку за межами кластера
9 - Застосунки зі станом
9.1 - Приклад: Розгортання WordPress та MySQL з постійними томами
У цьому посібнику ви дізнаєтеся, як розгорнути сайт WordPress та базу даних MySQL за допомогою Minikube. Обидва застосунки використовують PersistentVolumes та PersistentVolumeClaims для зберігання даних.
PersistentVolume (PV) — це частина сховища в кластері, яку вручну надав адміністратор або динамічно надав Kubernetes за допомогою StorageClass. PersistentVolumeClaim (PVC) — це запит користувача на сховище, який може бути задоволений за допомогою PV. PersistentVolume і PersistentVolumeClaim не залежать від життєвого циклу Podʼів і зберігають дані під час перезапуску, перепланування та навіть видалення Podʼів.
Увага
Це розгортання не підходить для промислового використання, оскільки використовує одноекземплярні Podʼи WordPress і MySQL. Для розгортання WordPress у промисловому середовищі розгляньте використання WordPress Helm Chart.
Примітка
Файли, наведені в цьому посібнику, використовують GA API Deployment і призначені для Kubernetes версії 1.9 і новіших. Якщо ви хочете скористатися цим посібником з ранішою версією Kubernetes, відповідно оновіть версію API або зверніться до попередніх версій цього посібника.
Цілі
Створення PersistentVolumeClaim і PersistentVolume
Створення kustomization.yaml з
генератором Secret
конфігураціями ресурсів MySQL
конфігураціями ресурсів WordPress
Застосування теки kustomization за допомогою kubectl apply -k ./
Очищення
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Створення PersistentVolumeClaim і PersistentVolume
Кожному з MySQL і Wordpress потрібен PersistentVolume для зберігання даних. Їхні PersistentVolumeClaim буде створено на етапі розгортання.
У багатьох кластерних середовищах встановлено стандартний StorageClass. Якщо StorageClass не вказано в PersistentVolumeClaim, натомість використовується стандартний StorageClass кластера.
Коли створюється PersistentVolumeClaim, PersistentVolume динамічно надається на основі конфігурації StorageClass.
Увага
У локальних кластерах стандартний StorageClass використовує provisioner hostPath. Томи hostPath підходять лише для розробки та тестування. З томами hostPath ваші дані зберігаються в /tmp на вузлі, на який заплановано Pod, і не переміщуються між вузлами. Якщо Pod припиняє існування й переплановується на інший вузол кластера або вузол перезавантажується, дані втрачаються.
Примітка
Якщо ви запускаєте кластер, якому потрібен provisioner hostPath, у компоненті controller-manager має бути встановлено прапорець --enable-hostpath-provisioner.
Примітка
Якщо у вас є кластер Kubernetes, що працює в Google Kubernetes Engine, дотримуйтесь цього посібника.
Створення файлу kustomization.yaml
Додавання генератора Secret
Secret — це обʼєкт, який зберігає чутливі дані, такі як паролі або ключі. Починаючи з версії 1.14, kubectl підтримує керування обʼєктами Kubernetes за допомогою файлу kustomization. Ви можете створити Secret за допомогою генераторів у файлі kustomization.yaml.
Додайте генератор Secret у файл kustomization.yaml за допомогою цієї команди. Вам потрібно буде замінити YOUR_PASSWORD на пароль, який ви хочете використовувати.
Додавання конфігурацій ресурсів для MySQL і WordPress
Наведений нижче маніфест описує одноекземплярний Deployment MySQL. Контейнер MySQL монтує PersistentVolume у /var/lib/mysql. Змінна середовища MYSQL_ROOT_PASSWORD задає пароль бази даних із Secret.
Наведений нижче маніфест описує одноекземплярний Deployment WordPress. Контейнер WordPress монтує PersistentVolume у /var/www/html для файлів даних вебсайту. Змінна середовища WORDPRESS_DB_HOST задає імʼя Service MySQL, визначеного вище, і WordPress звертатиметься до бази даних через цей Service. Змінна середовища WORDPRESS_DB_PASSWORD задає пароль бази даних із Secret, згенерованого kustomize.
Файл kustomization.yaml містить всі ресурси для розгортання сайту WordPress та бази даних MySQL. Ви можете застосувати цю теку командою
kubectl apply -k ./
Тепер ви можете перевірити, що всі обʼєкти існують.
Перевірте, що Secret існує, виконавши цю команду:
kubectl get secrets
Відповідь має бути подібною до цієї:
NAME TYPE DATA AGE
mysql-pass-c57bb4t7mf Opaque 1 9s
Перевірте, що PersistentVolume було динамічно надано.
kubectl get pvc
Примітка
Надання та привʼязка PV можуть тривати кілька хвилин.
Відповідь має бути подібною до цієї:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s
wp-pv-claim Bound pvc-8cd0df54-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s
Перевірте, що Pod працює, виконавши цю команду:
kubectl get pods
Примітка
Може минути кілька хвилин, перш ніж статус Podʼа стане RUNNING.
Відповідь має бути подібною до цієї:
NAME READY STATUS RESTARTS AGE
wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s
Перевірте, що Service працює, виконавши цю команду:
kubectl get services wordpress
Відповідь має бути подібною до цієї:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress LoadBalancer 10.0.0.89 <pending> 80:32406/TCP 4m
Примітка
Minikube може відкривати доступ до Service лише через NodePort. EXTERNAL-IP завжди перебуває в стані pending.
Виконайте цю команду, щоб отримати IP-адресу Service WordPress:
minikube service wordpress --url
Відповідь має бути подібною до цієї:
http://1.2.3.4:32406
Скопіюйте IP-адресу та відкрийте сторінку в браузері, щоб переглянути свій сайт.
Ви повинні побачити сторінку налаштування WordPress, схожу на знімок екрана нижче.
Увага
Не залишайте встановлення WordPress на цій сторінці. Якщо інший користувач її знайде, він може налаштувати вебсайт на вашому екземплярі й використовувати його для поширення шкідливого вмісту.
Або встановіть WordPress, створивши імʼя користувача та пароль, або видаліть свій екземпляр.
Очищення
Виконайте цю команду, щоб видалити ваш Secret, Deployment, Service і PersistentVolumeClaim: