Pod — минимальный объект в K8s с помощью которого мы запускаем приложения.
Как пример, в Docker — это контейнер, в K8s это под.
Как правило в под помещают один основной контейнер и если необходимо вспомогательный. Это удобно с точки зрения масштабирования и помогает при дебаггинге.
Контейнеры в поде запускаются одновременно.
Полезная команда
kubectl get pods
Важно отметить, что в контейнере у всех подов один IP адрес.
Как пример, внутри одного пода нельзя запустить два веб-сервера nginx на одном порту, так как контейнеры видят друг друга как localhost. Если необходимо запустить два веб-сервера, необходимо править порты в конфигах, порт 80 будет занят самым быстрым контейнером (кто первый запустился).
Под после удаления и перезапуска получает новый IP адрес.
При управлении объектами в K8s важно помнить о подходе Infrastructure as Code. Инфраструктура должна быть описана и храниться в файлах.
Запомним
Декларативный подход — для прода
Императивный — дебаг, тесты
Конфигурация описывается в YAML.
Labels — пара ключ-значение, необходима объектам для идентификации. Labels можно сравнить с тегами.
Selector — средство группировки для идентификации набора объектов.
Service — объект, определяющий логический набор подов и политику доступа к ним. В Service есть постоянный IP адрес и DNS имя, которые могут быть связаны с подами. По сути Service — это маршрутизатор в сети кластера, который обеспечивает сетевую связность. Best practice обращаться по DNS, а не IP адресу. При нескольких репликах пода Service балансирует нагрузку.
Полезная команда
kubectl get svc
Рассмотрим пример конфигурации пода и сервиса
apiVersion : v1
kind: Pod
metadata:
name: web
labels:
app: devopslife
spec:
containers:
- name : web
image: gcr.io/kubernetes-e2e-test-images/echoserver:2.2
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: devopslife
В Service название объекта (name) является доменным именем. В данном случае это name: web-svc.
Endpoint — отвечает за объединение Service с Pods — Service -> Endpoints -> Pod
kubectl port-forward позволяет при помощи переадресации портов подключиться к поду или сервису. Мы уже применяли ее ранее при подключении к dashboard. Обычно применяется для траблшутинга.
Перейдем к практике
sudo nano pod.yml
apiVersion : v1
kind: Pod
metadata:
name: pod
spec:
containers:
- name : pod
image: gcr.io/kubernetes-e2e-test-images/echoserver:2.2
ports:
- containerPort: 8080
kubectl apply -f pod.yml
kubectl get pods
kubectl port-forward pod/pod 8888:8080 --address 0.0.0.0
Откроем браузер ip_address:8888 и проверим
Теперь удалим созданный ранее под и создадим Service
kubectl delete pod pod
sudo nano devopslife.yml
apiVersion : v1
kind: Pod
metadata:
name: web
labels:
app: devopslife
spec:
containers:
- name : dv-web
image: gcr.io/kubernetes-e2e-test-images/echoserver:2.2
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: dv-svc
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: devopslife
kubectl apply -f devopslife.yml
kubectl get pods
kubectl get svc
kubectl port-forward service/dv-svc 8889:80 --address 0.0.0.0
Откроем браузер ip_address:8889 и проверим
Полезные команды
kubectl describe svc dv-svc
kubectl get ep
Вспомним момент про name и доменные имена и выполним следующее
kubectl run curl --image=curlimages/curl -i --tty --rm -- sh
curl dv-svc
curl dv-svc -I
Получаем ответ и видим, что все работает.