Skip to content

Commit d88fe64

Browse files
committed
Add K8S Pods, Deployment parts and etc
1 parent a7bf833 commit d88fe64

1 file changed

Lines changed: 188 additions & 14 deletions

File tree

docker.md

Lines changed: 188 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -596,19 +596,19 @@ Ctrl+C для остановки контейнера
596596
Это платформа с открытым исходным кодом для развертывания, масштабирования, управления и контроля контейнеризованных приложений либо сервисов.
597597

598598
__Kubernetes делает следующее:__
599-
+ Управляет и запускает контейнеры
600-
+ Балансирует сетевой трафик между узлами кластера Kubernetes и количеством реплик контейнеров
601-
+ Осуществляет контроль состояния, автоматические развертывания и откаты реплик контейнеров внутри узлов кластера Kubernetes
602-
+ Осуществляет распределение нагрузки между узлами кластера Kubernetes
603-
+ Предоставляет автоматическое монтирование систем хранения для контейнеров
599+
+ Управляет и запускает контейнеры.
600+
+ Балансирует сетевой трафик между узлами кластера Kubernetes и количеством реплик контейнеров. Можно раскатить один образ на несколько Воркер нодов, получив разные IP порты и DNS имя, а кубер сделает Load Balancing между этими контейнерами
601+
+ Осуществляет контроль состояния, автоматические развертывания и откаты реплик контейнеров внутри узлов кластера Kubernetes.
602+
+ Осуществляет распределение нагрузки между узлами кластера Kubernetes. Например управление ресурсами при развертывания нового контейнера
603+
+ Предоставляет автоматическое монтирование систем хранения для контейнеров. Например прикрепить локальный или облачный диск к одному или нескольким докер контейнерам
604604
+ Предоставляет декларативный API и CLI для управления
605605
+ И еще множество полезных, и не очень, модулей и сервисов, которые можно развернуть для управления автоматизацией, инфраструктурой и контейнерами
606606

607607
__Kubernetes не делает следующее:__
608608
+ Не собирает контейнеры с исходным кодом вашего приложения или сервиса
609609
+ Не предоставляет процессы и решения непрерывной интеграции (CI)
610610
+ Не включает в себя решения и системы сбора журналов и метрик
611-
+ Не включает в себя решения и системы хранения данных
611+
+ Не включает в себя решения и системы хранения данных. Только подключение сторонних
612612
+ Не включает в себя решения и системы хранения контейнеров (registry)
613613
+ Не включает в себя решения и системы от всех бед и болячек инфраструктуры
614614

@@ -640,22 +640,28 @@ Kubernetes, так как он был реализован как облачно
640640

641641
Если вы решились ставить Kubernetes внутри, на своих собственных ресурсах, то вам придется позаботиться о развёртывании и обслуживании такой инфраструктуры вокруг кластера как: репозиторий для контейнеров, внешние или внутренние балансировщики, сетевые хранилища, хранилище секретов, решения для сбора логов и метрик. Также важна и внутренняя инфраструктура “кубера”: CertManager, Ingress, Istio и другие.
642642

643-
Сам кластер K8S состоит из рабочих узлов. В узлах или нодах (Nodes, Worker nodes), помимо контейнеров компонентов самого кластера, размещаются контейнеры наших проектов и сервисов.
643+
1) Основной компонент K8S состоит из __Кластера (Cluster)__
644644

645-
__Worker nodes__ состоит из компонентов:
645+
Сам кластер состоит из __узлов или нодах (Nodes)__, в которых помимо контейнеров компонентов самого кластера, размещаются контейнеры наших проектов и сервисов.
646+
647+
2) __Worker nodes__ - сервер, на котором запускаются и работают контейнеры
648+
649+
Состоит из компонентов:
646650

647651
+ kubelet - сервис или агент, который контролирует запуск компонентов (контейнеров) кластера
648652
+ kube-proxy - конфигурирует правила сети на узлах
649653

650-
Плоскость управления (__Master nodes__) управляет рабочими узлами и подами в кластере. Там располагаются компоненты, которые управляют узлами кластера и предоставляют доступ к API.
654+
3) Плоскость управления (__Master nodes__) управляет рабочими узлами и подами в кластере. Там располагаются компоненты, которые управляют узлами кластера и предоставляют доступ к API.
651655

652-
__Control plane__ состоит из компонентов:
656+
__Control plane__ или Kubernete Master, состоит из компонентов:
653657

