Awx-operator: Verwaltetes Postgres - /var/lib/postgresql/data: Berechtigung verweigert

Erstellt am 28. Juli 2021  ·  8Kommentare  ·  Quelle: ansible/awx-operator

Ich versuche, AWX mit dem awx-Operator zu installieren, der auf k3s ausgeführt wird, und der awx-postgres-Pod schlägt mit der Meldung fehl:
mkdir: cannot create directory ‘/var/lib/postgresql/data’: Permission denied
Hier ist mein awx.yml :

---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
spec:
  ingress_type: Ingress
  route_tls_termination_mechanism: edge
  hostname: localhost
  postgres_storage_requirements:
    requests:
      storage: 3Gi
  projects_persistence: true
  projects_existing_claim: awx-projects-claim
  web_resource_requirements:
    requests:
      cpu: 250m
      memory: 2Gi
    limits:
      cpu: 750m
      memory: 4Gi
  task_resource_requirements:
    requests:
      cpu: 250m
      memory: 1Gi
    limits:
      cpu: 500m
      memory: 2Gi
  ee_resource_requirements:
    requests:
      cpu: 250m
      memory: 1Gi
    limits:
      cpu: 500m
      memory: 2Gi

Was mache ich hier falsch?

bug in_progress medium operator

Hilfreichster Kommentar

