Опыт production-эксплуатации Kubernetes​

Олег Овсиенко

Backend Team Lead,  DevOps специалист

АО "Калуга Астрал"

Зам. руководителя отдела программирования АО "Калуга Астрал"

 

   Backend Team Lead

   DevOps специалист

 

   telegram: @oleg_ovsienko

   email:        ovsienko@astral.ru

О себе

  1. Почему Kubernetes?

  2. Модули Kubernetes.

  3. Компоненты Kubernetes.

  4. Архитектура проекта АО5.

  5. Мониторинг кластера.

  6. Проблемы эксплуатации.

  7. С чего начать?

План

Введение

Kubernetes (K8s)

Kubernetes - это система с открытым исходным кодом предназначенная для автоматизации развертывания, масштабирования и управления контейнеризованными приложениями.

История Kubernetes

Kubernetes сегодня

Компании использующие Kubernetes

Особенности Kubernetes

  • Run Anywhere
  • Service discovery and load balancing
  • Automated rollouts and rollbacks
  • Automatic bin packing
  • Self-healing
  • Secret and configuration management
  • Horizontal scaling
  • Windows nodes support (since k8s 1.15)

Архитектура Kubernetes

master

node 1

node 2

...

Docker

kubelet

kube-proxu

Docker

kubelet

kube-proxy

etcd

API

Server

Controller

-manager

Scheduler

kubectl

YAML (Declarative DSL)

Примитивы Kubernetes: Pod

Примитивы Kubernetes: Pod (yaml)

apiVersion: v1
kind: Pod
metadata:
  name: abonents-app
  labels:
    tier: backend
spec:
  containers:
  - name: abonents-app
    image: dockerhub/abonents.app:24018
    ports:
    - containerPort: 80

Примитивы Kubernetes: ReplicaSet

Примитивы Kubernetes: ReplicaSet (yaml)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: abonents-app
  labels:
    app: web-report
    tier: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: backend
  template:
    metadata:
      labels:
        tier: backend
    spec:
      containers:
      - name: abonents-app
        image: dockerhub/abonents.app:24018

Примитивы Kubernetes: Deployment

Примитивы Kubernetes: Deployment (yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: abonents-app
  labels:
    app: web-report
    tier: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: backend
  template:
    metadata:
      labels:
        tier: backend
    spec:
      containers:
      - name: abonents-app
        image: dockerhub/abonents.app:24018

Примитивы Kubernetes: Service

Примитивы Kubernetes: Service (yaml)

apiVersion: v1
kind: Service
metadata:
  name: abonents-app
spec:
  selector:
    tier: back
    v: 1.2
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

Примитивы Kubernetes: Job и CronJob

Job = Pod + 

Successful Completion

Примитивы Kubernetes: Job и CronJob (yaml)

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes
          restartPolicy: OnFailure

Примитивы Kubernetes: Volume

1. awsElasticBlockStore

2. azureDisk

3. azureFile

4. cephfs

5. cinder

6. configMap

7. csi

8. downwardAPI

9. emptyDir

10. fc (fibre channel)

11. flexVolume

12. flocker

13. gcePersistentDisk

14. gitRepo (deprecated)

15. glusterfs

16. hostPath

17. iscsi

18. local

19. nfs

20. persistentVolumeClaim

21. projected

22. portworxVolume

23. quobyte

24. rbd

25. scaleIO

26. secret

27. storageos

28. vsphereVolume

Types of Volumes

Примитивы Kubernetes: Secrets

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4= #base64 'admin'
  password: MWYyZDFlMmU2N2Rm #base64 '1f2d1e2e67df'
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

Примитивы Kubernetes: StatefulSet

apiVersion: apps/v1 
kind: StatefulSet
metadata:
  name: web
  labels:
    app: nginx
spec:
  serviceName: "nginx"
  selector:
    matchLabels:
      app: nginx
  replicas: 14
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html

Примитивы Kubernetes: DaemonSet

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  labels:
    app: nginx
  name: nginx-daemon-set
spec:
  template:
      labels:
        name: nginx-daemon-set
        scheduler: poseidon
    spec:
      containers:
      containers:
        - name: nginx
          image: "nginx:1.11.1-alpine"
          ports:
             - containerPort: 80

Примитивы Kubernetes: Ingress

Примитивы Kubernetes: Ingress (yaml)

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: back-ingress
spec:
  rules:
  - host: my.app.com
  - http:
      paths:
      - path: /backend
        backend:
          serviceName: back
          servicePort: 80

Примитивы Kubernetes: CRD

Серверная архитектура

Kubernetes dashboard

Мониторинг Kubernetes

Kubernetes

nodes

Prometheus

Graphana

Telegram

Мониторинг Kubernetes (nodes)

Мониторинг Kubernetes (pods)

Проблемы эксплуатации Kubernetes

1. Интеграция с системами CI/CD.

GitLab + K8s; Azure DevOps (TFS) + K8s

2. Смена IP адресов для nodes кластера k8s.

192.168.1.* -> 10.0.2.*

3. Использование тега latest для обозначения версий      контейнеров.

image: postgres:latest

4. Чувствительность к версиям ядра Linux.

4.15.0-54-generic -> 5.0.2-050002-generic

5. Балансировка подов по worker nodes кластера.

6. Внезапное отключение nodes кластера.

7. PKI сертификаты

Балансировка подов по worker nodes кластера

  resources:
    limits:
      memory: 512Mi
    requests:
      memory: 256Mi

Внезапное зависание nodes кластера

Внезапное отключение nodes кластера

KUBELET_EXTRA_ARGS=" --event-qps=30 --event-burst=40 --kube-api-qps=30 --kube-api-burst=40 --registry-qps=20 --registry-burst=30 --system-reserved=cpu=500m,memory=1Gi,ephemeral-storage=1Gi "

Сертификаты Kubernetes

master

node 1

node 2

...

Docker

kubelet

kube-proxu

Docker

kubelet

kube-proxy

etcd

API

Server

Controller

-manager

Scheduler

kubectl

С чего начать?

+

Kubernetes Interactive Tutorial

Kubernetes в облаке

Полезные ссылки

Вопросы

Олег Овсиенко

Backend Team Lead,  DevOps специалист

   telegram: @oleg_ovsienko

   email:        ovsienko@astral.ru

АО "Калуга Астрал"

Опыт production-эксплуатации Kubernetes (UfaConf))

By ovsienko

Опыт production-эксплуатации Kubernetes (UfaConf))

Рассказ об опыте использования K8s в АО Калуга Астрал

  • 304