added conf files for k8s

This commit is contained in:
2025-12-18 15:34:28 +03:00
commit 514b401aae
28 changed files with 1406 additions and 0 deletions

View File

@@ -0,0 +1,191 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster1-init-scripts
namespace: cluster1
data:
db1-init.sql: |
-- from Практика 3/init-scripts/db1-init.sql
-- Инициализация БД 1
-- Создание пользователей
-- Пользователь 1: видит только свою БД (database1)
CREATE USER user1_local WITH PASSWORD 'user1pass';
GRANT CONNECT ON DATABASE database1 TO user1_local;
GRANT USAGE ON SCHEMA public TO user1_local;
GRANT CREATE ON SCHEMA public TO user1_local;
-- Пользователь 1: может видеть БД в соседнем контейнере (database2)
-- Этот пользователь будет создан также в db2, что позволит ему подключаться к обеим БД
CREATE USER user1_cross WITH PASSWORD 'user1pass';
GRANT CONNECT ON DATABASE database1 TO user1_cross;
GRANT USAGE ON SCHEMA public TO user1_cross;
GRANT CREATE ON SCHEMA public TO user1_cross;
-- Создание таблиц
CREATE TABLE IF NOT EXISTS products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
quantity INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS orders (
id SERIAL PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL,
total_amount DECIMAL(10, 2) NOT NULL,
status VARCHAR(50) NOT NULL,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Выдача прав на таблицы для user1_local
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user1_local;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO user1_local;
-- Выдача прав на таблицы для user1_cross
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user1_cross;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO user1_cross;
-- Настройка прав по умолчанию для будущих таблиц
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO user1_local;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO user1_cross;
ALTER DEFAULT PRIVИЛЕGES IN SCHEMA public GRANT ALL ON SEQUENCES TO user1_local;
ALTER DEFAULT PRIVИЛЕGES IN SCHEMA public GRANT ALL ON SEQUENCES TO user1_cross;
db1-data.sql: |
-- from Практика 3/init-scripts/db1-data.sql
-- Заполнение таблиц случайными данными для БД 1
-- Вставка случайных данных в таблицу products
INSERT INTO products (name, price, quantity) VALUES
('Ноутбук Dell XPS', 89999.99, 15),
('Мышь Logitech MX', 3499.50, 42),
('Клавиатура Mechanical', 5999.00, 28),
('Монитор LG 27"', 24999.99, 12),
('Наушники Sony WH-1000XM4', 19999.00, 35),
('Веб-камера Logitech C920', 4999.00, 18),
('Микрофон Blue Yeti', 8999.99, 8),
('Коврик для мыши', 599.00, 100),
('USB-C кабель', 1299.00, 55),
('Внешний SSD 1TB', 8999.99, 22),
('Планшет Samsung Galaxy', 29999.00, 14),
('Смартфон iPhone 15', 79999.99, 9),
('Умные часы Apple Watch', 24999.00, 20),
('Портативная колонка JBL', 4999.00, 30),
('Беспроводные наушники AirPods', 14999.00, 25);
-- Вставка случайных данных в таблицу orders
INSERT INTO orders (customer_name, total_amount, status) VALUES
('Иван Петров', 125999.99, 'completed'),
('Мария Сидорова', 3499.50, 'pending'),
('Алексей Иванов', 5999.00, 'completed'),
('Елена Козлова', 24999.99, 'processing'),
('Дмитрий Смирнов', 19999.00, 'completed'),
('Ольга Волкова', 4999.00, 'pending'),
('Сергей Лебедев', 8999.99, 'completed'),
('Анна Новикова', 599.00, 'completed'),
('Павел Морозов', 1299.00, 'processing'),
('Татьяна Федорова', 8999.99, 'completed'),
('Николай Соколов', 29999.00, 'pending'),
('Юлия Попова', 79999.99, 'completed'),
('Андрей Васильев', 24999.00, 'processing'),
('Наталья Павлова', 4999.00, 'completed'),
('Владимир Семенов', 14999.00, 'pending'),
('Ирина Григорьева', 89999.99, 'completed'),
('Роман Орлов', 3499.50, 'processing'),
('Екатерина Зайцева', 5999.00, 'completed'),
('Максим Егоров', 24999.99, 'pending'),
('Светлана Михайлова', 19999.00, 'completed');
db2-init.sql: |
-- from Практика 3/init-scripts/db2-init.sql
-- Инициализация БД 2
-- Создание пользователей
-- Пользователь 2: видит только свою БД (database2)
CREATE USER user2_local WITH PASSWORD 'user2pass';
GRANT CONNECT ON DATABASE database2 TO user2_local;
GRANT USAGE ON SCHEMA public TO user2_local;
GRANT CREATE ON SCHEMA public TO user2_local;
-- Пользователь 1: может видеть БД в соседнем контейнере (database1)
-- Этот пользователь создан также в db1, что позволяет ему подключаться к обеим БД
CREATE USER user1_cross WITH PASSWORD 'user1pass';
GRANT CONNECT ON DATABASE database2 TO user1_cross;
GRANT USAGE ON SCHEMA public TO user1_cross;
GRANT CREATE ON SCHEMA public TO user1_cross;
-- Создание таблиц
CREATE TABLE IF NOT EXISTS employees (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
position VARCHAR(100) NOT NULL,
salary DECIMAL(10, 2) NOT NULL,
hire_date DATE NOT NULL,
department VARCHAR(50) NOT NULL
);
CREATE TABLE IF NOT EXISTS departments (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE,
budget DECIMAL(12, 2) NOT NULL,
manager_id INTEGER,
location VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Выдача прав на таблицы для user2_local
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user2_local;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO user2_local;
-- Выдача прав на таблицы для user1_cross
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user1_cross;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO user1_cross;
-- Настройка прав по умолчанию для будущих таблиц
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO user2_local;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO user1_cross;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO user2_local;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO user1_cross;
db2-data.sql: |
-- from Практика 3/init-scripts/db2-data.sql
-- Заполнение таблиц случайными данными для БД 2
-- Вставка случайных данных в таблицу departments
INSERT INTO departments (name, budget, location) VALUES
('Отдел разработки', 5000000.00, 'Москва, офис 1'),
('Отдел продаж', 3000000.00, 'Санкт-Петербург, офис 2'),
('Отдел маркетинга', 2000000.00, 'Москва, офис 1'),
('Отдел HR', 1500000.00, 'Новосибирск, офис 3'),
('Отдел финансов', 4000000.00, 'Москва, офис 1'),
('Отдел поддержки', 1800000.00, 'Екатеринбург, офис 4'),
('Отдел тестирования', 2500000.00, 'Москва, офис 1'),
('Отдел аналитики', 2200000.00, 'Казань, офис 5');
-- Вставка случайных данных в таблицу employees
INSERT INTO employees (first_name, last_name, position, salary, hire_date, department) VALUES
('Александр', 'Иванов', 'Senior Developer', 150000.00, '2020-03-15', 'Отдел разработки'),
('Елена', 'Петрова', 'Product Manager', 120000.00, '2019-06-20', 'Отдел разработки'),
('Дмитрий', 'Сидоров', 'Sales Manager', 80000.00, '2021-01-10', 'Отдел продаж'),
('Мария', 'Козлова', 'Marketing Specialist', 70000.00, '2021-08-05', 'Отдел маркетинга'),
('Сергей', 'Смирнов', 'HR Manager', 90000.00, '2020-11-12', 'Отдел HR'),
('Ольга', 'Волкова', 'Financial Analyst', 110000.00, '2019-09-18', 'Отдел финансов'),
('Андрей', 'Лебедев', 'Support Engineer', 65000.00, '2022-02-22', 'Отдел поддержки'),
('Татьяна', 'Новикова', 'QA Engineer', 75000.00, '2021-04-30', 'Отдел тестирования'),
('Павел', 'Морозов', 'Data Analyst', 85000.00, '2020-07-14', 'Отдел аналитики'),
('Юлия', 'Федорова', 'Junior Developer', 60000.00, '2022-05-08', 'Отдел разработки'),
('Николай', 'Соколов', 'Senior Sales Manager', 95000.00, '2018-12-03', 'Отдел продаж'),
('Анна', 'Попова', 'Marketing Manager', 100000.00, '2020-10-25', 'Отдел маркетинга'),
('Владимир', 'Васильев', 'Lead Developer', 180000.00, '2017-05-11', 'Отдел разработки'),
('Наталья', 'Павлова', 'Recruiter', 55000.00, '2021-11-19', 'Отдел HR'),
('Роман', 'Семенов', 'CFO', 200000.00, '2016-08-07', 'Отдел финансов'),
('Екатерина', 'Григорьева', 'Senior Support Engineer', 80000.00, '2019-03-28', 'Отдел поддержки'),
('Максим', 'Орлов', 'Test Lead', 130000.00, '2018-09-15', 'Отдел тестирования'),
('Светлана', 'Зайцева', 'Senior Data Analyst', 120000.00, '2019-12-01', 'Отдел аналитики'),
('Игорь', 'Егоров', 'DevOps Engineer', 140000.00, '2020-04-16', 'Отдел разработки'),
('Людмила', 'Михайлова', 'Sales Director', 160000.00, '2017-11-23', 'Отдел продаж');

View File

@@ -0,0 +1,47 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster1-replication-scripts
namespace: cluster1
data:
entrypoint-replica.sh: |
#!/bin/sh
set +e # Не останавливаться при ошибках в фоновых процессах
# Запускаем PostgreSQL в фоновом режиме
echo "Запуск PostgreSQL..."
docker-entrypoint.sh postgres &
POSTGRES_PID=$!
# Ждем запуска PostgreSQL
echo "Ожидание запуска PostgreSQL..."
sleep 15
# Проверяем, что PostgreSQL запущен
RETRY_COUNT=0
MAX_RETRIES=30
until PGPASSWORD=postgres123 psql -h localhost -U postgres -c '\q' 2>/dev/null; do
RETRY_COUNT=$((RETRY_COUNT + 1))
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
echo "Ошибка: PostgreSQL не запустился за отведенное время"
exit 1
fi
echo "Ожидание PostgreSQL... ($RETRY_COUNT/$MAX_RETRIES)"
sleep 2
done
echo "PostgreSQL запущен!"
# Настраиваем репликацию
echo "Настройка репликации..."
/replication-scripts/setup-replica.sh
# Запускаем периодическую репликацию в фоне
echo "Запуск службы периодической репликации..."
/replication-scripts/replication-cron.sh &
REPLICATION_PID=$!
# Ждем завершения PostgreSQL (главный процесс)
wait $POSTGRES_PID

5
cluster1/namespace.yaml Normal file
View File

@@ -0,0 +1,5 @@
apiVersion: v1
kind: Namespace
metadata:
name: cluster1

37
cluster1/pvc-db.yaml Normal file
View File

@@ -0,0 +1,37 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db1-data
namespace: cluster1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db2-data
namespace: cluster1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: replica-data
namespace: cluster1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

13
cluster1/secrets-db.yaml Normal file
View File

@@ -0,0 +1,13 @@
apiVersion: v1
kind: Secret
metadata:
name: cluster1-postgres-secret
namespace: cluster1
type: Opaque
stringData:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres123
DB1_NAME: database1
DB2_NAME: database2

View File

@@ -0,0 +1,71 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db1
namespace: cluster1
spec:
serviceName: db1
replicas: 1
selector:
matchLabels:
app: db1
template:
metadata:
labels:
app: db1
spec:
containers:
- name: postgres
image: postgres:15-alpine
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: cluster1-postgres-secret
key: DB1_NAME
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: cluster1-postgres-secret
key: POSTGRES_USER
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: cluster1-postgres-secret
key: POSTGRES_PASSWORD
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: db1-data
mountPath: /var/lib/postgresql/data
- name: init-scripts
mountPath: /docker-entrypoint-initdb.d/01-init.sql
subPath: db1-init.sql
- name: init-scripts
mountPath: /docker-entrypoint-initdb.d/02-data.sql
subPath: db1-data.sql
volumes:
- name: db1-data
persistentVolumeClaim:
claimName: db1-data
- name: init-scripts
configMap:
name: cluster1-init-scripts
---
apiVersion: v1
kind: Service
metadata:
name: db1
namespace: cluster1
spec:
type: ClusterIP
selector:
app: db1
ports:
- name: postgres
port: 5432
targetPort: 5432

View File

@@ -0,0 +1,71 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db2
namespace: cluster1
spec:
serviceName: db2
replicas: 1
selector:
matchLabels:
app: db2
template:
metadata:
labels:
app: db2
spec:
containers:
- name: postgres
image: postgres:15-alpine
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: cluster1-postgres-secret
key: DB2_NAME
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: cluster1-postgres-secret
key: POSTGRES_USER
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: cluster1-postgres-secret
key: POSTGRES_PASSWORD
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: db2-data
mountPath: /var/lib/postgresql/data
- name: init-scripts
mountPath: /docker-entrypoint-initdb.d/01-init.sql
subPath: db2-init.sql
- name: init-scripts
mountPath: /docker-entrypoint-initdb.d/02-data.sql
subPath: db2-data.sql
volumes:
- name: db2-data
persistentVolumeClaim:
claimName: db2-data
- name: init-scripts
configMap:
name: cluster1-init-scripts
---
apiVersion: v1
kind: Service
metadata:
name: db2
namespace: cluster1
spec:
type: ClusterIP
selector:
app: db2
ports:
- name: postgres
port: 5432
targetPort: 5432

View File

@@ -0,0 +1,71 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: replica
namespace: cluster1
spec:
serviceName: replica
replicas: 1
selector:
matchLabels:
app: replica
template:
metadata:
labels:
app: replica
spec:
containers:
- name: postgres
image: postgres:15-alpine
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: replica_db
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: cluster1-postgres-secret
key: POSTGRES_USER
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: cluster1-postgres-secret
key: POSTGRES_PASSWORD
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
command:
- /bin/sh
- -c
- |
chmod +x /replication-scripts/entrypoint-replica.sh
exec /replication-scripts/entrypoint-replica.sh
volumeMounts:
- name: replica-data
mountPath: /var/lib/postgresql/data
- name: replication-scripts
mountPath: /replication-scripts
volumes:
- name: replica-data
persistentVolumeClaim:
claimName: replica-data
- name: replication-scripts
configMap:
name: cluster1-replication-scripts
defaultMode: 0755
---
apiVersion: v1
kind: Service
metadata:
name: replica
namespace: cluster1
spec:
type: ClusterIP
selector:
app: replica
ports:
- name: postgres
port: 5432
targetPort: 5432