#11 DevOps. Kubernetes. Немного о сети в Kubernetes

Для Pods и Services в Kubernetes создаются DNS записи следующего вида:

  • my-svc.my-namespace.svc.cluster-domain.example
  • pod-ipv4-address.my-namespace.pod.cluster-domain.example

ClusterIP открывает доступ к сервису по внутреннему IP-адресу в кластере и делает его доступным только внутри кластера.

NodePort открывает сервис на том же порту каждого выбранного узла в кластере с помощью NAT и делает его доступным вне кластера через <NodeIP>:<NodePort>. Диапазон портов 30000-32767

LoadBalancer создает внешний балансировщик нагрузки и назначает фиксированный внешний IP-адрес для сервиса.

Ingress — это объект, обеспечивающий внешний доступ к сервисам на 7 уровне модели OSI, то есть http или https. Благодаря тому, что он объединяет все правила маршрутизации мы можем использовать один IP адрес для нескольких сервисов 

Ingress Controller отвечает за обработку трафика. Его задача — отправить запрос на сервис. 

Рассмотрим пример того, как с помощью Kubernetes можно открыть доступ к приложениям извне.

Для начала создадим Deployment нашего frontend приложения с 3 репликами nginx внутри

nano  deployment-1.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-frontend
  labels:
    app: deployment-frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deployment-frontend
  template:
    metadata:
      labels:
        app: deployment-frontend
    spec:
      containers:
        - name: nginx
          image: nginx

Запустим и проверим

kubectl create -f deployment-1.yaml

kubectl get pods

kubectl get deployments.apps

Далее создадим Deployment для Backend

nano deployment-2.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-backend
  labels:
    app: deployment-backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: deployment-backend
  template:
    metadata:
      labels:
        app: deployment-backend
    spec:
      containers:
        - name: multitool
          image: wbitt/network-multitool
          env:
            - name: HTTP_PORT
              value: "1180"
            - name: HTTPS_PORT
              value: "11443"

Запустим и проверим

kubectl create -f deployment-2.yaml

kubectl get pods

kubectl get deployments.apps

Для обеспечения доступа к приложениям внутри кластера создадим Service для Frontend и Backend

nano service-frontend.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: service-frontend
spec:
  selector:
    app: deployment-frontend
  ports:
    - name: nginx-http
      port: 9001
      targetPort: 80

nano service-backend.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: service-backend
spec:
  selector:
    app: deployment-backend
  ports:
    - name: multitool-http
      port: 9002
      targetPort: 1180

Запустим и проверим

kubectl create -f service-frontend.yaml

kubectl create -f service-backend.yaml

kubectl get svc

Для тестового стенда мы используем MicroK8S поэтому включим Ingress Controller следующим образом

microk8s enable ingress

Теперь создадим Ingress, который обеспечит нам доступ извне

nano ingress-1.yaml

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service-frontend
            port:
              number: 9001
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: service-backend
            port:
              number: 9002

Запустим и проверим

kubectl create -f ingress-1.yaml

kubectl get ingress

kubectl describe ingress

Теперь проверим доступ 

Удалим запущенные ресурсы

kubectl delete -f ingress-1.yaml

kubectl delete -f service-backend.yaml

kubectl delete -f service-frontend.yaml

kubectl delete -f deployment-2.yaml

kubectl delete -f deployment-1.yaml

kubectl get all