Вы находитесь на странице: 1из 29

Знакомство с Kubernetes

Архипов Денис
План вебинара

1. Что такое k8s и для чего нужен k8s


2. Запуск в k8s простейшего приложения
3. Как кластер работает внутри
4. Запуск более сложных приложений
5. Основные инструменты
6. Преимущества и недостатки k8s
Что такое k8s
Набор серверов с API на входе
Что такое k8s
Набор серверов с API на входе
Зачем нужен k8s?
1. Обеспечить жизненный цикл приложений
Зачем еще нужен k8s?
2. Автоматизировать настройку инфраструктуры под нужды приложений
Внутри кластера
Pod
Базовый элемент и единственный способ запуска контейнера в k8s

kind: Pod
apiVersion: v1
metadata:
name: myapp-pod # имя пода
spec:
containers:
- name: container1 # имя контейнера
image: myregistry.ru/myimage1:1.0 # образ
ports:
- containerPort: 80 # сетевой доступ
protocol: "TCP"

kubectl apply -f pod.yaml


Внутри кластера
ReplicaSet
Поддерживает заданное количество реплик приложения

kind: ReplicaSet
apiVersion: apps/v1
metadata:
name: myapp-replicaset # имя
spec:
replicas: 3 # кол-во подов
selector:
matchLabels: # селектор, про него чуть позже
app: myapp
template: # это шаблон пода, который мы уже видели
metadata: # теперь здесь нет имени пода
labels:
app: myapp # про лейбл тоже чуть позже
spec:
containers:
- name: myapp-container
image: myregistry.ru/myimage:1.0
ports:
- containerPort: 80
protocol: "TCP"
Внутри кластера
Deployment

Реализует весь жизненный цикл приложения, в т. ч. обновление и его откат

kind: Deployment
apiVersion: apps/v1
metadata:
name: myapp-deployment # имя деплоймента
spec:
replicas: 3 # кол-во подов
selector:
matchLabels: # селектор, про него чуть позже
app: myapp
template: # это шаблон пода, который мы уже видели
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myregistry.ru:5000/myimage:1.0
ports:
- containerPort: 80
protocol: "TCP"
Стратегии обновлений Deployment
С простоем:

Бесшовная:
Внутри кластера
Внутри кластера
Как работают контроллеры
Как работают контроллеры
Pod и linux namespaces
Pod и cgroups

kind: Pod
apiVersion: v1
metadata:
name: myapp-pod
spec:
containers:
- name: container1
image: myregistry.ru/myimage:1.0
ports:
- containerPort: 80
protocol: "TCP"
resources: # блок про ресурсы
requests:
cpu: 200m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
Namespace

kind: Namespace
apiVersion: v1
metadata:
name: myapp1-namespace
Service
Балансирует соединения (не пакеты! и не запросы!)
Даёт нам постоянный IP

kind: Service
apiVersion: v1
metadata:
name: myapp-service
spec:
type: LoadBalancer # еще варианты NodePort и ClusterIP
selector:
app: myapp
ports:
- protocol: TCP
port: 80 # порт, по которому сервис виден снаружи
targetPort: 80 # порт целевых Pod
Инструменты
Helm
Helm

kind: Deployment
apiVersion: apps/v1
metadata:
name: myapp-deployment
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: myapp
replicas: 3
template: image: myapp
metadata: tag: 1.0.2
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myregistry.ru/{{ .Values.image }}:{{ .Values.tag }}
ports:
- containerPort: 80
protocol: "TCP"
Minikube
Выводы
Под капотом не страшно
Преимущества
 Стандартизация API
 Декларативное описание приложений и поддержание желаемого состояния
 Быстрая реакция на события
 Возможность действовать масштабно
 Снижение затрат на фоне ВМ:
⚫ накладные расходы гипервизоров (5-10% на нагруженных)
⚫ стоимость ПО для ВМ
⚫ холостое потребление ресурсов ВМ
⚫ выключение невостребованной нагрузки (автомасштабирование)
Минусы
 Высокий порог входа
 Дорогие специалисты
Познакомились с Kubernetes
Спасибо за внимание!
Вопросы?

Вам также может понравиться