概要
k8s 上に PostgreSQL をデプロイしたのですが初期化用の SQL スクリプト /docker-entrypoint-initdb.d/init.sql
が動作しなかったので原因を調査してみました
対処方法を紹介します
環境
- k8s v1.20.4
解決方法その1: configMap で defaultMode を指定する
基本は configMap で sql ファイルを /docker-entrypoint-initdb.d/init.sql
という感じでマウントすることになると思うのですがデフォルトだと実行権限がないので defaultMode で実行権限を付与してあげましょう
volumes:
- name: postgres-pvc
persistentVolumeClaim:
claimName: postgres-pvc
- name: postgres-config
configMap:
name: postgres-config
defaultMode: 0755
解決方法その2: データ領域のデータを一旦削除する
pvc を使ってデータを永続化した場合そのディレクトリにすでに Postgres のデータディレクトリなどが作成されていると /docker-entrypoint-initdb.d/init.sql
の実行がスキップされてしまいます
なので削除するなり再度 pvc を作成するなどして対応しましょう
参考: k8s のリソースファイル
vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
spec:
capacity:
storage: 100Mi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: postgres-sc
local:
path: /mnt/postgres
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: postgres-pvc
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
storageClassName: postgres-sc
status: {}
vim cm.yaml
apiVersion: v1
data:
init.sql: |
create user user001 with password 'xxxxxxxxxx';
create database database1 owner user001;
alter role user001 with superuser;
kind: ConfigMap
metadata:
creationTimestamp: "2021-03-01T01:37:55Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:init.sql: {}
manager: kubectl-create
operation: Update
time: "2021-03-01T01:37:55Z"
name: postgres-config
namespace: default
resourceVersion: "359270"
uid: ea4605e6-4d98-4b35-a004-dcf3688d8f63
vim deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose -f docker-compose-multi.yml convert
kompose.version: 1.22.0 (955b78124)
creationTimestamp: null
labels:
io.kompose.service: postgres
name: postgres
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: postgres
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: kompose -f docker-compose-multi.yml convert
kompose.version: 1.22.0 (955b78124)
creationTimestamp: null
labels:
io.kompose.network: "true"
io.kompose.service: postgres
spec:
containers:
- env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
- name: POSTGRES_PASSWORD
value: xxxxxxxxxx
image: postgres:11.10
name: postgres
resources: {}
volumeMounts:
- mountPath: /var/lib/postgresql/data/pgdata
name: postgres-pvc
- mountPath: /docker-entrypoint-initdb.d
name: postgres-config
nodeSelector:
kubernetes.io/hostname: node1
restartPolicy: Always
volumes:
- name: postgres-pvc
persistentVolumeClaim:
claimName: postgres-pvc
- name: postgres-config
configMap:
name: postgres-config
defaultMode: 0755
status: {}
0 件のコメント:
コメントを投稿