週末に自宅で動かしているownCloudを、Kubernetesに乗せるためにマニフェストを定義していた.
私用用途なのでPV使うまでもないかなとhostPathを使ったり、ラベルの指定もまばらで規則性がないので気が向いた時に直しておきたい.
ira-apps/owncloudで定義しているマニフェストをkustomize build
の出力結果は以下のような形です.
ファイルアップロードがされるWebアプリなので、とりあえずclient_max_body_sizeを20GBに指定しています.
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-body-size: 20G
labels:
app.kubernetes.io/component: owncloud-server
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-server
app.kubernetes.io/part-of: owncloud
name: owncloud-server
namespace: owncloud
spec:
rules:
- host: owncloud.local
http:
paths:
- backend:
serviceName: owncloud-server
servicePort: http
Service
WebアプリとDBのDeploymentを分けている都合上、Serviceもそれぞれ定義しています.
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: server
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-server
app.kubernetes.io/part-of: owncloud
name: owncloud-server
namespace: owncloud
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
selector:
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-server
app.kubernetes.io/part-of: owncloud
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: db
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-db
app.kubernetes.io/part-of: owncloud
name: owncloud-db
namespace: owncloud
spec:
ports:
- name: mysql
port: 3306
protocol: TCP
targetPort: mysql
selector:
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-db
app.kubernetes.io/part-of: owncloud
type: ClusterIP
Secret
今回は載せませんが、SealedSecretを使って定義してます.
導入は多少面倒かもしれませんが、クラウドプロパイダを利用しない場合は手軽です.
Deployment
helm/chartsにあったownCloudのマニフェストを参考にしています.
PVCを利用してソフトウェアRAIDを組んでいるディスクに書き込みたかったんですが、サクッとKubernetsに移行しておきたかったので、hostPathで動かしています.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/component: server
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-server
app.kubernetes.io/part-of: owncloud
name: server
namespace: owncloud
spec:
selector:
matchLabels:
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-server
app.kubernetes.io/part-of: owncloud
strategy:
type: Recreate
template:
metadata:
labels:
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-server
app.kubernetes.io/part-of: owncloud
spec:
containers:
- env:
- name: OWNCLOUD_DOMAIN
value: localhost
- name: OWNCLOUD_DB_TYPE
value: mysql
- name: OWNCLOUD_MYSQL_UTF8MB4
value: "true"
- name: OWNCLOUD_DB_HOST
value: owncloud-db
- name: OWNCLOUD_DB_NAME
value: owncloud
- name: OWNCLOUD_DB_USERNAME
value: owncloud
- name: OWNCLOUD_DB_PASSWORD
valueFrom:
secretKeyRef:
key: MYSQL_PASSWORD
name: owncloud-db
image: owncloud/server:10.3.2
imagePullPolicy: Always
livenessProbe:
exec:
command:
- /usr/bin/healthcheck
initialDelaySeconds: 5
periodSeconds: 30
timeoutSeconds: 10
name: owncloud-server
ports:
- containerPort: 8080
name: http
readinessProbe:
exec:
command:
- /usr/bin/healthcheck
initialDelaySeconds: 120
periodSeconds: 30
timeoutSeconds: 10
volumeMounts:
- mountPath: /mnt/data
name: owncloud-server
volumes:
- hostPath:
path: /geminos/kubernetes/owncloud/server
name: owncloud-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/component: db
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-db
app.kubernetes.io/part-of: owncloud
name: db
namespace: owncloud
spec:
selector:
matchLabels:
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-db
app.kubernetes.io/part-of: owncloud
strategy:
type: Recreate
template:
metadata:
labels:
app.kubernetes.io/instance: owncloud
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/name: owncloud-db
app.kubernetes.io/part-of: owncloud
spec:
containers:
- args:
- --default-authentication-plugin=mysql_native_password
env:
- name: MYSQL_DATABASE
value: owncloud
- name: MYSQL_USER
value: owncloud
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
key: MYSQL_PASSWORD
name: owncloud-db
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: MYSQL_ROOT_PASSWORD
name: owncloud-db
image: mysql:8
livenessProbe:
exec:
command:
- /usr/bin/mysqladmin
- -u root
- --password="${MYSQL_ROOT_PASSWORD}"
- ping
initialDelaySeconds: 5
periodSeconds: 30
timeoutSeconds: 10
name: owncloud-db
ports:
- containerPort: 3306
name: mysql
readinessProbe:
exec:
command:
- /usr/bin/mysqladmin
- -u root
- --password="${MYSQL_ROOT_PASSWORD}"
- ping
initialDelaySeconds: 5
periodSeconds: 30
timeoutSeconds: 10
volumeMounts:
- mountPath: /var/lib/mysql
name: owncloud-db
- mountPath: /var/lib/backup
name: owncloud-db-backup
volumes:
- hostPath:
path: /geminos/kubernetes/owncloud/db
name: owncloud-db
- hostPath:
path: /geminos/kubernetes/owncloud/db-backup
name: owncloud-db-backup