2021年3月13日土曜日

k8s 上にデプロイした postgresql で docker-entrypoint-initdb.d が動作しない

概要

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 件のコメント:

コメントを投稿