#4 DevOps. Базовые объекты Kubernetes 

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

Получаем ответ и видим, что все работает.