Im Grunde müssen wir also einen `initContainer-Ansatz nutzen, um die Berechtigung zu korrigieren, damit die Datenbank erstellt werden kann. Dieser Ausschnitt erledigt die Aufgabe:

diff --git a/roles/installer/tasks/database_configuration.yml b/roles/installer/tasks/database_configuration.yml
index 2e99be5..470530a 100644
--- a/roles/installer/tasks/database_configuration.yml
+++ b/roles/installer/tasks/database_configuration.yml
@@ -80,8 +80,9 @@
 - block:
     - name: Create Database if no database is specified
       k8s:
-        apply: true
+        apply: yes
         definition: "{{ lookup('template', 'postgres.yaml.j2') }}"
+        wait: yes
       register: create_statefulset_result

   rescue:
diff --git a/roles/installer/templates/postgres.yaml.j2 b/roles/installer/templates/postgres.yaml.j2
index d17ee12..f87c842 100644
--- a/roles/installer/templates/postgres.yaml.j2
+++ b/roles/installer/templates/postgres.yaml.j2
@@ -37,10 +37,27 @@ spec:
       imagePullSecrets:
         - name: {{ image_pull_secret }}
 {% endif %}
+      initContainers:
+        - name: init-chmod-data
+          image: '{{ postgres_image }}:{{ postgres_image_version }}'
+          imagePullPolicy: '{{ image_pull_policy }}'
+          command:
+            - /bin/sh
+            - -c
+            - |
+              if [ ! -f {{ postgres_data_path }}/PG_VERSION ]; then
+                chown postgres:root {{ postgres_data_path | dirname }}
+              fi
+          volumeMounts:
+            - name: postgres
+              mountPath: '{{ postgres_data_path | dirname }}'
+              subPath: '{{ postgres_data_path | dirname | basename }}'
       containers:
         - image: '{{ postgres_image }}:{{ postgres_image_version }}'
           imagePullPolicy: '{{ image_pull_policy }}'
           name: postgres
+          securityContext:
+            fsGroup: 999
           env:
             # For postgres_image based on rhel8/postgresql-12
             - name: POSTGRESQL_DATABASE

Es führt zu einem funktionierenden Zustand, sobald der Patch angewendet wird:

$ ubectl get pods -w                              00:38:58
NAME                            READY   STATUS    RESTARTS   AGE
awx-operator-5bc776b4d4-d9ww2   1/1     Running   0          4m41s
awx-postgres-0                  1/1     Running   0          4m3s
awx-d67898cd9-k6jrc             4/4     Running   0          3m48s

$ kubectl iexec awx-postgres-0 /bin/bash                                                                                                                         00:57:00
root@awx-postgres-0:/# namei  -xmolv /var/lib/postgresql/data/pgdata/
f: /var/lib/postgresql/data/pgdata/
Drwxr-xr-x root     root     /
drwxr-xr-x root     root     var
drwxr-xr-x root     root     lib
drwxr-xr-x postgres postgres postgresql
Drwx------ postgres root     data
drwx------ postgres root     pgdata

Ich werde eine PR dafür erstellen. Danke für die Meldung des Problems @flisak-robert und @scott-vick

Alle 8 Kommentare

Ich befolge die genauen Anweisungen, die erhalte genau den gleichen Fehler (mkdir: Verzeichnis '/var/lib/postgresql/data' kann nicht erstellt werden: Berechtigung verweigert). Ich habe mir 4 Tage lang den Kopf zerbrochen, ohne Erfolg bei der Installation von AWX.

Ich werde es heute Nachmittag mit k3s versuchen, da ich in meinem aktuellen Labor nicht reproduzieren kann

Hallo Leute, ich habe ein k3s mit einem einzelnen Knoten auf meiner Testmaschine bereitgestellt, wie unter https://rancher.com/docs/k3s/latest/en/quick-start/#install -script beschrieben

$ kubectl get nodes                                                            
NAME              STATUS   ROLES                  AGE     VERSION
storm.tatu.home   Ready    control-plane,master   3m39s   v1.21.3+k3s1

$ kubectl get pods -A                                                                                          23:01:09
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   local-path-provisioner-5ff76fc89d-4d7bn   1/1     Running     0          9m51s
kube-system   metrics-server-86cbb8457f-9fkt2           1/1     Running     0          9m51s
kube-system   coredns-7448499f4d-9t87w                  1/1     Running     0          9m51s
kube-system   helm-install-traefik-crd-mlrtg            0/1     Completed   0          9m51s
kube-system   helm-install-traefik-v5n5s                0/1     Completed   1          9m51s
kube-system   svclb-traefik-c9cgh                       2/2     Running     0          9m28s
kube-system   traefik-97b44b794-6dz4g                   1/1     Running     0          9m28s

Dann habe ich das neueste devel Operator-Image generiert und bereitgestellt:

kubectl apply -f deploy/awx-operator.yaml                                                                     23:08:40
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com created
clusterrole.rbac.authorization.k8s.io/awx-operator created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator created
serviceaccount/awx-operator created
deployment.apps/awx-operator created

Der Operator startete wie erwartet:

kubectl get pods -A -w                                                                                       23:07:32
NAMESPACE     NAME                                      READY   STATUS              RESTARTS   AGE
kube-system   local-path-provisioner-5ff76fc89d-4d7bn   1/1     Running             0          11m
kube-system   metrics-server-86cbb8457f-9fkt2           1/1     Running             0          11m
kube-system   coredns-7448499f4d-9t87w                  1/1     Running             0          11m
kube-system   helm-install-traefik-crd-mlrtg            0/1     Completed           0          11m
kube-system   helm-install-traefik-v5n5s                0/1     Completed           1          11m
kube-system   svclb-traefik-c9cgh                       2/2     Running             0          10m
kube-system   traefik-97b44b794-6dz4g                   1/1     Running             0          10m
default       awx-operator-88b886454-9pq7w              0/1     ContainerCreating   0          15s
default       awx-operator-88b886454-9pq7w              1/1     Running             0          16s

Nun zur Fehlerbehebung, ich verwende eine ähnliche AWX-Spezifikation, die zuvor wie folgt bereitgestellt wurde. Wie Sie sehen, muss ich es erweitern, damit ich das PVC awx-projects-claim erstellen kann, das gemäß der AWX-Spezifikation erwartet wird.

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: awx-projects-claim
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 2Gi
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
spec:
  ingress_type: Ingress
  route_tls_termination_mechanism: edge
  hostname: localhost
  postgres_storage_requirements:
    requests:
      storage: 3Gi
  projects_persistence: true
  projects_existing_claim: awx-projects-claim
  web_resource_requirements:
    requests:
      cpu: 250m
      memory: 2Gi
    limits:
      cpu: 750m
      memory: 4Gi
  task_resource_requirements:
    requests:
      cpu: 250m
      memory: 1Gi
    limits:
      cpu: 500m
      memory: 2Gi
  ee_resource_requirements:
    requests:
      cpu: 250m
      memory: 1Gi
    limits:
      cpu: 500m
      memory: 2Gi
$ kubectl apply -f pg-k3s.yml                                                                                                   23:13:08
persistentvolumeclaim/awx-projects-claim created
awx.awx.ansible.com/awx created

# still pending because POD has not started yet
$ kubectl get pvc                                                                                                               23:14:05
NAME                      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
awx-projects-claim        Pending                                                                        local-path     23s
postgres-awx-postgres-0   Bound     pvc-3b9e6563-9085-4d79-90ba-fa6c88431c6c   3Gi        RWO            local-path     4s

Als ich dann auf die Kapsel schaute, brachte ich sie zum Absturz

$ sh kubectl get pods -A -w                                                                                       23:07:32
NAMESPACE     NAME                                      READY   STATUS              RESTARTS   AGE
kube-system   local-path-provisioner-5ff76fc89d-4d7bn   1/1     Running             0          11m
kube-system   metrics-server-86cbb8457f-9fkt2           1/1     Running             0          11m
kube-system   coredns-7448499f4d-9t87w                  1/1     Running             0          11m
kube-system   helm-install-traefik-crd-mlrtg            0/1     Completed           0          11m
kube-system   helm-install-traefik-v5n5s                0/1     Completed           1          11m
kube-system   svclb-traefik-c9cgh                       2/2     Running             0          10m
kube-system   traefik-97b44b794-6dz4g                   1/1     Running             0          10m
default       awx-operator-88b886454-9pq7w              0/1     ContainerCreating   0          15s
default       awx-operator-88b886454-9pq7w              1/1     Running             0          16s



default       awx-postgres-0                            0/1     Pending             0          0s
kube-system   helper-pod-create-pvc-3b9e6563-9085-4d79-90ba-fa6c88431c6c   0/1     Pending             0          0s
kube-system   helper-pod-create-pvc-3b9e6563-9085-4d79-90ba-fa6c88431c6c   0/1     ContainerCreating   0          0s
kube-system   helper-pod-create-pvc-3b9e6563-9085-4d79-90ba-fa6c88431c6c   0/1     Completed           0          3s
kube-system   helper-pod-create-pvc-3b9e6563-9085-4d79-90ba-fa6c88431c6c   0/1     Terminating         0          3s
kube-system   helper-pod-create-pvc-3b9e6563-9085-4d79-90ba-fa6c88431c6c   0/1     Terminating         0          3s
default       awx-postgres-0                                               0/1     Pending             0          4s
default       awx-postgres-0                                               0/1     ContainerCreating   0          4s
default       awx-76bdfc954c-jxvll                                         0/4     Pending             0          0s
kube-system   helper-pod-create-pvc-85b1b705-43b3-42a6-a96b-1e79943e99d5   0/1     Pending             0          0s
kube-system   helper-pod-create-pvc-85b1b705-43b3-42a6-a96b-1e79943e99d5   0/1     ContainerCreating   0          0s
default       awx-postgres-0                                               1/1     Running             0          15s
kube-system   helper-pod-create-pvc-85b1b705-43b3-42a6-a96b-1e79943e99d5   0/1     Completed           0          6s
kube-system   helper-pod-create-pvc-85b1b705-43b3-42a6-a96b-1e79943e99d5   0/1     Terminating         0          7s
kube-system   helper-pod-create-pvc-85b1b705-43b3-42a6-a96b-1e79943e99d5   0/1     Terminating         0          7s
default       awx-postgres-0                                               0/1     Error               0          16s
default       awx-76bdfc954c-jxvll                                         0/4     Pending             0          7s
default       awx-76bdfc954c-jxvll                                         0/4     Init:0/1            0          8s
default       awx-postgres-0                                               0/1     Error               1          18s
default       awx-postgres-0                                               0/1     CrashLoopBackOff    1          18s
default       awx-76bdfc954c-jxvll                                         0/4     PodInitializing     0          18s
default       awx-postgres-0                                               1/1     Running             2          35s
default       awx-postgres-0                                               0/1     Error               2          35s
default       awx-postgres-0                                               0/1     CrashLoopBackOff    2          48s
default       awx-postgres-0                                               0/1     Error               3          64s
default       awx-postgres-0                                               0/1     CrashLoopBackOff    3          77s
default       awx-76bdfc954c-jxvll                                         4/4     Running             0          111s
default       awx-postgres-0                                               0/1     CrashLoopBackOff    4          2m11s

Also im Grunde hat das postgres Statefulset nicht funktioniert, aber das awx funktioniert (natürlich nicht funktionsfähig wegen der fehlenden Datenbank)

$ kubectl get pvc
NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
postgres-awx-postgres-0   Bound    pvc-3b9e6563-9085-4d79-90ba-fa6c88431c6c   3Gi        RWO            local-path     2m37s
awx-projects-claim        Bound    pvc-85b1b705-43b3-42a6-a96b-1e79943e99d5   2Gi        RWO            local-path     2m56s

$ kubectl get pods                                                                                       23:17:32
NAME                           READY   STATUS    RESTARTS   AGE
awx-operator-88b886454-9pq7w   1/1     Running   0          8m47s
awx-76bdfc954c-jxvll           4/4     Running   0          3m21s
awx-postgres-0                 0/1     Error     5          3m30s

Wenn ich mir dann den Container ansehe, habe ich den gleichen Fehler bei k3s mit dem local-path-provisioner erhalten. Es sieht ähnlich aus wie https://github.com/ansible/awx-operator/pull/413 , wir müssen es jedoch für das Statefulset postgresql adressieren.

$ kubectl logs awx-postgres-0                                                                       23:26:52
mkdir: cannot create directory ‘/var/lib/postgresql/data’: Permission denied

Ich arbeite dran.

Im Grunde müssen wir also einen `initContainer-Ansatz nutzen, um die Berechtigung zu korrigieren, damit die Datenbank erstellt werden kann. Dieser Ausschnitt erledigt die Aufgabe:

