ссылки:
www.youtube.com/watch?v=TwyhnBDOHPw https://minikube.sigs.k8s.io/docs/handbook/ https://helm.sh/ru/docs/intro/install/ Примеры от selectel: https://docs.selectel.ru/managed-kubernetes/clusters/connect-to-cluster/ https://docs.selectel.ru/managed-kubernetes/networks/set-up-ingress/ https://docs.selectel.ru/managed-kubernetes/networks/set-up-ingress/?install-ingress-controller=with-configuring-loadbalancer
Задачи Kubernetes:
0. Деплоймент 1. Самовосстановление 2. Управление 3. Масштабирование 4. Баланс трафика
Не задачи kubernetes:
Хранение данных Хранение образов (registry) Сборка образов Сбор журналов и метрик
Общие понятия kubernetes:
master node - сервер или вм машина - головной центр управления - центр принятия решений
worker node - сервера или машины на которых запущены приложения, которыми управляет master noda
master master master
| | |
--------------------------|--------------------------
| | |
worker worker worker
В свою очередь в master node:
kubectl
|
api server --|-------------> scheduler
| | -----> etcd
|
controller
manager
api server - именно с этим сервером абсолютно все общаются (you, etcd, scheduler, controller manager, node, pode, все и все) -
etcd - это база данных, ключ значение, в этой базе хранится все значения что мы делаем с kubernetes
scheduler - планировщик, тут принимается решения что куда деплоить
controller manager - запущенный процесс, который следит за тем что бы kubernetes это сделал
kubectl - через эту программу мы общаемся с "api server" (все управление kubernetes делается через нее)
controle plane - это общее название api server + etcd + scheduler + control manager
Deployment - это yaml файл в котором мы описывает что нам требуется от kubernetes
ReplacaSet - подымает, следит за Pod (количество экземпляров, самовосстановление, желаемое состояние и т.д.)
Pod - собственно наши приложение (doker контейнер или контейнеры)
Трафик -> ingress controller -> node -> kube-proxy (service.yaml) / kubelet -> pod
ingress - внешний трафик
ingress controller - чаще всего это nginx, но также это может быть и haproxy и другое похожее ПО
service.yaml - собственно управляет как подключится к pod (настройки для kube-proxy)
Просто файлы настроек:
deployment.yaml - для вашего приложения которое выбудете запускать в kubernetes
service.yaml - файл с настройками для вашего приложения которое задает настройки для вашего приложения в kube-proxy
kubelet - программа которая отвечает за разворачивание pod
StatefulSet - это приложения, которые не живут в контейнерах, например базы данных (postgres, kafka, redis, etc..)
DaemonSet - это приложения которое будет жить на каждой nod (например fluentd - сбор логов)
minikube
https://minikube.sigs.k8s.io/docs/start/?arch=%2Flinux%2Fx86-64%2Fstable%2Fbinary+download curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64 minikube start - запуск kubernetes minikube minikube dashboard - открыть дашборд minikube
kubectl
kubectl get nodes - показать доступные nod kubectl get pods - показать запущенные pod kubectl apply -f deployment.yaml - пример запуска приложения (в файле deployment.yaml настройки для нашего приложения для kubernetes)
Внешний kubernets:
0. Для внешних подключений к kubernetes:
export KUBECONFIG=$HOME/путь_до_конфига.yaml
1.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm inspect values ingress-nginx/ingress-nginx > values.yaml
2.
Фрагмент манифеста с блоком annotations:
metadata:
name: loadbalancer-name
labels:
app: nginx
annotations:
service.beta.kubernetes.io/openstack-internal-load-balancer: "true"
3.
helm install ingress-nginx/ingress-nginx --generate-name -f values.yaml
Примеры файлов:
0. Создаем файл dokerfile, index.html, deployment.yaml, service.yaml:
cat > dockerfile << "EOF"
FROM nginx:alpine
# Копируем простую HTML страницу
COPY index.html /usr/share/nginx/html/
EXPOSE 80
EOF
cat > index.html << "EOF"
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World from Kubernetes!</h1>
<p>This is a simple web server running in a Docker container</p>
<p>Server: <span id="server-info">Nginx</span></p>
<p>Port: 80</p>
</body>
</html>
EOF
cat > deployment.yaml << "EOF"
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world-app
labels:
app: hello-world
spec:
replicas: 3
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world-container
image: hello-world-app:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
EOF
cat > service.yaml << "EOF"
apiVersion: v1
kind: Service
metadata:
name: hello-world-service
spec:
selector:
app: hello-world
ports:
- protocol: TCP
port: 8080
targetPort: 80
type: LoadBalancer
EOF
Запуску:
docker build -t hello-world-app:latest .
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl get pods