654658
+ kube-apiserver - предоставляет API кубера
655-
+ etcd - распределенное key-value хранилище для всех данных кластера. Необязательно располагается внутри мастера, может стоять как отдельный кластер
656659
+ kube-scheduler - планирует размещение подов на узлах кластера
657660
+ kube-controller-manager - запускает контроллеры
658661
+ kubelet - сервис или агент, который контролирует запуск основных компонентов (контейнеров) кластер
662+
+ etcd - распределенное key-value хранилище для всех данных кластера. Необязательно располагается внутри мастера, может стоять как отдельный кластер
663+
664+
Когда запускаем команды управления они всегда посылаются именно на Master nodes. С воркер нодами напрямую не работаем.
659665

660666
__Виды контроллеров__
661667
+ Deployments - контроллер, который управляет состоянием развертывания подов, которое описывается в манифесте, следит за удалением и созданием экземпляров подов. Управляет контроллерами ReplicaSet.
@@ -667,6 +673,30 @@ __Виды контроллеров__
667673

668674
[к оглавлению](#Docker)
669675

676+
## Kubernet Cluster
677+
678+
Состоит минимум из одного (для непрерывной и безопасной работы может быть больше), Мастер нода. И минимум один Воркер нод (на практике их обычно больше)
679+
680+
В мастер ноде указываем откуда брать Docker Images (из Dockerhub, AWS Container Registry ECR, Google Container Registry, Azure Container Registry и тд). Контейнеры разворачиваются на воркер нодах, заполняя память и процессоры. Если ресурсов будет не хватать, кубер может предложить масштабироваться, добавив еще воркер нодов.
681+
```java
682+
//minikube исп для управления при локальном запуске. при работе с AWS, Google кластером и тд нужно использовать соответствующий кластер и систему управления
683+
minikube start -p NAME - запустить с нашим именем
684+
minikube start --cpus=2 --memory=4gb/4000mb --disk-size=20gb - с конкретными ресурсами
685+
minikube start --no-vtx-check - если ошибка и просить включить виртуализацию в биосе
686+
minikube ssh - зайти внутрь виртуальной машины (можно через VirtualBox)
687+
688+
689+
kubectl get componentstatuses - состояние кластера
690+
kubectl cluster-info - инфа о кластере
691+
kubectl get nodes
692+
kubectl version --client
693+
694+
```
695+
696+
Чтобы загрузить Докер образ в кластер нужно
697+
698+
[к оглавлению](#Docker)
699+
670700
## Kubectl
671701
При работе с кластером нам потребуется инструмент командной строки kubectl. https://Kubernetes.io/ru/docs/tasks/tools/install-kubectl/
672702

@@ -704,10 +734,154 @@ kubectl apply -f https://K8S.io/manifest - создать ресурсы из UR
704734

705735
[к оглавлению](#Docker)
706736

707-
## Компоненты и архитектура Kubernetes
737+
## Основные Обьекты Kubernetes
738+
739+
Контейнер не является обьектом K8S - это обьект Докера)
740+
741+
1) Pod - самый маленький обьект Кубера, который мы можем создать. Состоит из контейнера (обычно) или нескольких контейнеров (если надо). Чаще один, чтобы при масштабировании не плодить лишние копии
742+
2) Deployment - состоит из одного или нескольких одинаковых Подов, даже если в разных Нодах
743+
3) Service - дает доступ к Подам, которые в Деплое, через ClusterIP, NodePort, LoadBalancer, ExternalName
744+
4) Nodes - сервера, где все это работает
745+
5) Cluster - обьединение нодов
746+
747+
Т.е. расположены от меньше к большему и каждый следующий содержит предыдущие
708748