diff --git a/roles/installer/tasks/database_configuration.yml b/roles/installer/tasks/database_configuration.yml
index 2e99be5..470530a 100644
--- a/roles/installer/tasks/database_configuration.yml
+++ b/roles/installer/tasks/database_configuration.yml
@@ -80,8 +80,9 @@
 - block:
     - name: Create Database if no database is specified
       k8s:
-        apply: true
+        apply: yes
         definition: "{{ lookup('template', 'postgres.yaml.j2') }}"
+        wait: yes
       register: create_statefulset_result

   rescue:
diff --git a/roles/installer/templates/postgres.yaml.j2 b/roles/installer/templates/postgres.yaml.j2
index d17ee12..f87c842 100644
--- a/roles/installer/templates/postgres.yaml.j2
+++ b/roles/installer/templates/postgres.yaml.j2
@@ -37,10 +37,27 @@ spec:
       imagePullSecrets:
         - name: {{ image_pull_secret }}
 {% endif %}
+      initContainers:
+        - name: init-chmod-data
+          image: '{{ postgres_image }}:{{ postgres_image_version }}'
+          imagePullPolicy: '{{ image_pull_policy }}'
+          command:
+            - /bin/sh
+            - -c
+            - |
+              if [ ! -f {{ postgres_data_path }}/PG_VERSION ]; then
+                chown postgres:root {{ postgres_data_path | dirname }}
+              fi
+          volumeMounts:
+            - name: postgres
+              mountPath: '{{ postgres_data_path | dirname }}'
+              subPath: '{{ postgres_data_path | dirname | basename }}'
       containers:
         - image: '{{ postgres_image }}:{{ postgres_image_version }}'
           imagePullPolicy: '{{ image_pull_policy }}'
           name: postgres
