В этом посте я собираюсь показать несколько шагов для развертывания и запуска базы данных PostgreSQL в кластере K8S на OKE .
Развертывание будет основано на postgres: 11.1 Образ Docker, для которого требуется настроить несколько переменных среды: POSTGRES_DB (имя базы данных), POSTGRES_USER и POSTGRES_PASSWORD. Я собираюсь хранить значения этих переменных в K8S ConfigMap и Secret:
1
2
3
4
5
6
|
apiVersion: v1 kind: ConfigMap metadata: name: postgre-db-config data: db-name: flexdeploy |
1
2
3
4
5
6
7
|
apiVersion: v1 kind: Secret metadata: name: postgre-db-secret stringData: username: creator password: c67 |
На эти ресурсы конфигурации K8S ссылается StatefulSet, который фактически заботится о сроке службы модуля с контейнером postgres-db :
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
apiVersion: apps/v1beta2 kind: StatefulSet metadata: name: postgre-db labels: run: postgre-db spec: selector: matchLabels: run: postgre-db serviceName: "postgre-db-svc" replicas: 1 template: metadata: labels: run: postgre-db spec: containers: - image: postgres: 11.1 volumeMounts: - mountPath: /var/lib/postgresql/data name: db env: - name: POSTGRES_DB valueFrom: configMapKeyRef: name: postgre-db-config key: db-name - name: POSTGRES_USER valueFrom: secretKeyRef: name: postgre-db-secret key: username - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgre-db-secret key: password - name: PGDATA value: /var/lib/postgresql/data/pgdata name: postgre-db ports: - containerPort: 5432 volumeClaimTemplates: - metadata: name: db spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 3Gi |
Ресурс StatefulSet K8S был специально разработан для приложений с сохранением состояния, таких как базы данных, которые сохраняют свои данные в постоянном хранилище. Чтобы определить постоянное хранилище для нашей базы данных, мы используем другой ресурс K8s Persistent Volume, и здесь в файле манифеста мы определяем заявку на создание постоянного тома 3Gi с именем db . Том называется постоянным, поскольку его срок службы не поддерживается контейнером и даже не модулем, а поддерживается кластером K8s. Таким образом, он может пережить любые контейнеры и контейнеры и сохранить данные. Это означает, что если мы уничтожим или воссоздадим контейнер, модуль или даже весь StatefulSet, данные все равно будут там. Мы ссылаемся на этот постоянный том в определении контейнера, монтирующего том по пути / var / lib / postgresql / data . Здесь контейнер PostgreSQL хранит свои данные.
Для доступа к базе данных мы собираемся создать сервис :
01
02
03
04
05
06
07
08
09
10
11
|
apiVersion: v1 kind: Service metadata: name: postgre-db-svc spec: selector: run: postgre-db ports: - port: 5432 targetPort: 5432 type: LoadBalancer |
Это служба LoadBalancer , доступная из-за пределов кластера K8S:
1
2
3
|
$ kubectl get svc postgre-db-svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE postgre-db-svc LoadBalancer 10.96 . 177.34 129.146 . 211.77 5432 : 32498 /TCP 39m |
Предполагая, что мы создали кластер K8s в OKE и наш kubectl настроен для связи с ним, мы можем применить файлы манифеста к кластеру:
1
2
3
4
|
kubectl apply -f postgre-db-config.yaml kubectl apply -f postgre-db-secret.yaml kubectl apply -f postgre-db-pv.yaml kubectl apply -f postgre-db-service.yaml |
Сделав это, мы можем подключиться к базе данных из нашей любимой IDE на нашем ноутбуке
Файлы манифеста для этого поста доступны на GitHub .
Это оно!
Опубликовано на Java Code Geeks с разрешения Евгения Федоренко, партнера нашей программы JCG . См. Оригинальную статью здесь: Запуск PostgreSQL в облаке на Oracle Containers Engine для Kubernetes Мнения, высказанные участниками Java Code Geeks, являются их собственными. |