k3s์์ ์คํ๋๋ awx-operator๋ฅผ ์ฌ์ฉํ์ฌ AWX๋ฅผ ์ค์นํ๋ ค๊ณ ํ๋๋ฐ awx-postgres ํฌ๋๊ฐ ๋ค์ ๋ฉ์์ง์ ํจ๊ป ์คํจํฉ๋๋ค.
mkdir: cannot create directory โ/var/lib/postgresql/dataโ: Permission denied
๋ด 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
๋ด๊ฐ ์ฌ๊ธฐ์ ๋ญ ์๋ชปํ๊ณ ์๋?
์ด๊ฒ ์ข ๋ด.
https://github.com/kurokobo/awx-on-k3s
์์ ๋งํฌ๋ @marwel ์ ์ ํํ ์ง์นจ์
ํ์ฌ ์คํ์ค์์๋ ์ฌํํ ์ ์์ผ๋ฏ๋ก ์ค๋ ์คํ์ k3s
๋ฅผ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, https://rancher.com/docs/k3s/latest/en/quick-start/#install -script์ ์ค๋ช
๋ ๋๋ก ํ
์คํธ ๋จธ์ ์ ๋จ์ผ ๋
ธ๋๋ก k3s
๋ฅผ ๋ฐฐํฌํ์ต๋๋ค.
$ 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
๊ทธ๋ฐ ๋ค์ ์ต์ devel
์ด์์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ณ ๋ฐฐํฌํ์ต๋๋ค.
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
์ด์์๊ฐ ์์๋๋ก ์์ํ์ต๋๋ค.
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
์ด์ ๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ด์ ์ ์ ๊ณต๋ ์ ์ฌํ AWX ์ฌ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ณด์๋ค์ํผ AWX ์ฌ์์ ๋ฐ๋ผ ์กด์ฌํ ๊ฒ์ผ๋ก ์์๋๋ PVC awx-projects-claim
์์ฑํ ์ ์๋๋ก ํ์ฅํด์ผ ํฉ๋๋ค.
---
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
๊ทธ๋ฐ ๋ค์ ํฌ๋๋ฅผ ๋ณด๋ฉด ์ถฉ๋์ด ๋ฐ์ํ์ต๋๋ค.
$ 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
๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก postgres
statefulset์ด ์๋ํ์ง ์์์ง๋ง awx
๋ ์ ๋๋ก ์๋ํ์ต๋๋ค(๋ฌผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ฝ์ผ๋ก ์ธํด ์๋ํ์ง ์์).
$ 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
๊ทธ๋ฐ ๋ค์ ์ปจํ
์ด๋๋ฅผ ๋ณด๋ฉด ๋ก์ปฌ ๊ฒฝ๋ก ์ ๊ณต์๋ฅผ ์ฌ์ฉํ์ฌ k3s
์์ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. https://github.com/ansible/awx-operator/pull/413 ๊ณผ ๋น์ทํ๊ฒ ๋ณด์ด์ง๋ง postgresql
statefulset์ ๋ํด ์ฃผ์๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
$ kubectl logs awx-postgres-0 23:26:52
mkdir: cannot create directory โ/var/lib/postgresql/dataโ: Permission denied
์์ ์ค์ ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ ์ ์๋๋ก ๊ถํ์ ์์ ํ๊ธฐ ์ํด `initContainer ์ ๊ทผ ๋ฐฉ์์ ํ์ฉํด์ผ ํฉ๋๋ค. ์ด ์ค๋ํซ์ ๋ค์ ์์ ์ ์ํํฉ๋๋ค.
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
ํจ์น๊ฐ ์ ์ฉ๋๋ฉด ์๋ ์ํ๊ฐ ๋ฉ๋๋ค.
$ 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
PR์ ์์ฑํ๊ฒ ์ต๋๋ค. @flisak-robert ๋ฐ @scott-vick ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ ๋ฐ์ดํธ ์ ์ ์์ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
์ ๋ฐ์ดํธ ์ ์ ์์ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
๊ทํ์ ์๊ตฌ์ ๋ง๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋์ปค ์ปจํ
์ด๋์์ postgres๋ฅผ ์คํํ๊ณ ๋์ ํด๋น postgres ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋๋ก awx๋ฅผ ์ง์ ํ์ต๋๋ค.
๋ด ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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
awx ๊ตฌ์ฑ์ postgres_configuration_secret: awx-postgres-configuration
๋ฅผ ํฌํจํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฅผ ๋ค์ด awx ๋
ธ๋๋ฅผ ๋ค์ ์์ํ ๋ AWX๊ฐ postgres ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ด์ฉ์ ํด๋
ํ ์ ์์ต๋๋ค. ๊ฑฐ๊ธฐ์ ์์์ด, ํด๋์ด :(
๋ด๊ฐ ์ฐพ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ PV๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: <className>
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "<path>"
๊ฒฝ๋ก์๋ chmod๋ฅผ ํตํด 777 ๊ถํ์ด ๋ถ์ฌ๋ฉ๋๋ค.
storageClassName๊ณผ ๋์ผํ ๊ฐ์ผ๋ก postgres_storage_class
์์ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ ์ ์๋๋ก ๊ถํ์ ์์ ํ๊ธฐ ์ํด `initContainer ์ ๊ทผ ๋ฐฉ์์ ํ์ฉํด์ผ ํฉ๋๋ค. ์ด ์ค๋ํซ์ ๋ค์ ์์ ์ ์ํํฉ๋๋ค.
ํจ์น๊ฐ ์ ์ฉ๋๋ฉด ์๋ ์ํ๊ฐ ๋ฉ๋๋ค.
PR์ ์์ฑํ๊ฒ ์ต๋๋ค. @flisak-robert ๋ฐ @scott-vick ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.