709749
[к оглавлению](#Docker)
710750

711-
## Компоненты и архитектура Kubernetes
751+
## Kubernetes Pods
712752

713-
[к оглавлению](#Docker)
753+
1) Запуск и управление из консоли
754+
755+
```java
756+
kubectl run name --image=imageName --port=80 - создание пода с именем name из образа imageName (если нет локально скачает с Докерхаба) на порту 80
757+
kubectl get pods - список Подов
758+
kubectl delete pods name - удалить Под с именем name
759+
kubectl describe pods name - описание Пода name. Нода, на которой он развернут, его IP внутри кластера, контейнеры внутри Пода, Volums, последние Events и много другой инфы
760+
kubectl exec name date - запустить команду в Поде, например date
761+
kubectl exec -it name sh - запустить команду в Поде, например sh - консоль, и остаться внутри Пода
762+
kubectl logs name - логи Пода name
763+
kubectl port-forward name 7788:80 - переносим с локального порта 7788 на порт 80 Пода name
764+
Ctrl+C - выйти из Пода
765+
```
766+
2) Для запуска из YML файла
767+
768+
Сам файл, например простой pod-my-web-ver1.yaml:
769+
```java
770+
apiVersion : v1
771+
kind: Pod
772+
metadata:
773+
name: my-web
774+
labels:
775+
env : prod
776+
app : main
777+
tier : fronted
778+
owner : Shell26
779+
spec:
780+
containers:
781+
- name : container-apache
782+
image: httpd:latest
783+
ports:
784+
- containerPort: 80
785+
786+
- name : container-api
787+
image: tomcat:8.5.38
788+
ports:
789+
- containerPort: 8080
790+
```
791+
И запускаем файл через консоль:
792+
```java
793+
kubectl apply -f ./pod-my-web-ver1.yaml
794+
```
795+
796+
Если изменили файл, убиваем старый Под собранный из файла и запускаем новый:
797+
```java
798+
kubectl delete -f ./pod-my-web-ver1.yaml
799+
kubectl apply -f ./pod-my-web-ver1.yaml
800+
```
801+
__Без удаления можно менять только поле image, иначе ошибка. Достаточно повторно запустить kubectl apply__
802+
803+
[к оглавлению](#Docker)
804+
805+
## Kubernetes Deployment
806+
807+
Если что-то случится с Кластером и Нода умерла, то Кластер перезапустит Ноды, но Поды автоматически не пересоберутся. Для этого Поды создают через Девелопмент, а он управляет Подами
808+
809+
1) Из консоли:
810+
```java
811+
kubectl create deployments name --image httpd:latest
812+
kubectl get deploy
813+
kubectl describe deployments name
814+
kubectl scale deployment name --replicas 4 - создаст 4 копии и ReplicaSet, раскидав копии по разным Нодам
815+
kubectl get rs - покажет ReplicaSet
816+
kubectl autoscale deployment name --min=4 --max=6 --cpu-percent=80 - автоматически масштабирует для загрузки cpu на 80 и создаст обьект HorizontalPodAutoscaler
817+
kubectl get hpa - покажет HorizontalPodAutoscaler
818+
kubectl rollout status deployment/name
819+
kubectl set image deployment/name oldimagename=newimagename - обновим в нашем Деплое контейнер oldimagename на новый newimagename
820+
kubectl rollout undo deployment/name - откатит на прошлую версию
821+
kubectl rollout history deployment/name - покажет историю обновлений
822+
kubectl rollout undo deployment/name --to-revision=2 - откатит на версию 2
823+
kubectl rollout restart deployment/name - пересоберет текущую версию
824+
```
825+
826+
2) Из файла-манифеста deployment-simple.yaml:
827+
828+
```java
829+
apiVersion : apps/v1
830+
kind: Deployment
831+
metadata:
832+
name: my-web-deployment
833+
labels:
834+
app : my-k8s-application
835+
spec:
836+
replicas: 2 //сколько реплик делать на Нодах, если надо
837+
selector: //с какими Подами будет работать Deployment
838+
matchLabels: //с Подами которые совпадают по Lables
839+
project: shell //именно такой
840+
template: //тут часть с Подами
841+
metadata:
842+
labels:
843+
project: shell
844+
spec:
845+
containers:
846+
- name : shell-web
847+
image: httpd:latest
848+
ports:
849+
- containerPort: 80
850+
... //можно в этом же файле разделим тремя точками, можно в отдельном файле
851+
apiVersion: autoscaling/v2
852+
kind: HorizontalPodAutoscaler
853+
metadata:
854+
name: my-autoscaling
855+
spec:
856+
scaleTargetRef: //что он автоскейлит?
857+
apiVersion: apps/v2
858+
kind: Deployment //Деплоймент
859+
name: my-web-deployment //конкретно этот Деплоймент
860+
minReplicas: 3
861+
maxReplacas: 5
862+
metrics: //как скейлит, основываясь на чем?
863+
- type: Resource //либо такой вариант
864+
resource:
865+
name: cpu
866+
target:
867+
type: Utilization
868+
averageUtilization: 90
869+
- type: Resource //либо такой вариант
870+
resource:
871+
name: memory
872+
target:
873+
type: Utilization
874+
averageUtilization: 70
875+
```
876+
877+
Запускаем Манифест-файл:
878+
```java
879+
kubectl apply -f ./deployment-simple.yaml
880+
```
881+
В итоге создаст два обьекта, Deployment и HorizontalPodAutoscaler
882+
883+
[к оглавлению](#Docker)
884+
885+
## Kubernetes Pods
886+
887+
[к оглавлению](#Docker)

0 commit comments

Comments
 (0)