В этом посте я собираюсь показать несколько шагов для развертывания и запуска базы данных PostgreSQL в кластере K8S на OKE .
Развертывание будет основано на postgres: 11.1 Образ Docker, для которого требуется настроить несколько переменных среды: POSTGRES_DB (имя базы данных), POSTGRES_USER и POSTGRES_PASSWORD. Я собираюсь хранить значения этих переменных в K8S ConfigMap и Secret:
|
1
2
3
4
5
6
|
apiVersion: v1kind: ConfigMapmetadata: name: postgre-db-configdata: db-name: flexdeploy |
|
1
2
3
4
5
6
7
|
apiVersion: v1kind: Secretmetadata: name: postgre-db-secretstringData: 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/v1beta2kind: StatefulSetmetadata: name: postgre-db labels: run: postgre-dbspec: 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: v1kind: Servicemetadata: 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-svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEpostgre-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.yamlkubectl apply -f postgre-db-secret.yamlkubectl apply -f postgre-db-pv.yamlkubectl apply -f postgre-db-service.yaml |
Сделав это, мы можем подключиться к базе данных из нашей любимой IDE на нашем ноутбуке

Файлы манифеста для этого поста доступны на GitHub .
Это оно!
|
Опубликовано на Java Code Geeks с разрешения Евгения Федоренко, партнера нашей программы JCG . См. Оригинальную статью здесь: Запуск PostgreSQL в облаке на Oracle Containers Engine для Kubernetes Мнения, высказанные участниками Java Code Geeks, являются их собственными. |