Фото Іана Тейлора на Unsplash
Вступ:
- Цей блог призначений для початківців, які хочуть зрозуміти Kubernetes, а також для тих, хто готується до складання сертифікаційного іспиту CKA і хоче освіжити свої знання з основних концепцій та команд перед тестуванням своїх навичок. Це не заміна офіційних курсів. Уся надана інформація черпається з KodeKloud Labs та курсу “Prepare for the Certified Kubernetes Administrator Certification with Live Practice Tests Right in Your Browser — CKA” від Mumshad Mannambeth.
1. Основні концепції та огляд
Огляд Kubernetes: Kubernetes автоматизує розгортання, масштабування та керування контейнеризованими додатками. Він дозволяє створювати кілька екземплярів додатка в кластері.
Компоненти кластера:
- Компоненти майстра: kube-apiserver, controller manager, кластер ETCD, kube-scheduler
- Компоненти робочих вузлів: kubelet, kube-proxy, Container Runtime Engine
- ETCD: база даних для зберігання ключ-значення, яка зберігає інформацію, таку як вузли, Pods, конфігурації, секрети, акаунти, ролі, зв'язки тощо.
Об'єкти Kubernetes:
У цьому розділі я дам вам найбільш важливі об'єкти, які використовуються в Kubernetes або найпоширеніші, хоча є й багато інших об'єктів, таких як Job, CronJob, DaemonSet… але ці є найбільш використовуваними.
- Pods:
- Найменша одиниця розгортання в Kubernetes.
- Може містити один або більше контейнерів.
- Створюється за допомогою YAML визначень або імперативних команд.
- Загальні команди:
kubectl run --image= -l :
kubectl get pods -o wide
kubectl describe pod
kubectl edit pod
kubectl replace -f
kubectl scale --replicas= pod/
2. ReplicaSets:
- Забезпечує постійну кількість ідентичних Pods.
- Використовує мітки для ідентифікації та керування Pods.
- Загальні команди:
kubectl create -f
kubectl get replicasets
kubectl delete replicaset
kubectl replace -f
kubectl scale --replicas= replicaset/
kubectl describe replicaset
3. Deployments:
- Абстракція вищого рівня, що керує ReplicaSets.
- Дозволяє здійснювати декларативні оновлення та відкат додатків.
- Загальні команди:
kubectl create -f
kubectl get deployments
kubectl create deployment --replicas= --image=
kubectl delete deployment
kubectl replace -f
kubectl scale --replicas= deployment/
kubectl describe deployment
kubectl rollout status deployment/
kubectl rollout history deployment/
kubectl rollout undo deployment/
4. Services:
- Забезпечує комунікацію всередині кластера або з зовнішніми клієнтами.
- Типи включають:
- NodePort
- ClusterIP
- LoadBalancer
- Загальні команди:
kubectl create -f
kubectl get services
kubectl expose pod --port= --name
kubectl describe service
kubectl delete service
# Приклад служби NodePort
---
apiVersion: v1
kind: Service
metadata:
name: webapp-service
namespace: default
spec:
ports:
- nodePort: 30080
port: 8080
targetPort: 8080
selector:
name: simple-webapp
type: NodePort
~
**5.
Фото Іана Тейлора на Unsplash
Вступ:
- Цей блог створений для початківців, які хочуть зрозуміти Kubernetes, а також для тих, хто готується до складання сертифікаційного іспиту CKA і хоче освіжити свої знання з основних концепцій та команд перед тестуванням своїх навичок. Це не заміна офіційних курсів. Уся надана інформація надихнута KodeKloud Labs та курсом “Prepare for the Certified Kubernetes Administrator Certification with Live Practice Tests Right in Your Browser — CKA” від Mumshad Mannambeth.
1. Основні концепції та огляд
Огляд Kubernetes: Kubernetes автоматизує розгортання, масштабування та керування контейнеризованими додатками. Він дозволяє створювати кілька екземплярів додатка в кластері.
Компоненти кластера:
- Компоненти майстра: kube-apiserver, controller manager, кластер ETCD, kube-scheduler
- Компоненти робочих вузлів: kubelet, kube-proxy, Container Runtime Engine
- ETCD: база даних зберігання ключ-значення, яка містить інформацію, таку як вузли, Pods, конфігурації, секрети, акаунти, ролі, зв'язки тощо.
Об'єкти Kubernetes:
У цьому розділі я представлю вам найбільш важливі об'єкти, які використовуються в Kubernetes або найпоширеніші. Існує багато інших об'єктів, таких як Job, CronJob, DaemonSet…, але ці є найбільш використовуваними.
- Pods:
- Найменша одиниця розгортання в Kubernetes.
- Може містити один або більше контейнерів.
- Створюється за допомогою YAML визначень або імперативних команд.
- Загальні команди:
kubectl run --image= -l :
kubectl get pods -o wide
kubectl describe pod
kubectl edit pod
kubectl replace -f
kubectl scale --replicas= pod/
2. ReplicaSets:
- Забезпечують, щоб в будь-який час працювала задана кількість ідентичних Pods.
- Використовують мітки для ідентифікації та керування Pods.
- Загальні команди:
kubectl create -f
kubectl get replicasets
kubectl delete replicaset
kubectl replace -f
kubectl scale --replicas= replicaset/
kubectl describe replicaset
3. Deployments:
- Абстракція вищого рівня, яка керує ReplicaSets.
- Дозволяє здійснювати декларативні оновлення та відкат додатків.
- Загальні команди:
kubectl create -f
kubectl get deployments
kubectl create deployment --replicas= --image=
kubectl delete deployment
kubectl replace -f
kubectl scale --replicas= deployment/
kubectl describe deployment
kubectl rollout status deployment/
kubectl rollout history deployment/
kubectl rollout undo deployment/
4. Services:
- Забезпечують комунікацію всередині кластера або з зовнішніми клієнтами.
- Типи включають:
- NodePort
- ClusterIP
- LoadBalancer
- Загальні команди:
kubectl create -f
kubectl get services
kubectl expose pod --port= --name
kubectl describe service
kubectl delete service
# Приклад служби NodePort
---
apiVersion: v1
kind: Service
metadata:
name: webapp-service
namespace: default
spec:
ports:
- nodePort: 30080
port: 8080
targetPort: 8080
selector:
name: simple-webapp
type: NodePort
~
5.
**Namespaces:
- Логічні розділи в кластері для організації та ізоляції ресурсів.
- Загальні команди:
kubectl create namespace
kubectl get namespaces
kubectl get ns --no-headers | wc -l #щоб дізнатися кількість namespaces
kubectl get --all-namespaces #отримати всі сервіси в усіх namespaces
kubectl delete namespace
#якщо хочете отримати доступ до ресурсу з іншим namespace: db-service.dev.svc.cluster.local
6. ConfigMap:
- Використовується для зберігання не чутливої конфігураційної інформації у вигляді пар ключ-значення.
- Загальні команди:
kubectl create configmap --from-literal=key=value
kubectl get configmaps
kubectl describe configmap
kubectl delete configmap
7. Secret:
- Використовується для зберігання чутливої інформації, такої як паролі або API ключі, в безпечний спосіб.
- Загальні команди:
kubectl create secret generic --from-literal=key=value
kubectl get secrets
kubectl describe secret
kubectl delete secret
8. PersistentVolume (PV):
- Надає ресурси зберігання в межах кластера.
- Загальні команди:
kubectl create -f
kubectl get pv
kubectl describe pv
kubectl delete pv
9. PersistentVolumeClaim (PVC):
- Запитує ресурси зберігання від PersistentVolumes.
- Загальні команди:
kubectl create -f
kubectl get pvc
kubectl describe pvc
kubectl delete pvc
10. Ingress:
- Керує зовнішнім доступом HTTP/HTTPS до сервісів в кластері.
- Може обробляти маршрутизацію, SSL термінацію та балансування навантаження.
- Загальні команди:
kubectl create -f
kubectl get ingress
kubectl describe ingress
kubectl delete ingress
11. ServiceAccount:
- Надає ідентичність процесам, що працюють у Pod, для взаємодії з Kubernetes API.
- Загальні команди:
kubectl create serviceaccount
kubectl get serviceaccounts
kubectl describe serviceaccount
kubectl delete serviceaccount
12. Role:
- Визначає дозволи в межах конкретного namespace.
- Загальні команди:
kubectl create role --verb= --resource=
kubectl get roles
kubectl describe role
kubectl delete role
13. ClusterRole:
- Визначає дозволи по всьому кластеру.
- Загальні команди:
kubectl create clusterrole --verb= --resource=
kubectl get clusterroles
kubectl describe clusterrole
kubectl delete clusterrole
14. RoleBinding:
- Прив'язує Role до ServiceAccount в межах конкретного namespace.
- Загальні команди:
kubectl create rolebinding --role= --serviceaccount=:
kubectl get rolebindings
kubectl describe rolebinding
kubectl delete rolebinding
15. ClusterRoleBinding:
- Прив'язує ClusterRole до ServiceAccount або користувача по всьому кластеру.
- Загальні команди:
kubectl create clusterrolebinding --clusterrole= --serviceaccount=:
kubectl get clusterrolebindings
kubectl describe clusterrolebinding
kubectl delete clusterrolebinding
16. Resource Quota:
- Обмежує споживання ресурсів (наприклад, CPU, пам'ять) в межах namespaces.
- Загальні команди:
kubectl create -f
kubectl get resourcequota
kubectl describe resourcequota
kubectl delete resourcequota
Декларативний та імперативний підхід:
Імперативний: надає конкретні інструкції.
Декларативний: вказує бажаний стан.
Використовуйте
— dry-run=client -o yaml
для тестування.
Namespaces:
- Логічні розділи в кластері для організації та ізоляції ресурсів.
- Загальні команди:
kubectl create namespace
kubectl get namespaces
kubectl get ns --no-headers | wc -l #щоб дізнатися кількість namespaces
kubectl get --all-namespaces #отримати всі сервіси в усіх namespaces
kubectl delete namespace
#якщо хочете отримати доступ до ресурсу з іншим namespace: db-service.dev.svc.cluster.local
6. ConfigMap:
- Використовується для зберігання не чутливої конфігураційної інформації у вигляді пар ключ-значення.
- Загальні команди:
kubectl create configmap --from-literal=key=value
kubectl get configmaps
kubectl describe configmap
kubectl delete configmap
7. Secret:
- Використовується для зберігання чутливої інформації, такої як паролі або API ключі, в безпечний спосіб.
- Загальні команди:
kubectl create secret generic --from-literal=key=value
kubectl get secrets
kubectl describe secret
kubectl delete secret
8. PersistentVolume (PV):
- Надає ресурси зберігання в межах кластера.
- Загальні команди:
kubectl create -f
kubectl get pv
kubectl describe pv
kubectl delete pv
9. PersistentVolumeClaim (PVC):
- Запитує ресурси зберігання від PersistentVolumes.
- Загальні команди:
kubectl create -f
kubectl get pvc
kubectl describe pvc
kubectl delete pvc
10. Ingress:
- Керує зовнішнім доступом HTTP/HTTPS до сервісів в кластері.
- Може обробляти маршрутизацію, SSL термінацію та балансування навантаження.
- Загальні команди:
kubectl create -f
kubectl get ingress
kubectl describe ingress
kubectl delete ingress
11. ServiceAccount:
- Надає ідентичність процесам, що працюють у Pod (Pod), для взаємодії з Kubernetes API.
- Загальні команди:
kubectl create serviceaccount
kubectl get serviceaccounts
kubectl describe serviceaccount
kubectl delete serviceaccount
12. Role:
- Визначає дозволи в межах конкретного namespace.
- Загальні команди:
kubectl create role --verb= --resource=
kubectl get roles
kubectl describe role
kubectl delete role
13. ClusterRole:
- Визначає дозволи по всьому кластеру.
- Загальні команди:
kubectl create clusterrole --verb= --resource=
kubectl get clusterroles
kubectl describe clusterrole
kubectl delete clusterrole
14. RoleBinding:
- Прив'язує Role до ServiceAccount в межах конкретного namespace.
- Загальні команди:
kubectl create rolebinding --role= --serviceaccount=:
kubectl get rolebindings
kubectl describe rolebinding
kubectl delete rolebinding
15. ClusterRoleBinding:
- Прив'язує ClusterRole до ServiceAccount або користувача по всьому кластеру.
- Загальні команди:
kubectl create clusterrolebinding --clusterrole= --serviceaccount=:
kubectl get clusterrolebindings
kubectl describe clusterrolebinding
kubectl delete clusterrolebinding
16. Resource Quota:
- Обмежує споживання ресурсів (наприклад, CPU, пам'ять) в межах namespaces.
- Загальні команди:
kubectl create -f
kubectl get resourcequota
kubectl describe resourcequota
kubectl delete resourcequota
Декларативний та імперативний підхід:
Імперативний: надає конкретні інструкції.
Декларативний: вказує бажаний стан.
Використовуйте
— dry-run=client -o yaml
для тестування.
Наприклад:kubectl create deployment elasticsearch — image=registry.k8s.io/fluentd-elasticsearch:1.20 -n kube-system — dry-run=client -o yaml > fluentd.yaml
2. Планування:
Планування в Kubernetes означає процес, за допомогою якого контрольна плата Kubernetes вибирає підходящий вузол для запуску Pod. Цей процес гарантує, що навантаження будуть розміщені на вузлах таким чином, щоб вони відповідали вимогам щодо ресурсів і політик.
- Мітки та Селектори:
Пари ключ-значення, прикріплені до об'єктів Kubernetes (наприклад, Pods, вузлів або сервісів).
apiVersion: v1
kind: Pod
metadata:
labels:
app: web
environment: production
matchLables :
app: App1
function: front-end
spec:
containers:
- name: web-app
image: nginx
kubectl get pods -l app=web,environment=production
kubectl get pods --selector env=dev
kubectl get all --selector env=prod --no-headers | wc -l
2. Тейни та Толерантності:
Тейни (Taints) застосовуються до вузлів для відштовхування конкретних Pods. Толерантності (Tolerations) дозволяють Pods терпимо ставитися до цих тейнів і бути розміщеними на позначених вузлах.
apiVersion: v1
kind: Pod
metadata:
name: tolerant-pod
spec:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
containers:
- name: app
image: nginx
kubectl taint nodes key=value:NoSchedule
kubectl describe node kubemaster | grep Taint
kubectl describe node | grep taint
kubectl taint node node01 spray=mortein:NoSchedule
3. Селектори Вузлів:
Селектори вузлів дозволяють Pods запускатися лише на вузлах, що відповідають певним міткам, обмежуючи Pods лише до конкретних вузлів.
apiVersion: v1
kind: Pod
metadata:
name: memory-intensive-pod
spec:
nodeSelector:
hardware: high-memory
size: Large
containers:
- name: app
image: nginx
kubectl label nodes node1 size=Large
- Прив'язка до Вузлів (Node Affinity):
Прив'язка до вузлів (Node Affinity) — це більш розширена версія селекторів вузлів. Вона дозволяє створювати м'які (бажані) та жорсткі (обов'язкові) правила для розміщення Pods на вузлах.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: Exists
operator: Not in
values:
- Small
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
- Вимоги до ресурсів:
Вимоги до ресурсів вказують мінімальні та максимальні значення CPU та пам'яті, які необхідні для ефективного виконання Pod.
Кожен вузол має певну кількість ресурсів: CPU та пам'ять (MEM).
Kubernetes використовує "CPU" як абстракційну одиницю. Коли Kubernetes взаємодіє з основним апаратним забезпеченням, він відображає 1 CPU
на:
- Один апаратний гіперпоток на фізичному процесорі (якщо використовуються сервери без віртуалізації).
- Один віртуальний ядро, якщо використовується віртуалізована платформа (AWS, GCP, Azure).
apiVersion: v1
kind: Pod
metadata:
name: resource-pod
spec:
containers:
- name: app
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- Статичні Pods:
Статичні Pods керуються безпосередньо kubelet на конкретному вузлі без необхідності API-сервера. Вони визначені у файлі на вузлі і ідеально підходять для критичних компонентів кластера, таких як etcd
або kube-apiserver
.
apiVersion: v1
kind: Pod
metadata:
name: static-pod
spec:
containers:
- name: app
image: nginx
- DaemonSet:
DaemonSet у Kubernetes гарантує, що Pod буде запущено на всіх (або деяких) вузлах кластера.
Наприклад:
kubectl create deployment elasticsearch — image=registry.k8s.io/fluentd-elasticsearch:1.20 -n kube-system — dry-run=client -o yaml > fluentd.yaml
2. Планування:
Планування в Kubernetes означає процес, за допомогою якого контрольна плата Kubernetes вибирає підходящий вузол для запуску Pod. Цей процес гарантує, що навантаження будуть розміщені на вузлах таким чином, щоб вони відповідали вимогам щодо ресурсів і політик.
- Мітки та Селектори:
Пари ключ-значення, прикріплені до об'єктів Kubernetes (наприклад, Pods, вузлів або сервісів).
apiVersion: v1
kind: Pod
metadata:
labels:
app: web
environment: production
matchLables :
app: App1
function: front-end
spec:
containers:
- name: web-app
image: nginx
kubectl get pods -l app=web,environment=production
kubectl get pods --selector env=dev
kubectl get all --selector env=prod --no-headers | wc -l
2. Тейни та Толерантності:
Тейни (Taints) застосовуються до вузлів для відштовхування конкретних Pods. Толерантності (Tolerations) дозволяють Pods терпимо ставитися до цих тейнів і бути розміщеними на позначених вузлах.
apiVersion: v1
kind: Pod
metadata:
name: tolerant-pod
spec:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
containers:
- name: app
image: nginx
kubectl taint nodes key=value:NoSchedule
kubectl describe node kubemaster | grep Taint
kubectl describe node | grep taint
kubectl taint node node01 spray=mortein:NoSchedule
3. Селектори Вузлів:
Селектори вузлів дозволяють Pods запускатися лише на вузлах, що відповідають певним міткам, обмежуючи Pods лише до конкретних вузлів.
apiVersion: v1
kind: Pod
metadata:
name: memory-intensive-pod
spec:
nodeSelector:
hardware: high-memory
size: Large
containers:
- name: app
image: nginx
kubectl label nodes node1 size=Large
- Прив'язка до Вузлів (Node Affinity):
Прив'язка до вузлів (Node Affinity) — це більш розширена версія селекторів вузлів. Вона дозволяє створювати м'які (бажані) та жорсткі (обов'язкові) правила для розміщення Pods на вузлах.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: Exists
operator: Not in
values:
- Small
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
- Вимоги до ресурсів:
Вимоги до ресурсів вказують мінімальні та максимальні значення CPU та пам'яті, які необхідні для ефективного виконання Pod.
Кожен вузол має певну кількість ресурсів: CPU та пам'ять (MEM).
Kubernetes використовує "CPU" як абстракційну одиницю. Коли Kubernetes взаємодіє з основним апаратним забезпеченням, він відображає 1 CPU
на:
- Один апаратний гіперпоток на фізичному процесорі (якщо використовуються сервери без віртуалізації).
- Один віртуальний ядро, якщо використовується віртуалізована платформа (AWS, GCP, Azure).
apiVersion: v1
kind: Pod
metadata:
name: resource-pod
spec:
containers:
- name: app
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- Статичні Pods:
Статичні Pods керуються безпосередньо kubelet на конкретному вузлі без необхідності API-сервера. Вони визначені у файлі на вузлі і ідеально підходять для критичних компонентів кластера, таких як etcd
або kube-apiserver
.
apiVersion: v1
kind: Pod
metadata:
name: static-pod
spec:
containers:
- name: app
image: nginx
- DaemonSet:
DaemonSet у Kubernetes гарантує, що Pod буде запущено на всіх (або деяких) вузлах кластера.
Зазвичай використовується для розгортання фонових сервісів, таких як агенти моніторингу, збирачі логів або мережеві утиліти, які повинні працювати на кожному вузлі.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
spec:
selector:
matchLaabels:
app: monitoring-agent
template:
metadata:
labels:
app: monitoring-agent
spec:
containers:
- name: fluentd-elastic
image: monitoring-agent
якщо не хочете, щоб це було на кожному вузлі, використовуйте nodeSelector.
Поради:
- якщо Pods не працюють і знаходяться в стані "pending", перевірте pod планувальника.
- додайте nodeName до spec, щоб вручну призначити pod на вузол.
- щоб отримати всі pods, які мають мітки, використовуйте
kubectl get all --selector env=prod,bu=finance,tier=frontend
. - щоб видалити тейн, додайте — в кінці команди, наприклад,
kubectl taint node controlplane node-role.kubernetes.io/controlplane:NoSchedule-
. - прив'язка до вузлів (Affinity) для розгортання повинна бути під
spec.template.spec
.
3. Логування та Моніторинг:
Моніторинг компонентів кластера Kubernetes включає перевірку стану та продуктивності критичних частин кластера, таких як контрольна плата (control plane), вузли (nodes) та застосунки (applications).
Сюди входять такі дані, як кількість вузлів у кластері, скільки pods працюють і є здоровими, а також показники продуктивності, такі як CPU, пам'ять (memory), мережа (network), диск (disk IO) тощо.
# створити pod metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl top node (показники продуктивності для вузла)
kubectl top pod (показники продуктивності для pod)
docker logs -f
kubectl logs webapp-2 -c
kubectl get events --sort-by='.metadata.creationTimestamp'
4. Управління життєвим циклом застосунку:
Це процес управління повним життєвим циклом застосунку, розгорнутого на кластері Kubernetes.
- Поетапні оновлення, відкат та версії:
kubectl apply -f deployment.yaml (створюється нова ревізія розгортання)
kubectl set image deployment/ = або kubectl apply
kubectl rollout status (перевірка стану оновлень)
kubectl rollout history (перегляд версій оновлень)
У Kubernetes є дві основні стратегії оновлень: RollingUpdate (за замовчуванням) та Recreate.
strategy:
type: RollingUpdate
Для розгортання є наступні стратегії:
RollingUpdate:
Оновлює pods поступово, забезпечуючи високу доступність під час оновлення.-
Recreate:
Видаляє всі існуючі pods перед створенням нових. -
Змінні середовища (Environment Variables):
Змінні середовища можна визначати в Kubernetes за допомогою простих пар "ключ-значення", ConfigMap або Secrets.
#### Просте значення ключ-значення
env:
- name: APP_COLOR
value: pink
### ConfigMap
ConfigMaps використовуються для зберігання незахищених даних конфігурації.
#### Налаштування ConfigMap в застосунку
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app-config.properties: |
database.url=jdbc:mysql://localhost:3306/mydatabase
database.username=myuser
database.password=mypassword
kubectl create -f configmap.yaml
kubectl create configmap webapp-config-map --from-literal=APP_COLOR=darkblue --from-literal=APP_OTHER=disregard
#### Вставити ConfigMap у pod:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
envFrom:
- configMapRef:
name: app-config
### Secrets
Secrets використовуються для безпечного зберігання чутливих даних.
**Зазвичай використовується для розгортання фонових сервісів, таких як агенти моніторингу, збирачі логів або мережеві утиліти, які повинні працювати на кожному вузлі.**
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
spec:
selector:
matchLaabels:
app: monitoring-agent
template:
metadata:
labels:
app: monitoring-agent
spec:
containers:
- name: fluentd-elastic
image: monitoring-agent
```
якщо не хочете, щоб це було на кожному вузлі, використовуйте nodeSelector.
Поради:
- якщо pods не працюють і знаходяться в стані "pending", перевірте pod планувальника (scheduler pod).
- додайте nodeName до spec, щоб вручну призначити pod на вузол.
- щоб отримати всі pods, які мають мітки, використовуйте
kubectl get all --selector env=prod,bu=finance,tier=frontend
. - щоб видалити тейн, додайте — в кінці команди, наприклад,
kubectl taint node controlplane node-role.kubernetes.io/controlplane:NoSchedule-
. - прив'язка до вузлів (Affinity) для розгортання повинна бути під
spec.template.spec
.
3. Логування та Моніторинг:
Моніторинг компонентів кластера Kubernetes включає перевірку стану та продуктивності критичних частин кластера, таких як контрольна плата (control plane), вузли (nodes) та застосунки (applications).
Сюди входять такі дані, як кількість вузлів у кластері, скільки pods працюють і є здоровими, а також показники продуктивності, такі як CPU, пам'ять (memory), мережа (network), диск (disk IO) тощо.
# створити pod metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl top node (показники продуктивності для вузла)
kubectl top pod (показники продуктивності для pod)
docker logs -f
kubectl logs webapp-2 -c
kubectl get events --sort-by='.metadata.creationTimestamp'
4. Управління життєвим циклом застосунку:
Це процес управління повним життєвим циклом застосунку, розгорнутого на кластері Kubernetes.
- Поетапні оновлення, відкат та версії:
kubectl apply -f deployment.yaml (створюється нова ревізія розгортання)
kubectl set image deployment/ = або kubectl apply -f (поетапне оновлення)
kubectl rollout undo deployment/ (відкат)\
kubectl rollout status (перевірка стану оновлень)
kubectl rollout history (перегляд версій оновлень)
У Kubernetes є дві основні стратегії оновлень: RollingUpdate (за замовчуванням) та Recreate.
strategy:
type: RollingUpdate
Для розгортання є наступні стратегії:
RollingUpdate:
Оновлює pods поступово, забезпечуючи високу доступність під час оновлення.-
Recreate:
Видаляє всі існуючі pods перед створенням нових. -
Змінні середовища (Environment Variables):
Змінні середовища можна визначати в Kubernetes за допомогою простих пар "ключ-значення", ConfigMap або Secrets.
#### Просте значення ключ-значення
env:
- name: APP_COLOR
value: pink
### ConfigMap
ConfigMaps використовуються для зберігання незахищених даних конфігурації.
#### Налаштування ConfigMap в застосунку
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app-config.properties: |
database.url=jdbc:mysql://localhost:3306/mydatabase
database.username=myuser
database.password=mypassword
kubectl create -f configmap.yaml
kubectl create configmap webapp-config-map --from-literal=APP_COLOR=darkblue --from-literal=APP_OTHER=disregard
#### Вставити ConfigMap у pod:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
envFrom:
- configMapRef:
name: app-config
### Secrets
Secrets використовуються для безпечного зберігання чутливих даних.
**#### Створення Secret (секрету)**
apiVersion: v1
kind: Secret
metadata:
name: app-secret
data:
DBHost: mysql
DBUser: root
DB_Password: paswrd
```
kubectl create secret generic db-secret --from-literal=DBHost=sql01 --from-literal=DBUser=root --from-literal=DB_Password=password123
Використання Secret у Pod
apiVersion: v1
kind: Pod
metadata:
labels:
name: webapp-pod
name: webapp-pod
namespace: default
spec:
containers:
- image: kodekloud/simple-webapp-mysql
imagePullPolicy: Always
name: webapp
envFrom:
- secretRef:
name: db-secret
3. Масштабування застосунку:
kubectl scale deployment my-app --replicas=5
## або у yaml файлі
spec:
replicas: 5
4. Pods з кількома контейнерами
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
name:simple-webapp
spec:
containers:
- name: simple-webapp
image: simple-webapp
ports:
- containerPort: 8080
- name: log-agent
image: log agent
~~
### Init Container
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
```
Команди:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-sleeper-3
spec:
containers:
- name: ubuntu
image: ubuntu
command:
- "sleep"
- "1200"
# або
apiVersion: v1
kind: Pod
metadata:
name: command-demo
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
restartPolicy: OnFailure
Команди у pod завжди перекривають команду в Docker образі.
5. Технічне обслуговування кластера:
- Як виконати обслуговування вузла:
- крок 1: Виконати drain для вузла kubectl drain
- крок 2: Здійснити оновлення ОС або обслуговування вузла.
- крок 3: Перевірити систему.
- крок 4: Дозволити планування робочих навантажень на вузлі знову kubectl uncordon.
2. Випуски Kubernetes (версії програмного забезпечення):
Kubernetes використовує структуровану систему версіонування для керування випусками:
- Основні випуски (Major Releases) (vX): Впроваджують значні зміни, включаючи ламаючі оновлення та нові функції.
- Маленькі випуски (Minor Releases) (vX.Y): Включають нові функціональності та покращення. Випускаються, як правило, кожні кілька місяців.
- Випуски патчів (Patch Releases) (vX.Y.Z): Зосереджуються на виправленнях помилок та незначних покращеннях для забезпечення стабільності.
#### Створення Secret (секрету)
apiVersion: v1
kind: Secret
metadata:
name: app-secret
data:
DB_Host: mysql
DB_User: root
DB_Password: paswrd
kubectl create secret generic db-secret --from-literal=DBHost=sql01 --from-literal=DBUser=root --from-literal=DB_Password=password123
Використання Secret у Pod
apiVersion: v1
kind: Pod
metadata:
labels:
name: webapp-pod
name: webapp-pod
namespace: default
spec:
containers:
- image: kodekloud/simple-webapp-mysql
imagePullPolicy: Always
name: webapp
envFrom:
- secretRef:
name: db-secret
3. Масштабування застосунку:
kubectl scale deployment my-app --replicas=5
## або у yaml файлі
spec:
replicas: 5
4. Pods з кількома контейнерами
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
name:simple-webapp
spec:
containers:
- name: simple-webapp
image: simple-webapp
ports:
- containerPort: 8080
- name: log-agent
image: log agent
~~
### Init Container
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
```
Команди:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-sleeper-3
spec:
containers:
- name: ubuntu
image: ubuntu
command:
- "sleep"
- "1200"
# або
apiVersion: v1
kind: Pod
metadata:
name: command-demo
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
restartPolicy: OnFailure
Команди у pod завжди перекривають команду в Docker образі.
5. Технічне обслуговування кластера:
- Як виконати обслуговування вузла:
- крок 1: Виконати drain для вузла kubectl drain
- крок 2: Здійснити оновлення ОС або обслуговування вузла.
- крок 3: Перевірити систему.
- крок 4: Дозволити планування робочих навантажень на вузлі знову kubectl uncordon.
2. Випуски Kubernetes (версії програмного забезпечення):
Kubernetes використовує структуровану систему версіонування для керування випусками:
- Основні випуски (Major Releases) (vX): Впроваджують значні зміни, включаючи ламаючі оновлення та нові функції.
- Маленькі випуски (Minor Releases) (vX.Y): Включають нові функціональності та покращення. Випускаються, як правило, кожні кілька місяців.
- Випуски патчів (Patch Releases) (vX.Y.Z): Зосереджуються на виправленнях помилок та незначних покращеннях для забезпечення стабільності.
Процес оновлення кластера:
Кожен компонент Kubernetes (наприклад, kube-apiserver
, kube-controller-manager
, kube-proxy
) має свою власну версію, що узгоджена з циклом випуску Kubernetes.
Оновлення компонентів Kubernetes виконується у такому порядку:
- Компоненти Control Plane: Почніть з
kube-apiserver
, потім оновлюйтеkube-controller-manager
іkube-scheduler
. - Etcd (якщо самостійно керується): Оновлюється після оновлення control plane.
- Компоненти на вузлах: Оновіть
kubelet
іkube-proxy
на робочих вузлах.
Правило: Завжди оновлюйте одну малу версію за раз (наприклад, з 1.25 до 1.26) і перевіряйте сумісність перед оновленням до наступної версії.
- Ключові кроки для
kubeadm upgrade
:
# Перевірка сумісності поточної версії:
kubeadm upgrade plan
# Оновлення Control Plane:
kubeadm upgrade apply
# Оновлення kubelet та kubectl:
apt-get install -y kubelet= kubectl=
systemctl restart kubelet
# Оновлення робочих вузлів:
# дренування вузлів :
kubectl drain --ignore-daemonsets --delete-emptydir-data
# оновлення робочих вузлів :
apt-get upgrade -y kubeadm=
apt-get upgrade -y kubelet=
kubeadm upgrade node config - kubelet-version
systemctl restart kubelet
# розблокування робочих вузлів :
kubectl uncordon
4. Методи резервного копіювання та відновлення:
- Резервне копіювання конфігурації ресурсів:
kubectl get all --all-namespaces > all-deploy-services.yaml
- Резервне копіювання та відновлення даних etcd:
# Резервне копіювання даних etcd
ETCDCTL_API=3 etcdctl snapshot save snapshot.db
ETCDCTL_API=3 etcdctl snapshot status snapshot.db
# Відновлення даних etcd
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
--data-dir /var/lib/etcd \
--name default.local
# Створення резервної копії etcd (Ця команда необхідна для виробничих середовищ, де комунікація з etcd зашифрована і застосовується автентифікація. Це забезпечує безпечний доступ до кластеру etcd.)
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /opt/snapshot-pre-boot.db
- Керування кластером:
# Перегляд кластерів:
kubectl config get-clusters
kubectl config view
# Перемикання між кластерами:
kubectl config use-context
# Перевірка типу розгортання etcd:
# Якщо pods etcd працюють поруч з іншими системними pod'ами (наприклад, kube-apiserver), то це стекована конфігурація.
kubectl get pods -n kube-system
kubectl describe pod kube-apiserver-node -n kube-system | grep etcd
Як kubectl взаємодіє з кластерами
Інструмент командного рядка
kubectl
спілкується з API сервером Kubernetes через HTTP запити.API сервер є основною точкою управління кластером, обробляючи запити, перевіряючи їх та оновлюючи стан кластера.
Контекст у Kubernetes: Контекст поєднує кластер, користувача та простір імен. Використовуйте команду
kubectl config use-context
, щоб перемикатися між контекстами.
Трюки:
- Іноді ви не можете виконати дренування деяких вузлів для обслуговування, оскільки ці pod'и не керуються контролером (наприклад, Deployment, ReplicaSet, StatefulSet, чи DaemonSet).
- Щоб зробити вузол не запланованим, використовуйте команду cordon: kubectl cordon
- Щоб побачити версію etcd, перегляньте логи або опис pod і подивіться на Image.
- Якщо вам потрібно знайти, за якою адресою можна звертатися до кластеру ETCD, опишіть pod etcd і подивіться на параметр — listen-client-urls.
- Сертифікат сервера ETCD знаходиться в — cert-file.
- Для відновлення etcd використовуйте команду ETCDCTL_API=3 etcdctl — data-dir /var/lib/etcd-from-backup \
snapshot restore /opt/snapshot-pre-boot.db, а потім змініть
- hostPath:
path: /var/lib/etcd-from-backup
type: DirectoryOrCreate
name: etcd-data
в /etc/kubernetes/manifests/etcd.yaml
6. Безпека:
1.
Процес оновлення кластера:
Кожен компонент Kubernetes (наприклад, kube-apiserver
, kube-controller-manager
, kube-proxy
) має свою власну версію, узгоджену з циклом випуску Kubernetes.
Оновлення компонентів Kubernetes відбувається в такому порядку:
- Компоненти Control Plane: Почніть з
kube-apiserver
, потім оновлюйтеkube-controller-manager
іkube-scheduler
. - Etcd (якщо керується самостійно): Оновіть після оновлення control plane.
- Компоненти на вузлах: Оновіть
kubelet
іkube-proxy
на робочих вузлах.
Правило: Завжди оновлюйте одну малу версію за раз (наприклад, з 1.25 до 1.26) і перевіряйте сумісність перед оновленням до наступної версії.
- Ключові кроки для
kubeadm upgrade
:
# Перевірка сумісності поточної версії:
kubeadm upgrade plan
# Оновлення Control Plane:
kubeadm upgrade apply
# Оновлення kubelet і kubectl:
apt-get install -y kubelet= kubectl=
systemctl restart kubelet
# Оновлення робочих вузлів:
# дренування вузлів :
kubectl drain --ignore-daemonsets --delete-emptydir-data
# оновлення робочих вузлів :
apt-get upgrade -y kubeadm=
apt-get upgrade -y kubelet=
kubeadm upgrade node config - kubelet-version
systemctl restart kubelet
# розблокування робочих вузлів :
kubectl uncordon
4. Методи резервного копіювання та відновлення:
- Резервне копіювання конфігурації ресурсів:
kubectl get all --all-namespaces > all-deploy-services.yaml
- Резервне копіювання та відновлення даних etcd:
# Резервне копіювання даних etcd
ETCDCTL_API=3 etcdctl snapshot save snapshot.db
ETCDCTL_API=3 etcdctl snapshot status snapshot.db
# Відновлення даних etcd
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
--data-dir /var/lib/etcd \
--name default.local
# Створення резервної копії etcd (Ця команда необхідна для виробничих середовищ, де комунікація з etcd зашифрована і застосовується автентифікація. Це забезпечує безпечний доступ до кластеру etcd.)
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /opt/snapshot-pre-boot.db
- Керування кластером:
# Перегляд кластерів:
kubectl config get-clusters
kubectl config view
# Перемикання між кластерами:
kubectl config use-context
# Перевірка типу розгортання etcd:
# Якщо pods etcd працюють поруч з іншими системними pod'ами (наприклад, kube-apiserver), то це стекована конфігурація.
kubectl get pods -n kube-system
kubectl describe pod kube-apiserver-node -n kube-system | grep etcd
Як kubectl взаємодіє з кластерами
Інструмент командного рядка
kubectl
спілкується з API сервером Kubernetes через HTTP запити.API сервер є основною точкою управління кластером, обробляючи запити, перевіряючи їх та оновлюючи стан кластера.
Контекст у Kubernetes: Контекст поєднує кластер, користувача та простір імен. Використовуйте команду
kubectl config use-context
, щоб перемикатися між контекстами.
Трюки:
- Іноді ви не можете виконати дренування деяких вузлів для обслуговування, оскільки ці pod'и не керуються контролером (наприклад, Deployment, ReplicaSet, StatefulSet чи DaemonSet).
- Щоб зробити вузол незапланованим, використовуйте команду cordon: kubectl cordon
- Щоб побачити версію etcd, перегляньте логи або опис pod і подивіться на Image.
- Якщо вам потрібно знайти адресу, за якою можна звертатися до кластера ETCD, опишіть pod etcd і подивіться на параметр — listen-client-urls.
- Сертифікат сервера ETCD знаходиться в — cert-file.
- Для відновлення etcd використовуйте команду ETCDCTL_API=3 etcdctl — data-dir /var/lib/etcd-from-backup \
snapshot restore /opt/snapshot-pre-boot.db, а потім змініть
- hostPath:
path: /var/lib/etcd-from-backup
type: DirectoryOrCreate
name: etcd-data
в /etc/kubernetes/manifests/etcd.yaml
6. Безпека:
1.
Примітиви безпеки:
Щоб забезпечити безпеку хоста Kubernetes:
- Вимкніть доступ root.
- Вимкніть аутентифікацію за допомогою пароля.
- Дозвольте лише аутентифікацію за допомогою SSH-ключів.
2. Доступність (хто може отримати доступ до кластера):
Методи аутентифікації:
- Ідентифікатор користувача/пароль (не рекомендується).
- Ім'я користувача та токени.
- Сертифікати.
- Інтеграція з LDAP.
TLS Сертифікати:
- Визначення: Забезпечує, що комунікація між клієнтом і сервером зашифрована за допомогою TLS.
- Асиметричне шифрування:
- Дані шифруються за допомогою публічного ключа та дешифруються за допомогою приватного ключа.
- Приклад: Використання
ssh-keygen
для генерації пар ключів для доступу через SSH.
Основні поняття:
- Публічні ключі зберігаються в файлах, таких як
.cert
або.pem
. - Приватні ключі зберігаються в файлах, таких як
.key
або-key.pem
. - Сертифікати та ключі керуються в межах PKI (Інфраструктура відкритих ключів).
TLS Сертифікати в Kubernetes:
API Server:
apiserver.cert
таapiserver.key
.etcd:
etcdserver.cert
таetcdserver.key
.Kubelet:
kubelet.cert
таkubelet.key
.Сертифікати клієнтів:
kubeproxy.cert
таkubeproxy.key
.
controller-manager.cert
таcontroller-manager.key
.
scheduler.cert
таscheduler.key
.
admin.cert
таadmin.key
.
- Моделі авторизації:
- RBAC (Role-Based Access Control):
Зв'язує користувачів/групи з конкретними ролями та дозволами.
1.
Примітиви безпеки:
Щоб забезпечити безпеку хоста Kubernetes:
- Вимкніть доступ root.
- Вимкніть аутентифікацію за допомогою пароля.
- Дозвольте лише аутентифікацію за допомогою SSH-ключів.
2. Доступність (хто може отримати доступ до кластера):
Методи аутентифікації:
- Ідентифікатор користувача/пароль (не рекомендується).
- Ім'я користувача та токени.
- Сертифікати.
- Інтеграція з LDAP.
TLS Сертифікати:
- Визначення: Забезпечує, що комунікація між клієнтом і сервером зашифрована за допомогою TLS.
- Асиметричне шифрування:
- Дані шифруються за допомогою публічного ключа та дешифруються за допомогою приватного ключа.
- Приклад: Використання
ssh-keygen
для генерації пар ключів для доступу через SSH.
Основні поняття:
- Публічні ключі зберігаються в файлах, таких як
.cert
або.pem
. - Приватні ключі зберігаються в файлах, таких як
.key
або-key.pem
. - Сертифікати та ключі керуються в межах PKI (Інфраструктура відкритих ключів).
TLS Сертифікати в Kubernetes:
API Server:
apiserver.cert
таapiserver.key
.etcd:
etcdserver.cert
таetcdserver.key
.Kubelet:
kubelet.cert
таkubelet.key
.Сертифікати клієнтів:
kubeproxy.cert
таkubeproxy.key
.
controller-manager.cert
таcontroller-manager.key
.
scheduler.cert
таscheduler.key
.
admin.cert
таadmin.key
.
- Моделі авторизації:
- RBAC (Role-Based Access Control):
Зв'язує користувачів/групи з конкретними ролями та дозволами.
1.
Інші моделі:
Авторизація вузлів.
ABAC (Attribute-Based Access Control — Контроль доступу на основі атрибутів).
Webhook авторизація.
- Управління сертифікатами в Kubernetes
Запити на підписання сертифікатів (CSR):
CSR — це запит до CA (Certificate Authority — Центр сертифікації) для видачі сертифікату.
kubectl get csr
kubectl certificate approve
kubectl certificate deny
# за допомогою YAML реалізації (декларативно)
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: my-client-cert
spec:
request:
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
# створити і затвердити сертифікат
kubectl create -f my-client-cert.yaml
kubectl certificate approve my-client-cert
RBAC в Kubernetes:
- Визначте ролі та призначайте їх за допомогою RoleBindings.
- Ролі можуть бути специфічними для простору імен або глобальними (ClusterRoles).
kubectl get roles
kubectl get rolebinding
# Роль кластеру
kubectl get clusterroles
kubectl get clusterrolebinding
Облікові записи служб
- Облікові записи користувачів: Адміни, розробники тощо.
- Облікові записи служб: Використовуються автоматизованими інструментами, такими як Jenkins або Prometheus.
kubectl create serviceaccount dashboard-sa
kubectl get serviceaccount
kubectl create token dashboard-sa
Безпека зображень
Забезпечте доступ до контейнерних зображень за допомогою секретів Docker registry:
kubectl create secret docker-registry myregistrykey \
--docker-server= \
--docker-username= \
--docker-password= \
--docker-email=
Мережеві політики:
Мережеві політики в Kubernetes — це набір правил, які контролюють потік трафіку між Pods і іншими мережевими кінцевими точками.
kubectl get networkpolicies.networking.k8s.io
# Приклад мережевої політики:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: internal-policy
namespace: default
spec:
podSelector:
matchLabels:
name: internal
policyTypes:
- Egress
- Ingress
ingress:
- {}
egress:
- to:
- podSelector:
matchLabels:
name: mysql
ports:
- protocol: TCP
port: 3306
- to:
- podSelector:
matchLabels:
name: payroll
ports:
- protocol: TCP
port: 8080
- ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
Трюки:
- щоб знайти сертифікат для об'єкта в Kubernetes, потрібно перейти в папку з визначенням і використати команду
cat
для YAML файлу. Наприклад, для kubeapi server використовуйтеcat /etc/kubernetes/manifests/kube-apiserver.yaml
. - команда
openssl x509 -in /path/to/certificate.crt -noout -text
використовується для перегляду та перевірки деталей сертифіката X.509 у зручному для людини форматі. - шлях за замовчуванням до файлу kubeconfig:
~/.kube/config
. - переглянути кількість кластерів:
kubectl config view
. - режим авторизації в pod
kube-apiserver-controlplane
. - Role: Використовується для дозволів у конкретному просторі імен.
- ClusterRole: Використовується для дозволів у всіх просторах імен кластеру або для ресурсів, що охоплюють увесь кластер.
- RoleBinding та ClusterRoleBinding: Використовуються для асоціації користувачів, груп або облікових записів служб з Role або ClusterRole.
- Кожен простір імен має обліковий запис служби за замовчуванням, який автоматично асоціюється з Pods, якщо не вказаний інший обліковий запис служби.
7. Зберігання в Kubernetes:
1.
Інші моделі:
Авторизація вузлів.
ABAC (Attribute-Based Access Control — Контроль доступу на основі атрибутів).
Webhook авторизація.
- Управління сертифікатами в Kubernetes
Запити на підписання сертифікатів (CSR):
CSR — це запит до CA (Certificate Authority — Центр сертифікації) для видачі сертифікату.
kubectl get csr
kubectl certificate approve
kubectl certificate deny
# за допомогою YAML реалізації (декларативно)
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: my-client-cert
spec:
request:
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
# створити і затвердити сертифікат
kubectl create -f my-client-cert.yaml
kubectl certificate approve my-client-cert
RBAC в Kubernetes:
- Визначте ролі та призначайте їх за допомогою RoleBindings.
- Ролі можуть бути специфічними для простору імен або глобальними (ClusterRoles).
kubectl get roles
kubectl get rolebinding
# Роль кластеру
kubectl get clusterroles
kubectl get clusterrolebinding
Облікові записи служб
- Облікові записи користувачів: Адміни, розробники тощо.
- Облікові записи служб: Використовуються автоматизованими інструментами, такими як Jenkins або Prometheus.
kubectl create serviceaccount dashboard-sa
kubectl get serviceaccount
kubectl create token dashboard-sa
Безпека зображень
Забезпечте доступ до контейнерних зображень за допомогою секретів Docker registry:
kubectl create secret docker-registry myregistrykey \
--docker-server= \
--docker-username= \
--docker-password= \
--docker-email=
Мережеві політики:
Мережеві політики в Kubernetes — це набір правил, які контролюють потік трафіку між Pods і іншими мережевими кінцевими точками.
kubectl get networkpolicies.networking.k8s.io
# Приклад мережевої політики:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: internal-policy
namespace: default
spec:
podSelector:
matchLabels:
name: internal
policyTypes:
- Egress
- Ingress
ingress:
- {}
egress:
- to:
- podSelector:
matchLabels:
name: mysql
ports:
- protocol: TCP
port: 3306
- to:
- podSelector:
matchLabels:
name: payroll
ports:
- protocol: TCP
port: 8080
- ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
Трюки:
- щоб знайти сертифікат для об'єкта в Kubernetes, потрібно перейти в папку з визначенням і використати команду
cat
для YAML файлу. Наприклад, для kubeapi server використовуйтеcat /etc/kubernetes/manifests/kube-apiserver.yaml
. - команда
openssl x509 -in /path/to/certificate.crt -noout -text
використовується для перегляду та перевірки деталей сертифіката X.509 у зручному для людини форматі. - шлях за замовчуванням до файлу kubeconfig:
~/.kube/config
. - переглянути кількість кластерів:
kubectl config view
. - режим авторизації в pod
kube-apiserver-controlplane
. - Role: Використовується для дозволів у конкретному просторі імен.
- ClusterRole: Використовується для дозволів у всіх просторах імен кластеру або для ресурсів, що охоплюють увесь кластер.
- RoleBinding та ClusterRoleBinding: Використовуються для асоціації користувачів, груп або облікових записів служб з Role або ClusterRole.
- Кожен простір імен має обліковий запис служби за замовчуванням, який автоматично асоціюється з Pods, якщо не вказаний інший обліковий запис служби.
7. Зберігання в Kubernetes:
1.
Зберігання в Docker:
Docker пропонує різні варіанти зберігання для керування даними між контейнерами.
Каталоги файлової системи:
Docker зберігає дані в наступних каталогах:
/var/lib/docker
: Головний каталог для зберігання Docker./aufs
: Сховище, яке використовує драйвер AUFS (якщо застосовно)./containers
: Дані, специфічні для контейнерів./images
: Сховище для зображень контейнерів./volumes
: Сховище для томів Docker./data_volume
: Сховище для об'ємів, визначених користувачем.
Типи монтувань:spec.vo
- Volume Mount (іменоване монтування): Використовує томи Docker для зберігання сталих даних.
- Bind Mount: Монтує каталог із хост-системи в контейнер.
# bind mount
docker run -v /data/mysql:/var/lib/mysql mysql
# volume mount або іменоване монтування
docker run -v db:/var/lib/mysql mysql
- Томах Kubernetes:
У Kubernetes томи використовуються для керування сталим зберіганням.
# HostPath Volume: Монтує файл або каталог з файлової системи хост-ноута в pod.
volumeMounts:
- mountPath: /foo
name: example-volume
readOnly: true
volumes:
- name: example-volume
hostPath:
path: /data/foo
type: Directory
# AWS Elastic Block Store (EBS): Для сталого зберігання за допомогою томів AWS EBS.
volumes:
- name: data-volume
awsElasticBlockStore:
volumeID:
fsType: ext4
3. Постійні томи (PV) і запити на постійні томи (PVC):
# PV — це фактичні ресурси зберігання в кластері.
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 500Mi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /mnt/data
# PVC — це запити на зберігання, які подаються pods. Вони зв'язуються з доступними PV для зберігання.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
# зв'язати pod з PVC
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- mountPath: /data
name: data-volume
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: myclaim
5. Класи зберігання:
StorageClass у Kubernetes — це шаблон конфігурації для динамічного створення Persistent Volumes (PV). Він визначає тип зберігання (наприклад, SSD, HDD), постачальника (наприклад, AWS EBS, Azure Disk) та параметри, як-от розмір або рівень продуктивності.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: delayed-volume-sc
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
Трюки:
- якщо режими доступу в PV і PVC не однакові, вони не будуть приєднуватися.
- після видалення PVC і pod, який був прив'язаний до цього PVC, PV буде в стані "release", а не "pending".
8. Мережі:
- Мережі Linux:
- Перемикання (Switching): Осуществляет зв'язок всередині тієї ж локальної мережі (LAN) через MAC-адреси.
- Перемикання в Linux дозволяє здійснювати зв'язок всередині однієї LAN, створюючи міст інтерфейсів для зв'язку пристроїв на рівні MAC-адрес.
- Маршрутизація (Routing): Осуществляет зв'язок між різними мережами через IP-адреси.
- Маршрутизація в Linux здійснює підключення різних мереж, пересилаючи пакети між ними на основі їх IP-адрес.
- За замовчуванням шлюз (Default Gateway): Направляє трафік на невідомі адреси (за межі локальної мережі).
- За замовчуванням шлюз в Linux забезпечує маршрут трафіку на невідомі адреси (наприклад, Інтернет) до правильного upstream пристрою (зазвичай маршрутизатора).
Корисні команди:
ip link
: Керує мережевими інтерфейсами.ip addr
: Відображає або змінює IP-адреси.
У відображених IP-адресах можна знайти eth0, lo...
Зберігання в Docker:
Docker надає різноманітні варіанти зберігання для керування даними між контейнерами.
Каталоги файлової системи:
Docker зберігає дані в наступних каталогах:
/var/lib/docker
: Основний каталог для зберігання Docker./aufs
: Сховище, що використовує драйвер AUFS (якщо застосовно)./containers
: Дані, що належать конкретному контейнеру./images
: Сховище для зображень контейнерів./volumes
: Сховище для томів Docker./data_volume
: Сховище для об'ємів, визначених користувачем.
Типи монтувань:spec.vo
- Volume Mount (іменоване монтування): Використовує томи Docker для зберігання сталих даних.
- Bind Mount: Монтує каталог з хост-системи в контейнер.
# bind mount
docker run -v /data/mysql:/var/lib/mysql mysql
# volume mount або іменоване монтування
docker run -v db:/var/lib/mysql mysql
- Томах Kubernetes:
У Kubernetes томи використовуються для керування сталим зберіганням.
# HostPath Volume: Монтує файл або каталог з файлової системи хост-ноута в pod.
volumeMounts:
- mountPath: /foo
name: example-volume
readOnly: true
volumes:
- name: example-volume
hostPath:
path: /data/foo
type: Directory
# AWS Elastic Block Store (EBS): Для сталого зберігання за допомогою томів AWS EBS.
volumes:
- name: data-volume
awsElasticBlockStore:
volumeID:
fsType: ext4
3. Постійні томи (PV) і запити на постійні томи (PVC):
# PV — це фактичні ресурси зберігання в кластері.
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 500Mi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /mnt/data
# PVC — це запити на зберігання, які подаються pods. Вони зв'язуються з доступними PV для зберігання.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
# зв'язати pod з PVC
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- mountPath: /data
name: data-volume
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: myclaim
5. Класи зберігання:
StorageClass у Kubernetes — це шаблон конфігурації для динамічного створення Persistent Volumes (PV). Він визначає тип зберігання (наприклад, SSD, HDD), постачальника (наприклад, AWS EBS, Azure Disk) та параметри, такі як розмір або рівень продуктивності.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: delayed-volume-sc
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
Трюки:
- якщо режими доступу в PV і PVC не однакові, вони не приєднуються.
- після видалення PVC і pod, що був прив'язаний до цього PVC, PV буде в стані "release", а не "pending".
8. Мережі:
- Мережі Linux:
- Перемикання (Switching): Осуществляє зв'язок всередині однієї LAN за допомогою MAC-адрес.
- Перемикання в Linux дозволяє здійснювати зв'язок в одній LAN, створюючи міст інтерфейсів для зв'язку пристроїв на рівні MAC-адрес.
- Маршрутизація (Routing): Осуществляє зв'язок між різними мережами за допомогою IP-адрес.
- Маршрутизація в Linux забезпечує підключення різних мереж, пересилаючи пакети між ними на основі їх IP-адрес.
- За замовчуванням шлюз (Default Gateway): Направляє трафік на невідомі адреси (за межами локальної мережі).
- За замовчуванням шлюз в Linux гарантує, що трафік до невідомих адрес (наприклад, Інтернет) буде маршрутизовано до правильного upstream пристрою (зазвичай маршрутизатора).
Корисні команди:
ip link
: Керує мережевими інтерфейсами.ip addr
: Відображає або змінює IP-адреси.
У відображених IP-адресах можна знайти eth0, lo...
Це означає наступне:
lo
: Внутрішня комунікація (localhost).eth0
: Зв'язок з зовнішніми мережами.flannel.1
: Overlay-мережа Kubernetes для комунікації між pod на різних вузлах.cni0
: Міст для комунікації pod між собою в межах одного вузла.veth*
: Інтерфейси, що зв'язують pod з мережею вузла.ip addr add 192.168.1.10/24 dev eth0
: Призначення IP-адреси.ip route
: Керування маршрутами.ip route add 192.168.1.0/24 via 192.168.2.1
: Додавання маршруту.dig
іnslookup
для усунення неполадок з DNS.- Команда
netstat -nplt
— швидкий і потужний спосіб перевірити всі активні TCP порти, що прослуховуються, та програми, пов'язані з ними. ps -aux | grep kubelet | grep --color container-runtime-endpoint
: команда для отримання endpoint контейнера kubelet.
2. Мережа Docker:
Типи мереж Docker:
- None: Без мережі; контейнер ізольований.
- Host: Використовує мережевий стек хоста.
- Bridge: За замовчуванням; створює приватну віртуальну мережу для контейнерів.
Контейнери без мережі отримують мережу bridge за замовчуванням від Docker або Kubernetes.
Простір імен мережі для ізоляції мережевих ресурсів.
CNI (Container Network Interface):
- CNI використовується для налаштування мережевих інтерфейсів контейнерів.
- Kubernetes використовує плагіни CNI для забезпечення мережевої взаємодії pod.
3. Мережа Kubernetes:
Ми розгортаємо інструменти, такі як Weave Net, в Kubernetes або інших контейнеризованих середовищах для надання мережевих можливостей і з'єднаності для pod.
- Комунікація між pod: Забезпечує можливість зв'язку pod між собою на різних вузлах.
- Комунікація pod зі службами: Дозволяє pod доступати до служб, використовуючи стабільні кінцеві точки.
- Зв'язок з зовнішніми службами: Дозволяє зовнішнім клієнтам доступати до служб, що працюють у кластері.
Kubernetes слідує простій мережевій моделі:
- Кожен pod отримує унікальну IP-адресу.
- Pod можуть спілкуватися між собою без використання NAT (Network Address Translation).
- Контейнери в pod поділяють одну і ту саму мережеву простір імен.
Основні інструменти та компоненти для мережі Kubernetes:
- CNI (Container Network Interface):
- Керує мережею pod.
- Приклади: Calico, Flannel, Weave Net, Cilium.
2. Kube-Proxy:
- Реалізує мережу служб за допомогою керування правилами iptables або IPVS.
- Забезпечує маршрутизацію трафіку до правильного pod на основі конфігурації служби.
3. Мережеві політики (Network Policies):
- Керує потоком трафіку між pod за допомогою правил (наприклад, дозволити/блокувати трафік).
- Приклад інструментів для виконання: Calico, Cilium.
4. Ingress:
- Керує HTTP/S трафіком від зовнішніх клієнтів до служб у кластері.
- Ingress Controllers (наприклад, NGINX Ingress, Traefik, HAProxy) реалізують правила Ingress.
5. Служби (Services):
- Публікують групу pod як одну мережеву кінцеву точку.
-
Типи служб:
- ClusterIP: Внутрішня комунікація в межах кластера.
- NodePort: Публікує службу на статичному порту на кожному вузлі.
- LoadBalancer: Створює балансувальник навантаження в хмарі.
- ExternalName: Прив'язує службу до зовнішнього DNS-імені.
Ось що вони означають:
-
lo
: Внутрішня комунікація (localhost). -
eth0
: Зв'язок з зовнішніми мережами. -
flannel.1
: Overlay-мережа Kubernetes для комунікації між pod на різних вузлах. -
cni0
: Міст для комунікації pod між собою в межах одного вузла. -
veth*
: Інтерфейси, що зв'язують pod з мережею вузла. -
ip addr add 192.168.1.10/24 dev eth0
: Призначення IP-адреси. -
ip route
: Керування маршрутами. -
ip route add 192.168.1.0/24 via 192.168.2.1
: Додавання маршруту. -
dig
іnslookup
для усунення неполадок з DNS. -
Команда
netstat -nplt
— швидкий і потужний спосіб перевірити всі активні TCP порти, що прослуховуються, та програми, пов'язані з ними. -
ps -aux | grep kubelet | grep --color container-runtime-endpoint
: команда для отримання endpoint контейнера kubelet.
2. Мережа Docker:
Типи мереж Docker:
- None: Без мережі; контейнер ізольований.
- Host: Використовує мережевий стек хоста.
- Bridge: За замовчуванням; створює приватну віртуальну мережу для контейнерів.
Контейнери без мережі отримують мережу bridge за замовчуванням від Docker або Kubernetes.
Простір імен мережі для ізоляції мережевих ресурсів.
CNI (Container Network Interface):
- CNI використовується для налаштування мережевих інтерфейсів контейнерів.
- Kubernetes використовує плагіни CNI для забезпечення мережевої взаємодії pod.
3. Мережа Kubernetes:
Ми розгортаємо інструменти, такі як Weave Net, в Kubernetes або інших контейнеризованих середовищах для надання мережевих можливостей і з'єднаності для pod.
- Комунікація між pod: Забезпечує можливість зв'язку pod між собою на різних вузлах.
- Комунікація pod зі службами: Дозволяє pod доступати до служб, використовуючи стабільні кінцеві точки.
- Зв'язок з зовнішніми службами: Дозволяє зовнішнім клієнтам доступати до служб, що працюють у кластері.
Kubernetes слідує простій мережевій моделі:
- Кожен pod отримує унікальну IP-адресу.
- Pod можуть спілкуватися між собою без використання NAT (Network Address Translation).
- Контейнери в pod поділяють одну і ту саму мережеву простір імен.
Основні інструменти та компоненти для мережі Kubernetes:
- CNI (Container Network Interface):
- Керує мережею pod.
- Приклади: Calico, Flannel, Weave Net, Cilium.
2. Kube-Proxy:
- Реалізує мережу служб за допомогою керування правилами iptables або IPVS.
- Забезпечує маршрутизацію трафіку до правильного pod на основі конфігурації служби.
3. Мережеві політики (Network Policies):
- Керує потоком трафіку між pod за допомогою правил (наприклад, дозволити/блокувати трафік).
- Приклад інструментів для виконання: Calico, Cilium.
4. Ingress:
- Керує HTTP/S трафіком від зовнішніх клієнтів до служб у кластері.
- Ingress Controllers (наприклад, NGINX Ingress, Traefik, HAProxy) реалізують правила Ingress.
5. Служби (Services):
- Публікують групу pod як одну мережеву кінцеву точку.
- Типи служб:
- ClusterIP: Внутрішня комунікація в межах кластера.
- NodePort: Публікує службу на статичному порту на кожному вузлі.
- LoadBalancer: Створює балансувальник навантаження в хмарі.
- ExternalName: Прив'язує службу до зовнішнього DNS-імені.
Шлях до JSON (JSON Path):
JSONPath — потужна мова запитів, що використовується в Kubernetes для фільтрації та форматування результатів команд kubectl
.
Основи синтаксису:
.
: Доступ до дочірніх полів (наприклад,.metadata.name
).[]
: Індексація масиву (наприклад,.items[0].metadata.name
).[*]
: Вайлдкард для масивів (наприклад,.items[*].metadata.name
).@
: Відноситься до поточного об'єкта, який обробляється.{}
: Використовується для створення власних шаблонів виводу (наприклад,{.metadata.name}
).[?()]
: Фільтрує масив
Звичні сценарії використання:
# отримати вузли у форматі JSON
kubectl get nodes -o json
# отримати всі імена pod
kubectl get pods -o jsonpath='{.items[*].metadata.name}'
# Користувацькі стовпці
kubectl -n admin2406 get deployment -o custom-columns=DEPLOYMENT:.metadata.name,CONTAINER_IMAGE:.spec.template.spec.containers[].image,READY_REPLICAS:.status.readyReplicas,NAMESPACE:.metadata.namespace --sort-by=.metadata.name
kubectl get pods -o jsonpath='{range .items[*]}{"Name: "}{.metadata.name}{" Status: "}{.status.phase}{"\n"}{end}'
kubectl get pods -o jsonpath='{range .items[*]}{"Pod: "}{.metadata.name}{" | Environment: "}{.metadata.labels.env}{"\n"}{end}'
**Шлях до JSON (JSON Path):**
JSONPath — потужна мова запитів, що використовується в Kubernetes для фільтрації та форматування результатів команд `kubectl`.
## Основи синтаксису:
- `.`: Доступ до дочірніх полів (наприклад, `.metadata.name`).
- `[]`: Індексація масиву (наприклад, `.items[0].metadata.name`).
- `[*]`: Вайлдкард для масивів (наприклад, `.items[*].metadata.name`).
- `@`: Відноситься до поточного об'єкта, який обробляється.
- `{}`: Використовується для створення власних шаблонів виводу (наприклад, `{.metadata.name}`).
- `[?()]`: Фільтрує масив
Звичні сценарії використання:
отримати вузли у форматі JSON
kubectl get nodes -o json
отримати всі імена pod
kubectl get pods -o jsonpath='{.items[*].metadata.name}'
Користувацькі стовпці
kubectl -n admin2406 get deployment -o custom-columns=DEPLOYMENT:.metadata.name,CONTAINERIMAGE:.spec.template.spec.containers[].image,READYREPLICAS:.status.readyReplicas,NAMESPACE:.metadata.namespace --sort-by=.metadata.name
kubectl get pods -o jsonpath='{range .items[]}{"Name: "}{.metadata.name}{" Status: "}{.status.phase}{"\n"}{end}'
kubectl get pods -o jsonpath='{range .items[]}{"Pod: "}{.metadata.name}{" | Environment: "}{.metadata.labels.env}{"\n"}{end}'
Перекладено з: Kubernetes Essentials: Cheat Sheet for Beginners and Pros