Skip to content

Kubernetes

Необходимо для работы

Установка

  1. Создайте в корне папку /sboard
shell
mkdir "/sboard"
  1. Создайте в новой папке файл sboard_namespace.yml

Уточнение

В этом пункте описано создание отдельного пространства имен для деплоя(namespace), в котором будет происходить дальнейшая настройка.

shell
nano sboard_namespace.yml

Пример sboard_namespace.yml

yml
kind: Namespace
apiVersion: v1
metadata:
  name: sboard-k8s-deploy
  labels:
    kubernetes.io/metadata.name: sboard-k8s-deploy
    node-local-dns-injection: enabled
  annotations:
    namespaceDesc: Namespace for sboard deploy
  1. Создайте файл sboard_env.yml. Он послужит для указания переменных окружения.
shell
nano sboard_env.yml

Пример sboard_env.yml

yml
kind: Secret
apiVersion: v1
metadata:
  name: env-secret
  namespace: sboard-k8s-deploy
stringData:
  DOMAIN_NAME: demo.example.com # доменное имя, на котором развернется сервис
  POSTGRES_URL: postgresql://user:password@host:5432/db # url подключения к базе данных postgresql, содержит в себе root user, пароль и хост базы
  REDIS_HOST: redis # хост для базы данных redis
  REDIS_PORT: 6379 # порт для базы данных redis
  REDIS_PASS: 12345gd67 # пароль для базы данных redis
  S3_BUCKET: example-bucket # название бакета в s3 storage
  S3_ACCESS_KEY_ID: access_key_id # айди ключа доступа к s3 storage
  S3_SECRET_ACCESS_KEY: secret_access_key # ключ доступа к s3 storage
  S3_ENDPOINT: https://storage.s3.com # url для s3 storage
  OAUTH_ENTERPRISE_ISSUER: OAUTH_ISSUER # sso issuer
  OAUTH_ENTERPRISE_SCOPE: openid email profile # sso scope
  OAUTH_ENTERPRISE_CLIENT_ID: CLIENT_ID # sso client id
  OAUTH_ENTERPRISE_CLIENT_SECRET: CLIENT_SECRET # sso client secret
  MIRO_CLIENT_ID: MIRO_CLIENT_ID # id клиента в личном кабинете миро для импорта досок
  MIRO_CLIENT_SECRET: MIRO_CLIENT_SECRET # секретный ключ клиента миро
type: Opaque
  1. Создайте файл sboard_tls.yml. Он послужит для настройки ssl соединения.
shell
nano sboard_tls.yml

Пример sboard_tls.yml

yml
kind: Secret
apiVersion: v1
metadata:
  name: domain-name-secret
  namespace: sboard-k8s-deploy
  annotations:
    description: domain-name-secret for ingres
data:
  tls.crt: сертификат в base64
  tls.key: ключ в base64
type: kubernetes.io/tls
  1. Авторизуйтесь в Docker registry (запросите ключ авторизации у вашего менеджера)
shell
cat key.json | docker login \
--username json_key \
--password-stdin \
cr.yandex
  1. Убедитесь, что полученный ключ имеет нужный формат.
shell
cat $HOME/.docker/config.json

Результат:

json
{
	"auths": {
		"cr.yandex": {
			"auth": "23232"
		}
	}
}
  1. Создайте файл sboard_registry.yml.
shell
nano sboard_registry.yml

Пример sboard_registry.yml

yml
apiVersion: v1
kind: Secret
metadata:
  name: sboard-custom-registry
  namespace: sboard-k8s-deploy
data:
  .dockerconfigjson: $HOME/.docker/config.json
type: kubernetes.io/dockerconfigjson
  1. Создайте файл sboard_app.yml. Он послужит для деплоя приложения и сервисов.
shell
nano sboard_app.yml

Пример sboard_app.yml

Уточнение

registry - registry докер образов(запросите url registry у вашего менеджера)

tag - уникальный идентификатор сборки(cм. релизы)

yml
# Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sboard-ingress
  namespace: sboard-k8s-deploy
  annotations:
    kubernetes.io/ingress.class: 'nginx'
spec:
  tls:
    - hosts:
        - demo.example.com # доменное имя, на котором развернется сервис
      secretName: domain-name-secret
  rules:
    - host: demo.example.com # доменное имя, на котором развернется сервис
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              service:
                name: sboard-lb
                port:
                  number: 80
---
# Service для пода local-nginx-sboard
apiVersion: v1
kind: Service
metadata:
  name: sboard-lb
  namespace: sboard-k8s-deploy
spec:
  selector:
    app: local-nginx-sboard
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
# Сервис, обеспечивающий доступность sboard в local-nginx-sboard
apiVersion: v1
kind: Service
metadata:
  name: sboard
  namespace: sboard-k8s-deploy
spec:
  selector:
    app: sboard-dev
  ports:
    - name: auth-web
      protocol: TCP
      port: 8080
      targetPort: 8080
    - name: auth-service
      protocol: TCP
      port: 3000
      targetPort: 3000
    - name: whiteboard-api
      protocol: TCP
      port: 3001
      targetPort: 3001
    - name: api-gateway
      protocol: TCP
      port: 3002
      targetPort: 3002
    - name: dashboard
      protocol: TCP
      port: 8081
      targetPort: 8081
    - name: admin-dashboard
      protocol: TCP
      port: 8082
      targetPort: 8082
    - name: whiteboard
      protocol: TCP
      port: 8083
      targetPort: 8083
---
# Deployment docker
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sboard-dev
  namespace: sboard-k8s-deploy
spec:
  replicas: 1
  selector:
		matchLabels:
      app: sboard-dev
  template:
    metadata:
      labels:
        app: sboard-dev
    spec:
		 imagePullSecrets:
        - name: имя секрета docker registry(см. пункт 6)
      containers:
        - name: sboard
          image: cr.yandex/registry/sboard:tag
          imagePullPolicy: Always
          envFrom:
            - secretRef:
                name: env-secret
      restartPolicy: Always
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: local-nginx-sboard
  namespace: sboard-k8s-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: local-nginx-sboard
  template:
    metadata:
      labels:
        app: local-nginx-sboard
    spec:
		 imagePullSecrets:
        - name: имя секрета docker registry(см. пункт 6)
      containers:
        - name: nginx
          image: cr.yandex/registry/nginx-http:tag
          ports:
            - containerPort: 80
          imagePullPolicy: Always
          envFrom:
            - secretRef:
                name: env-secret
      restartPolicy: Always

Service

Важно, чтобы сервис, обеспечивающий доступность sboard в local-nginx-sboard назывался строго "sboard"

yml
apiVersion: v1
kind: Service
metadata:
  name: sboard
  namespace: sboard-k8s-deploy
spec:
  selector:
    app: sboard-dev
  ports:
    - name: auth-web
      protocol: TCP
      port: 8080
      targetPort: 8080
	  ...
  1. Примените файлы sboard_namespace.yml, sboard_env.yml, sboard_tls.yml, sboard_registry.yml sboard_app.yml в кластере Kubernetes:
shell
 kubectl apply -f sboard_namespace.yml
 kubectl apply -f sboard_env.yml
 kubectl apply -f sboard_tls.ym
 kubectl apply -f sboard_app.yml