Архипов Денис
План вебинара
kind: Pod
apiVersion: v1
metadata:
name: myapp-pod # имя пода
spec:
containers:
- name: container1 # имя контейнера
image: myregistry.ru/myimage1:1.0 # образ
ports:
- containerPort: 80 # сетевой доступ
protocol: "TCP"
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
Спасибо за внимание!
Вопросы?