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?
Schau dir das an.
https://github.com/kurokobo/awx-on-k3s
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.
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:
Es führt zu einem funktionierenden Zustand, sobald der Patch angewendet wird:
Ich werde eine PR dafür erstellen. Danke für die Meldung des Problems @flisak-robert und @scott-vick