Kubernetes (K8s) — это открытое программное обеспечение для автоматизации развёртывания, масштабирования, управления и контроля контейнеризованных приложений.
|
Преимущества использования
Быстрое развертывание приложений
При наличии нескольких серверов и необходимости обслуживать большее число пользователей, Kubernetes позволяет упростить процесс масштабирования. Обновление приложений происходит без необходимости отключения серверов, пропадает необходимость увеличивать мощность каждого сервера или добавлять новые серверы и переносить на них приложения.
Управление версиями
С помощью Kubernetes можно легко управлять версиями приложений. Даже после небольших обновлений новую версию можно быстро развернуть. В случае обнаружения проблемы также можно быстро вернуться на предыдущую версию без вреда для пользователей.
Обеспечение отказоустойчивости
Kubernetes упрощает обеспечение отказоустойчивости и поддерживается практически всеми крупными облачными провайдерами.
Архитектура Kubernetes
Архитектура Kubernetes включает в себя следующие компоненты:
•Nodes (ноды, узлы) — узлы, которые в зависимости от кластера, могут быть виртуальной или физической машиной. На узлах запускаются контейнеры приложений. Каждый узел содержит необходимые компоненты для запуска сервисов контейнеризации. Кластер имеет как минимум один рабочий узел.
•Pods (поды)— базовые модули управления приложениями, которые могут содержать один или несколько контейнеров.
•Volume (том) — ресурс, который позволяет нескольким контейнерам одновременно использовать общее хранилище.
Мастер-нода (Master Node) — главный узел управления кластером Kubernetes. Он отвечает за координацию и контроль работы остальных узлов в кластере. Основные компоненты мастера включают:
•Etcd — распределенное хранилище данных, используемое для хранения конфигурации кластера и состояния приложений.
•API Server — компонент, обеспечивающий API для взаимодействия с Kubernetes. Он принимает команды управления и обновляет состояние кластера.
•Scheduler — компонент, отвечающий за размещение подов на доступных рабочих узлах в соответствии с требованиями ресурсов и ограничениями.
•Controller Manager — компонент, который мониторит состояние кластера и управляет работой других контроллеров, например, контроллеров репликации и контроллеров развертывания.
Рабочие узлы (Worker Nodes) — вычислительные узлы, на которых размещаются контейнеры и выполняются приложения. Каждый рабочий узел имеет следующие компоненты:
•Kubelet — агент, который запускает и управляет контейнерами на рабочих узлах, основываясь на инструкциях API сервера.
•Kube-proxy — компонент, который ведет сетевой прокси-трафик и осуществляет балансировку нагрузки между сервисами.
•Container Runtime — ответственный за запуск и управление контейнерами. Наиболее распространенным контейнерным runtime является Docker, но Kubernetes также поддерживает другие runtime, такие как containerd и CRI-O.
Дополнительные компоненты:
•Network Plugins (Плагины сети) — позволяют сетевым подсистемам в различных узлах коммуницировать друг с другом и соединять контейнеры с внешним миром.
•Storage (Хранилище) — предоставляет множество опций для хранения данных, используемых Kubernetes, включая локальное хранилище, сетевые тома и распределенные файловые системы.
•Dashboard — веб-интерфейс для визуального управления кластером и мониторинга его состояния.
•Ingress Controller — позволяет управлять входящим сетевым трафиком в кластер и маршрутизировать его на соответствующие сервисы.
Схема архитектуры Kubernetes
Подготовка к установке
Для запуска приложения "Первая форма" в Kubernetes вам потребуются:
1. Манифест-файлы для развертывания в K8s:
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
spec:
capacity:
storage: 30Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
hostPath:
path: /pgdata
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
storageClassName: standard
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-deployment
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres-container
image: docker.1forma.ru/1forma/postgres:14.9
env:
- name: POSTGRES_PASSWORD
value: 'ohRaiQuaa8iG9mei'
- name: 'TZ'
value: 'Europe/Moscow'
ports:
- name: postgres-port
containerPort: 5432
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql
# imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: regcred
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-pvc
---
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
type: LoadBalancer
selector:
app: postgres
ports:
- protocol: TCP
port: 5432
targetPort: 5432
|
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-deployment
labels:
app: backend-deployment
env: test
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend-container
image: docker.1forma.ru/1forma/backend:master-2.257.3288.1
ports:
- name: backend-port
containerPort: 6000
env:
- name: 'TZ'
value: 'Europe/Moscow'
- name: 'USE_POSTGRESQL'
value: 'true'
- name: 'DB_SERVER'
value: 'postgres-service'
- name: 'DB_PORT'
value: '5432'
- name: 'DB_NAME'
value: 'rn_task'
- name: 'DB_USER'
value: 'd10taskuser'
- name: 'DB_PASSWORD'
value: 'beeSh6aevieghuxe'
- name: 'DB_REBUS_USER'
value: 'rebus'
- name: 'DB_REBUS_PASSWORD'
value: 'Pie5oothouphohve'
- name: 'ENABLE_POOLING'
value: 'true'
- name: 'MAXIMUM_POOL_SIZE'
value: '2500'
- name: 'IS_MAIN_SERVER'
value: 'true'
- name: 'IS_JOB_SERVER'
value: 'true'
- name: 'AUTH_TOKEN_EXPIRES'
value: '1500'
- name: 'INSTANCE_ID'
valueFrom:
fieldRef:
fieldPath: status.podIP
imagePullPolicy: Always
livenessProbe:
httpGet:
port: 6000
initialDelaySeconds: 30
periodSeconds: 5
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 1
imagePullSecrets:
- name: regcred
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: backend
ports:
- targetPort: backend-port
port: 6000
|
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-deployment
labels:
app: frontend-deployment
env: test
spec:
replicas: 1
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend-container
image: docker.1forma.ru/1forma/frontend:master-2.256.37-v3
ports:
- name: http-port-svc
containerPort: 80
env:
- name: "BACKEND_SERVICE"
value: "backend-service"
- name: 'TZ'
value: 'Europe/Moscow'
- name: 'ENABLE_HTTP_REDIRECT'
value: 'false'
- name: 'ENABLE_HTTPS'
value: 'false'
- name: 'PROXY_ADMIN'
value: 'false'
- name: 'PROXY_ADMIN_URL'
value: 'admin.1frn.ru'
imagePullPolicy: Always
imagePullSecrets:
- name: regcred
---
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
selector:
app: frontend
ports:
- name: http-port
protocol: TCP
port: 80
targetPort: http-port-svc
|
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: 1forma-ingress
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 512m
nginx.ingress.kubernetes.io/proxy-buffer-size: 512m
spec:
ingressClassName: nginx
rules:
- host: 1frn.ru
http:
paths:
- pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
path: /
tls:
- hosts:
- 1frn.ru
secretName: 1forma-tls-le
---
apiVersion: v1
kind: Secret
metadata:
name: 1forma-tls-le
data:
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVEekNDQXZlZ0F3SUJBZ0lTQk43UEFlRnBnb2Z5aWpSL0JIQUdXbU0wTUEwR0NTcUdTSWIzRFFFQkN3VUEKTURJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1Rc3dDUVlEVlFRRApFd0pTTXpBZUZ3MHlNekV3TWpBeE1UVTFORGRhRncweU5EQXhNVGd4TVRVMU5EWmFNQkl4RURBT0JnTlZCQU1UCkJ6Rm1jbTR1Y25Vd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTZlFIVTRtRXYxd08vWTd4NFQKci9EcXR1NUtZYmpKanFFTE9PQ3dSTmFPYTlSVFpjbzJ5a2xjajVDZXFOMWdHRTQrenBpaGZEWVk3VlpBRjVqawpTU3YwbzRJQ0NEQ0NBZ1F3RGdZRFZSMFBBUUgvQkFRREFnZUFNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CCkJnZ3JCZ0VGQlFjREFqQU1CZ05WSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJRakRCdlRLOEphQm1sc3YyOXMKTWp6RlpDWjdHakFmQmdOVkhTTUVHREFXZ0JRVUxyTVh0MWhXeTY1UUNVRG1INitkaXhUQ3hqQlZCZ2dyQmdFRgpCUWNCQVFSSk1FY3dJUVlJS3dZQkJRVUhNQUdHRldoMGRIQTZMeTl5TXk1dkxteGxibU55TG05eVp6QWlCZ2dyCkJnRUZCUWN3QW9ZV2FIUjBjRG92TDNJekxta3ViR1Z1WTNJdWIzSm5MekFTQmdOVkhSRUVDekFKZ2djeFpuSnUKTG5KMU1CTUdBMVVkSUFRTU1Bb3dDQVlHWjRFTUFRSUJNSUlCQXdZS0t3WUJCQUhXZVFJRUFnU0I5QVNCOFFEdgpBSFVBMnJhL2F6KzF0aUtmbThLN1hHdm9jSkZ4Ykx0UmhJVTB2YVE5TUVqWCs2c0FBQUdMVFNmNWhBQUFCQU1BClJqQkVBaUJzRTNrUkRTdFpUWVQyMG1rcGo2VDNGcjdUS0tOUU9NZjZZVUxqMkpWcFZBSWdjTWZhZ3NVLzY3cmoKWWFFWi9EbzFmdk51RjZkK3pBK05JSVhvcU1Hc0wzMEFkZ0E3VTNkMVBpMjVnRTZMTUZzRy9rQTdaOWhQdy9USAp2UUFOTFhKdjRmclVGd0FBQVl0TkovbUpBQUFFQXdCSE1FVUNJUURTQjNNbWNjcTdyQVFPR1pxM25CNWJ5Y1BVClJPNEd4bVBMNDJ6MzJiWjgwUUlnWDd4VkNBQjV0WnpsWGF0QmxMSTRHYkVJb0VPS2dqaDkydk9XRVpzNzdTY3cKRFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUE5bUorODlhdWZpMS9ieFkvRThFUm02dmVvY29WVmdseFpzRmxUcApWcXVzOWlhRVczUWhjZVlmMEdZWklLWTNDQkhWQWl1aXVYTktyR05ma0oyaGNiRlltZnh2WVNOZTBCYUVSdjZICkxXM0FZZEdzSTRWRXd5VnN0eGVhdi9sSTZNMUkrbFJmcElPS3VTQ25OQ2VsTWVaMjhzMXFGRkQ4VkM2QWUrUEIKZjFXbE1WcmptdWJKODFtOWNBUHN5NVNUeE1sT3dXMTV6V3NOZHM3NHROQzVzRGI1THhYME9OcjM2QzkrTHNtcQpoQk52VHZmVzM1TFZpdEw0N0hOQU5EaFo5d2RSdCtmSjh0M29KRFZHalRqbEFPc00zc0lYOW9hY3E5NllDYllwCjlydjh5Z2pwR0tZc1dBVTNXdHRsMWlKK2E3ZXE5YXFFU1ErTkxxV1d4b204d0FRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGRmpDQ0F2NmdBd0lCQWdJUkFKRXJDRXJQREJpblUvYldMaVduWDFvd0RRWUpLb1pJaHZjTkFRRUxCUUF3ClR6RUxNQWtHQTFVRUJoTUNWVk14S1RBbkJnTlZCQW9USUVsdWRHVnlibVYwSUZObFkzVnlhWFI1SUZKbGMyVmgKY21Ob0lFZHliM1Z3TVJVd0V3WURWUVFERXd4SlUxSkhJRkp2YjNRZ1dERXdIaGNOTWpBd09UQTBNREF3TURBdwpXaGNOTWpVd09URTFNVFl3TURBd1dqQXlNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlRHVjBKM01nClJXNWpjbmx3ZERFTE1Ba0dBMVVFQXhNQ1VqTXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUsKQW9JQkFRQzdBaFVvelBhZ2xOTVBFdXlOVlpMRCtJTHhtYVo2UW9pblhTYXF0U3U1eFV5eHI0NXIrWFhJbzljUApSNVFVVlRWWGpKNm9vamtaOVlJOFFxbE9idlU3d3k3YmpjQ3dYUE5aT09mdHoybndXZ3NidnNDVUpDV0gramR4CnN4UG5IS3pobSsvYjVEdEZVa1dXcWNGVHpqVElVdTYxcnUyUDNtQnc0cVZVcTdadERwZWxRRFJySzlPOFp1dG0KTkh6NmE0dVBWeW1aK0RBWFhicHliL3VCeGEzU2hsZzlGOGZuQ2J2eEsvZUczTUhhY1YzVVJ1UE1yU1hCaUx4ZwpaM1Ztcy9FWTk2SmM1bFAvT29pMlI2WC9FeGpxbUFsM1A1MVQrYzhCNWZXbWNCY1VyMk9rLzVtems1M2NVNmNHCi9raUZIYUZwcmlWMXV4UE1VZ1AxN1ZHaGk5c1ZBZ01CQUFHamdnRUlNSUlCQkRBT0JnTlZIUThCQWY4RUJBTUMKQVlZd0hRWURWUjBsQkJZd0ZBWUlLd1lCQlFVSEF3SUdDQ3NHQVFVRkJ3TUJNQklHQTFVZEV3RUIvd1FJTUFZQgpBZjhDQVFBd0hRWURWUjBPQkJZRUZCUXVzeGUzV0ZiTHJsQUpRT1lmcjUyTEZNTEdNQjhHQTFVZEl3UVlNQmFBCkZIbTBXZVo3dHVYa0FYT0FDSWpJR2xqMjZadHVNRElHQ0NzR0FRVUZCd0VCQkNZd0pEQWlCZ2dyQmdFRkJRY3cKQW9ZV2FIUjBjRG92TDNneExta3ViR1Z1WTNJdWIzSm5MekFuQmdOVkhSOEVJREFlTUJ5Z0dxQVloaFpvZEhSdwpPaTh2ZURFdVl5NXNaVzVqY2k1dmNtY3ZNQ0lHQTFVZElBUWJNQmt3Q0FZR1o0RU1BUUlCTUEwR0N5c0dBUVFCCmd0OFRBUUVCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFDRnlrNUhQcVAzaFVTRnZOVm5lTEtZWTYxMVRSNlcKUFRObGNsUXRnYURxdyszNElMOWZ6TGR3QUxkdU8vWmVsTjdrSUorbTc0dXlBK2VpdFJZOGtjNjA3VGtDNTN3bAppa2ZtWlc0L1J2VFo4TTZVSys1VXpoSzhqQ2RMdU1HWUw2S3Z6WEdSU2dpM3lMZ2pld1F0Q1BrSVZ6NkQyUVF6CkNrY2hlQW1DSjhNcXlKdTV6bHp5Wk1qQXZubkFUNDV0UkF4ZWtyc3U5NHNRNGVnZFJDbmJXU0R0WTdraCtCSW0KbEpOWG9CMWxCTUVLSXE0UURVT1hvUmdmZnVEZ2hqZTFXckc5TUwrSGJpc3EveUZPR3dYRDlSaVg4RjZzdzZXNAphdkF1dkRzenVlNUwzc3o4NUsrRUM0WS93RlZETnZabzRUWVhhbzZaMGYrbFFLYzB0OERRWXprMU9YVnU4cnAyCnlKTUM2YWxMYkJmT0RBTFp2WUg3bjdkbzFBWmxzNEk5ZDFQNGpua0RyUW94QjNVcVE5aFZsM0xFS1E3M3hGMU8KeUs1R2hERFg4b1ZmR0tGNXUrZGVjSXNINFlhVHc3bVAzR0Z4SlNxdjMrMGxVRkpvaTVMYzVkYTE0OXA5MElkcwpoQ0V4cm9MMSs3bXJ5SWtYUGVGTTVUZ085cjBydlphQkZPdlYyejBncDM1WjArTDRXUGxidUVqTi9seFBGaW4rCkhsVWpyOGdSc0kzcWZKT1FGeS85cktJSlIwWS84T213dC84b1RXZ3kxbWRlSG1tams3ajFuWXN2QzlKU1E2WnYKTWxkbFRUS0IzemhUaFYxK1hXWXA2cmpkNUpXMXpiVldFa0xOeEU3R0pUaEVVRzNzemdCVkdQN3BTV1RVVHNxWApuTFJid0hPb3E3aEh3Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQkVpZ0F3SUJBZ0lRUUFGM0lUZlU2VUs0N25hcVBHUUt0ekFOQmdrcWhraUc5dzBCQVFzRkFEQS8KTVNRd0lnWURWUVFLRXh0RWFXZHBkR0ZzSUZOcFoyNWhkSFZ5WlNCVWNuVnpkQ0JEYnk0eEZ6QVZCZ05WQkFNVApEa1JUVkNCU2IyOTBJRU5CSUZnek1CNFhEVEl4TURFeU1ERTVNVFF3TTFvWERUSTBNRGt6TURFNE1UUXdNMW93ClR6RUxNQWtHQTFVRUJoTUNWVk14S1RBbkJnTlZCQW9USUVsdWRHVnlibVYwSUZObFkzVnlhWFI1SUZKbGMyVmgKY21Ob0lFZHliM1Z3TVJVd0V3WURWUVFERXd4SlUxSkhJRkp2YjNRZ1dERXdnZ0lpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3Q2Q1J6OUJRMzg1dWVLMWNvSEllKzNMZmZPSkNNYmp6bVY2QjQ5M1hDCm92NzFhbTcyQUU4bzI5NW9obXhFazdheFkvMFVFbXUvSDlMcU1ac2hmdEV6UExwSTlkMTUzN080L3hMeElacEwKd1lxR2NXbEtabVpzajM0OGNMK3RLU0lHOCtUQTVvQ3U0a3VQdDVsK2xBT2YwMGVYZkpsSUkxUG9PSzVQQ20rRApMdEZKVjR5QWRMYmFMOUE0alhzRGNDRWJkZkl3UFBxUHJ0M2FZNnZyRmsvQ2poRkxmczhMNlArMWR5NzBzbnRLCjRFd1NKUXh3alFNcG9PRlRKT3dUMmU0WnZ4Q3pTb3cvaWFOaFVkNnNod2VVOUdOeDdDN2liMXVZZ2VHSlhEUjUKYkhidk81QmllZWJicEpvdkpzWFFFT0VPM3RrUWpoYjd0L2VvOThmbEFnZVlqellJbGVmaU41WU5ObldlK3c1eQpzUjJidkFQNVNRWFlnZDBGdENyV1FlbXNBWGFWQ2cvWTM5VzlFaDgxTHlnWGJOS1l3YWdKWkhkdVJ6ZTZ6cXhaClhtaWRmM0xXaWNVR1FTaytXVDdkSnZVa3lSR25XcU5NUUI5R29abTFwenBSYm9ZN25uMXlweElGZUZudFBsRjQKRlFzRGo0M1FMd1d5UG50S0hFdHpCUkw4eHVyZ1VCTjhRNU4wczhwMDU0NGZBUWpRTU5SYmNUYTBCN3JCTURCYwpTTGVDTzVpbWZXQ0tvcU1wZ3N5NnZZTUVHNktEQTBHaDFnWHhHOEsyOEtoOGhqdEdxRWdxaU54Mm1uYS9IMnFsClBSbVA2emp6Wk43SUt3MEtLUC8zMitJVlF0UWkwQ2RkNFhuK0dPZHdpSzFPNXRtTE9zYmRKMUZ1Lzd4azlUTkQKVHdJREFRQUJvNElCUmpDQ0FVSXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpTd1lJS3dZQkJRVUhBUUVFUHpBOU1Ec0dDQ3NHQVFVRkJ6QUNoaTlvZEhSd09pOHZZWEJ3Y3k1cFpHVnVkSEoxCmMzUXVZMjl0TDNKdmIzUnpMMlJ6ZEhKdmIzUmpZWGd6TG5BM1l6QWZCZ05WSFNNRUdEQVdnQlRFcDdHa2V5eHgKK3R2aFM1QjEvOFFWWUlXSkVEQlVCZ05WSFNBRVRUQkxNQWdHQm1lQkRBRUNBVEEvQmdzckJnRUVBWUxmRXdFQgpBVEF3TUM0R0NDc0dBUVVGQndJQkZpSm9kSFJ3T2k4dlkzQnpMbkp2YjNRdGVERXViR1YwYzJWdVkzSjVjSFF1CmIzSm5NRHdHQTFVZEh3UTFNRE13TWFBdm9DMkdLMmgwZEhBNkx5OWpjbXd1YVdSbGJuUnlkWE4wTG1OdmJTOUUKVTFSU1QwOVVRMEZZTTBOU1RDNWpjbXd3SFFZRFZSME9CQllFRkhtMFdlWjd0dVhrQVhPQUNJaklHbGoyNlp0dQpNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFLY3dCc2xtNy9EbExRcnQyTTUxb0dyUytvNDQrL3lRb0RGVkRDCjVXeEN1MitiOUxSUHdrU0lDSFhNNndlYkZHSnVlTjdzSjdvNVhQV2lvVzVXbEhBUVU3Rzc1Sy9Rb3NNckFkU1cKOU1VZ05UUDUyR0UyNEhHTnRMaTFxb0pGbGNEeXFTTW81OWFoeTJjSTJxQkRMS29ia3gvSjN2V3JhVjBUOVZ1RwpXQ0xLVFZYa2NHZHR3bGZGUmpsQno0cFlnMWh0bWY1WDZEWU84QTRqcXYySWw5RGpYQTZVU2JXMUZ6WFNMcjlPCmhlOFk0SVdTNndZN2JDa2pDV0RjUlFKTUVoZzc2ZnNPM3R4RStGaVlydXE5UlVXaGlGMW15djRRNlcrQ3lCRkMKRGZ2cDdPT0dBTjZkRU9NNCtxUjlzZGpvU1lLRUJwc3I2R3RQQVF3NGR5NzUzZWM1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZzBUYWZicy9iNGFCZzZRUlcKdTJiYnlNc1lrWXVYbm9tMGJsVHRZdDdSaCtXaFJBTkNBQVNmUUhVNG1FdjF3Ty9ZN3g0VHIvRHF0dTVLWWJqSgpqcUVMT09Dd1JOYU9hOVJUWmNvMnlrbGNqNUNlcU4xZ0dFNCt6cGloZkRZWTdWWkFGNWprU1N2MAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==
type: kubernetes.io/tls
|
2. Дамп базы данных.
Настройка PG
Задайте пароль командой:
kubectl create secret generic postgres-password --from-literal=postgres_password=PASSWORD
где:
•postgres_password — пароль пользователя Postgres.
Примените манифест-файл 1forma-postgres.yml в Kubernetes. Для этого выполните команду:
kubectl apply -f 1forma-postgres.yml
Для хранения данных выставлено значение 30 GB (storage: 30Gi). При необходимости его можно изменить.
|
Подключитесь к PG и выполните ряд настроек:
Включите расширения tds_fdw, http, rum, postgres_fdw, pgcrypto, pg_buffercache, btree_gin:
LOAD 'pg_hint_plan';
CREATE EXTENSION IF NOT EXISTS tds_fdw schema public;
CREATE EXTENSION IF NOT EXISTS http schema public;
CREATE EXTENSION IF NOT EXISTS rum schema public;
CREATE EXTENSION IF NOT EXISTS postgres_fdw schema public;
CREATE EXTENSION IF NOT EXISTS pgcrypto schema public;
CREATE EXTENSION IF NOT EXISTS pg_buffercache schema public;
CREATE EXTENSION IF NOT EXISTS btree_gin;
Создайте пользователей базы данных: dbo, d10taskuser, migrationsdaemon, rebus, implementer. Задайте их пароли:
create user dbo with superuser createdb createrole inherit login password 'PASSWORD';
create user d10taskuser with inherit login password 'PASSWORD';
create user migrationsdaemon with inherit login password 'PASSWORD';
create user rebus with inherit login password 'PASSWORD';
create user implementer with inherit login password 'PASSWORD';
Создайте базу данных d10task и taskfilesdb:
create database d10task
template template0
owner dbo
encoding 'utf8'
lc_collate 'ru_RU.utf8'
lc_ctype 'ru_RU.utf8';
create database taskfilesdb
template template0
owner dbo
encoding 'utf8'
lc_collate 'ru_RU.utf8'
lc_ctype 'ru_RU.utf8';
Настройте схему для файловой базы:
\c taskfilesdb
create extension if not exists tds_fdw schema public;
create schema if not exists dbo authorization dbo;
create table dbo.UploadFiles
(
id int not null generated by default as identity,
FileContent bytea,
Ext varchar,
UserID int,
FileName varchar,
Compressed bool constraint DF_UploadFiles_Compressed default false,
constraint PK_UploadFiles primary key (id)
);
После рестора примените в базе d10task следующие команды:
\c d10task
alter role D10TaskUser set search_path = "dbo", "public";
alter role dbo set search_path = "dbo", "public";
alter user MigrationsDaemon set search_path = "dbo", "public";
alter user rebus set search_path = "rebus", "public";
Настройка Backend
Задайте пароли командой:
kubectl create secret generic db-password --from-literal=db_password=PASSWORD
kubectl create secret generic rebus-password --from-literal=rebus_password=PASSWORD
где:
•db-password — пароль пользователя d10taskuser.
•rebus_password — пароль пользователя Rebus.
Примените манифест-файл 1forma-backend.yml в Kubernetes. Для этого выполните команду:
kubectl apply -f 1forma-backend.yml
Значение PG_SERVICE_NAME — это название сервиса Postgres.
Настройка Frontend
Примените манифест-файл 1forma-frontend.yml в Kubernetes. Для этого выполните команду:
kubectl apply -f 1forma-frontend.yml
Значение BACKEND_SERVICE — это название сервиса Backend.
Настройка INGRESS
Для доступа к приложению используется INGRESS NGINX.
Примените манифест-файл 1forma-ingress.yml в Kubernetes. Для этого выполните команду:
kubectl apply -f 1forma-ingress.yml