+          securityContext:
+            fsGroup: 999
           env:
             # For postgres_image based on rhel8/postgresql-12
             - name: POSTGRESQL_DATABASE

Es führt zu einem funktionierenden Zustand, sobald der Patch angewendet wird:

$ ubectl get pods -w                              00:38:58
NAME                            READY   STATUS    RESTARTS   AGE
awx-operator-5bc776b4d4-d9ww2   1/1     Running   0          4m41s
awx-postgres-0                  1/1     Running   0          4m3s
awx-d67898cd9-k6jrc             4/4     Running   0          3m48s

$ kubectl iexec awx-postgres-0 /bin/bash                                                                                                                         00:57:00
root@awx-postgres-0:/# namei  -xmolv /var/lib/postgresql/data/pgdata/
f: /var/lib/postgresql/data/pgdata/
Drwxr-xr-x root     root     /
drwxr-xr-x root     root     var
drwxr-xr-x root     root     lib
drwxr-xr-x postgres postgres postgresql
Drwx------ postgres root     data
drwx------ postgres root     pgdata

Ich werde eine PR dafür erstellen. Danke für die Meldung des Problems @flisak-robert und @scott-vick

Gibt es eine vorübergehende Lösung vor dem Update?

Gibt es eine vorübergehende Lösung vor dem Update?

Ich weiß nicht, ob es Ihren Anforderungen entspricht, aber ich habe gerade postgres in einem Docker-Container ausgeführt und awx darauf hingewiesen, stattdessen diese postgres-Instanz zu verwenden.
Hier ist meine Konfiguration:

apiVersion: v1
kind: Secret
metadata:
  name: awx-postgres-configuration
  namespace: awx
stringData:
  host: <postgres address>
  port: "5432"
  database: awx
  username: postgres
  password: <postgres password>
  type: unmanaged
type: Opaque

Vergessen Sie nicht, postgres_configuration_secret: awx-postgres-configuration in Ihre awx-Konfiguration aufzunehmen. Wenn Sie dies nicht tun, kann AWX beispielsweise beim Neustart Ihres Awx-Knotens keine Inhalte in Ihrer Postgres-Datenbank entschlüsseln. Kenne ich schon :(

Eine Problemumgehung, die ich gefunden habe, besteht darin, ein PV zu erstellen:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: <className>
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "<path>"

Der Pfad wird über chmod die 777-Berechtigung erhalten.
Sie müssen das Attribut postgres_storage_class mit demselben Wert wie storageClassName hinzufügen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen