From bc3f243056c90a497fcd25bff7cd03ce7c2c7228 Mon Sep 17 00:00:00 2001 From: Amarpreet Minhas Date: Sat, 31 Dec 2022 03:00:39 +0000 Subject: [PATCH] Migrate nextcloud to k8s --- helm/apps/nextcloud/external-secrets.yaml | 76 +++++++++++++++++++ helm/apps/nextcloud/install.sh | 39 ++++++++++ .../apps/nextcloud/istio-ingress.yaml | 56 +------------- helm/apps/nextcloud/pvc.yaml | 12 +++ helm/apps/nextcloud/values.yaml | 53 +++++++++++++ 5 files changed, 182 insertions(+), 54 deletions(-) create mode 100644 helm/apps/nextcloud/external-secrets.yaml create mode 100755 helm/apps/nextcloud/install.sh rename external-services/nextcloud.yaml => helm/apps/nextcloud/istio-ingress.yaml (50%) create mode 100644 helm/apps/nextcloud/pvc.yaml create mode 100644 helm/apps/nextcloud/values.yaml diff --git a/helm/apps/nextcloud/external-secrets.yaml b/helm/apps/nextcloud/external-secrets.yaml new file mode 100644 index 0000000..fff1207 --- /dev/null +++ b/helm/apps/nextcloud/external-secrets.yaml @@ -0,0 +1,76 @@ +--- +apiVersion: v1 +kind: Secret +type: kubernetes.io/service-account-token +metadata: + name: serviceaccounttoken + namespace: nextcloud + annotations: + kubernetes.io/service-account.name: "nextcloud" +... +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: nextcloud-tokenreview-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:auth-delegator +subjects: +- kind: ServiceAccount + name: nextcloud + namespace: nextcloud +... +--- +apiVersion: external-secrets.io/v1beta1 +kind: SecretStore +metadata: + name: nextcloud + namespace: nextcloud +spec: + provider: + vault: + server: "https://vault.service.masked.name:8200" + path: "kv" + version: "v2" + caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUROVENDQWgyZ0F3SUJBZ0lVWXA4eG81dDJsSkZQM1NpRDFmSmlyZ0dVUUowd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0ZqRVVNQklHQTFVRUF4TUxiV0Z6YTJWa0xtNWhiV1V3SGhjTk1qQXdPREk1TVRreU16RXlXaGNOTXpBdwpPREkzTVRreU16UXlXakFXTVJRd0VnWURWUVFERXd0dFlYTnJaV1F1Ym1GdFpUQ0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNSTdvUitLSHZ2em5mbmFBWERNTzVxcFNUQ0FZQ3lmakZFb2hZSmYKbE9jbkxPTlhiM2Y2c1A1ZDFlbHRMK1VUcTBSVlU1VVAwYU5XN2hxRFRhNDFNUncwSkNEdEI2OHlLZFlxMmhaZgo5N2dBK2xqM01FSlU2UlRBS0xyZzc1R1JoL0FiTkVJZ3d2UHVIS1c2aE1idHdPeU05REZVLy9XM3hwdXNhbFh5ClJNRnpBSGZTRGo5Y2krVXlnVXQ5SElOV2QvU21NR0cvOFBnaGFSaGZFNDR3UkZNcVllemVsaUl0MkpJczQzQlYKN0hxRzBPZXY5V1BlWG1pYVpVWUtRZXRIaVFxUjE0TXhpdjFJR3pDbXd3Tis5YjR0WnRaVGE1OG9NNWRQWGZiYgpsckVMUUU1T3NQYU50TXRFUjNNZ3hvdkROM1ZTQ0dIL08vR3lhRVdWYW5ZNVVGOENBd0VBQWFON01Ia3dEZ1lEClZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGQlk4alczZkRWVXAKVVJ0MXByaG1ETWprVmlrZ01COEdBMVVkSXdRWU1CYUFGQlk4alczZkRWVXBVUnQxcHJobURNamtWaWtnTUJZRwpBMVVkRVFRUE1BMkNDMjFoYzJ0bFpDNXVZVzFsTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBV1F6NGQzUXpFClc4TkdBMTZaUGFtbFZ1Yk9MQjVEdFp6MnFyU3JuM0RlT2JMSURTaEluVjNxdFJsRHg5SFlKTFRDQTc1S2V0MEoKTlRzeU1jVHkydHhkNEk4aGdkRjMwWEplRWNpTjl3WjBtS0VlUC9ZS0R3ZThWMlh3V3E0WFlrRGVjaGxXSHBabwpQZldjb0xwckt3VlVJNEh6YXFrTm13Y21NVUk0eEFzQytTTGUxbXJlYnNlS200OW9Pd2RRcy9vUFZMSyswbkVwClJ2RDBhT3ZvaElMSWEvMlp0S2N6dmhCL0wzZm81cGc5RXgvMEpEQmRESEllZE1hYkQzcW44SWRzZStQNURmd2EKSnUyQ3R5YituMVRUUHhSRE14czJjRmJBNWlycisyQVJKZDhqdEdTKzFmeXhvZ2pPV1MxUlI1MjNGK3FJUzNzdQpLaWJHZWwrZ0ZQcHEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDB6Q0NBcnVnQXdJQkFnSVVNNTJ1aFhTZVRDaW0xcG16dWNtL2NuSWdOcDh3RFFZSktvWklodmNOQVFFTApCUUF3RmpFVU1CSUdBMVVFQXhNTGJXRnphMlZrTG01aGJXVXdIaGNOTWpBd09ESTVNVGt5TnpBd1doY05NalV3Ck9ESTRNVGt5TnpNd1dqQXRNU3N3S1FZRFZRUURFeUp0WVhOclpXUXVibUZ0WlNCSmJuUmxjbTFsWkdsaGRHVWcKUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE4THVHbytBcwpJQ1lXZEpqQkNZMHNuRi9YK2pGMXRkY3JRek5pUktFU0ViNWRzRGl5OTc5YnVnQ2JsUFFEUStnNVdHcVhYNHBqClV5WlpFM1p3aE91ZklTbEdLMG93MWFNanFTK3BGbFE4NUtSRC9qVXRMUFJVSnVRRittMll3SWQvTWc2L0I3UWsKZDE2NnVKa054UytNR1pDaTJPWVhlb2l2bk9ZN1EwS2ovMHZJYmM1VnQza0NSVmcybGpMU1Fob0JkKzg1QUhNUgpqZVJqWk1lWUVZRjJIVFZ3cmc0RHJDL3IwME1WdERjTnFzNitNN1laL3J6bnk3M0d2ZkpXZldvQjFDNHBpWmxnCmZ2VWNTREw1SEFoaml1NWNTZUlSN0RUdVZ4N3Q0UG9LNkFxVWtQeWdEdHExWmFMeWJYVDdYNmQwNzJkUjVBWE8KbldGTFBhYUdKOTc5aXdJREFRQUJvNElCQURDQi9UQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVJa2hWWUJhSzlDY3ZYRzhGTTJqS1ZaMTZvWkF3SHdZRFZSMGpCQmd3CkZvQVVGanlOYmQ4TlZTbFJHM1dtdUdZTXlPUldLU0F3VVFZSUt3WUJCUVVIQVFFRVJUQkRNRUVHQ0NzR0FRVUYKQnpBQ2hqVm9kSFJ3T2k4dmRtRjFiSFF1WTI5c2RXMWlhV0V1YldGemEyVmtMbTVoYldVNk9ESXdNQzkyTVM5dwphMmxmY205dmRDOWpZVEJIQmdOVkhSOEVRREErTUR5Z09xQTRoalpvZEhSd09pOHZkbUYxYkhRdVkyOXNkVzFpCmFXRXViV0Z6YTJWa0xtNWhiV1U2T0RJd01DOTJNUzl3YTJsZmNtOXZkQzlqY213d0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnRUJBSzZITWdSK2hwd2paQ21mNU5zekRTSHI3ZFlLWlhQNExyY0hQV3M5NG5MTTMzVVo1NzJ1YkdIcwpkS2pSdzhZRDBjbmNyc3lwc1ltRWdSNTdVK0RIa3lzMzk0d2tiN1VPd3kxWnZkNUlJUlhkUDBjRHlsejBRenFNCkFQblFZTitpc21rb2xqaGs5ZXkwUWJvM0NtUGpNK1VRY0F4dVpRdEE0TStyaUMxK2prdWRlMXVZTDBzekM2WTkKNEtldGZ2Yk5rZWRTYVY1eUphUktDQmhSY0M0L0dqcEJHL29kUS81QWZCUEFGalpxaGNJSldCclZZYlRRVkM3OQpoTUExaXdXSlBtVDlMc2pNU1VmeEZUUHp4Um5OWFFpS0Z6NWtUMk9pUzFucWg4YU9jeVU5WUM5Mjhwa2lmTkpWCktva3VEZXpKRk03aWUzZCtFY0JrMVY5bEh3T1dkdG89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + auth: + kubernetes: + mountPath: "k8s-teapot" + role: "nextcloud" + secretRef: + name: "serviceaccounttoken" +... +--- +apiVersion: external-secrets.io/v1beta1 +kind: ExternalSecret +metadata: + name: nextcloud + namespace: nextcloud +spec: + secretStoreRef: + name: nextcloud + kind: SecretStore + data: + - secretKey: username + remoteRef: + key: nextcloud + property: username + - secretKey: password + remoteRef: + key: nextcloud + property: password + - secretKey: db_username + remoteRef: + key: nextcloud + property: db_username + - secretKey: db_password + remoteRef: + key: nextcloud + property: db_password + - secretKey: serverinfo_token + remoteRef: + key: nextcloud + property: serverinfo_token +... diff --git a/helm/apps/nextcloud/install.sh b/helm/apps/nextcloud/install.sh new file mode 100755 index 0000000..be96ff2 --- /dev/null +++ b/helm/apps/nextcloud/install.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +CHART_VERSION=3.3.6 +NAMESPACE=nextcloud +VAULT_AUTH_NAMESPACE="k8s-teapot" + +helm repo add nextcloud https://nextcloud.github.io/helm/ +helm repo update + +kubectl create ns nextcloud +kubectl create serviceaccount -n ${NAMESPACE} nextcloud +cat << EOH > nextcloud.hcl +path "kv/data/nextcloud" { + capabilities = ["read"] +} +EOH +vault policy write nextcloud nextcloud.hcl +rm nextcloud.hcl +HOST_IP=$(ip addr show eth0 | grep -Po 'inet \K[\d.]+') +TOKEN="$(kubectl get secret serviceaccounttoken -n nextcloud -o go-template='{{ .data.token }}' | base64 -d)" + +vault write auth/${VAULT_AUTH_NAMESPACE}/role/nextcloud \ + bound_service_account_names=nextcloud \ + bound_service_account_namespaces=nextcloud \ + policies=nextcloud \ + ttl=24h + +vault write auth/${VAULT_AUTH_NAMESPACE}/login role=nextcloud jwt=${TOKEN} iss=https://${HOST_IP}:6443 + +kubectl apply -n ${NAMESPACE} -f external-secrets.yaml +kubectl apply -n ${NAMESPACE} -f pvc.yaml + +helm upgrade --install \ + nextcloud \ + nextcloud/nextcloud \ + -f values.yaml \ + -n ${NAMESPACE} \ + --version ${CHART_VERSION} \ + --cleanup-on-fail diff --git a/external-services/nextcloud.yaml b/helm/apps/nextcloud/istio-ingress.yaml similarity index 50% rename from external-services/nextcloud.yaml rename to helm/apps/nextcloud/istio-ingress.yaml index 08b4cec..65f9f15 100644 --- a/external-services/nextcloud.yaml +++ b/helm/apps/nextcloud/istio-ingress.yaml @@ -1,36 +1,4 @@ --- -apiVersion: v1 -kind: Service -metadata: - name: nextcloud - namespace: external-services -spec: - type: ClusterIP - ports: - - name: http - port: 80 -... ---- -apiVersion: discovery.k8s.io/v1 -kind: EndpointSlice -metadata: - name: nextcloud - namespace: external-services - labels: - kubernetes.io/service-name: nextcloud -addressType: IPv4 -ports: - - name: http - appProtocol: http - protocol: TCP - port: 28713 -endpoints: - - addresses: - - "192.168.0.12" - conditions: - ready: true -... ---- apiVersion: cert-manager.io/v1 kind: Certificate metadata: @@ -51,7 +19,7 @@ apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: nextcloud-gateway - namespace: external-services + namespace: nextcloud spec: selector: istio: ingressgateway @@ -68,30 +36,10 @@ spec: ... --- apiVersion: networking.istio.io/v1beta1 -kind: ServiceEntry -metadata: - name: nextcloud - namespace: external-services -spec: - hosts: - - nextcloud.minhas.io - addresses: - - 0.0.0.0/0 - ports: - - number: 28713 - name: nextcloud - protocol: HTTP - location: MESH_EXTERNAL - resolution: STATIC - endpoints: - - address: 192.168.0.12 -... ---- -apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: nextcloud-gateway - namespace: external-services + namespace: nextcloud spec: hosts: - nextcloud.minhas.io diff --git a/helm/apps/nextcloud/pvc.yaml b/helm/apps/nextcloud/pvc.yaml new file mode 100644 index 0000000..b2e9b65 --- /dev/null +++ b/helm/apps/nextcloud/pvc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: nextcloud + namespace: nextcloud +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn-retain + resources: + requests: + storage: 10Gi diff --git a/helm/apps/nextcloud/values.yaml b/helm/apps/nextcloud/values.yaml new file mode 100644 index 0000000..d0ca616 --- /dev/null +++ b/helm/apps/nextcloud/values.yaml @@ -0,0 +1,53 @@ +--- +image: + flavor: fpm +nextcloud: + host: nextcloud.minhas.io + update: 1 + existingSecret: + enabled: true + secretName: nextcloud + usernameKey: username + passwordKey: password + tokenKey: serverinfo_token + containerPort: 80 + datadir: /var/www/html/data + defaultConfigs: + redis.config.php: false + smtp.config.php: false + +service: + type: ClusterIP + port: 80 + +replicaCount: 1 +persistence: + enabled: true + existingClaim: "nextcloud" + +internalDatabase: + enabled: false + +externalDatabase: + type: postgresql + host: sedan.minhas.io + existingSecret: + enabled: true + secretName: nextcloud + usernameKey: db_username + passwordKey: db_password + +nginx: + enabled: true + +phpClientHttpsFix: + enabled: true + protocol: https + +livenessProbe: + enabled: false +readinessProbe: + enabled: false +startupProbe: + enabled: false +