SUPER-G.EEK.JP

twitter: @hum_op_dev
github: ophum

minio operatorを利用してk8sにminioをインストールしてみた

目次

minio operator をインストールする

ArgoCD で helm chart からインストールします。

 1apiVersion: argoproj.io/v1alpha1
 2kind: Application
 3metadata:
 4  name: minio-operator
 5  namespace: argocd
 6spec:
 7  syncPolicy:
 8    syncOptions:
 9      - CreateNamespace=true
10  project: default
11  source:
12    chart: operator
13    repoURL: https://operator.min.io
14    targetRevision: 6.0.3
15    helm:
16      releaseName: operator
17
18  destination:
19    server: https://kubernetes.default.svc
20    namespace: minio-operator

minio をインストールする

kustomize を利用してインストールします。 以下のようなkustomization.yamlを記述し ArgoCD の Application に登録しています。

 1resources:
 2  - https://github.com/minio/operator/examples/kustomization/base/
 3  - console-ingress.yaml
 4
 5patches:
 6  - target:
 7      kind: Tenant
 8      name: myminio
 9    patch: |
10      - op: replace
11        path: /spec/pools/0/servers
12        value: 4
13      - op: replace
14        path: /spec/pools/0/volumesPerServer
15        value: 1
16      - op: replace
17        path: /spec/pools/0/volumeClaimTemplate/spec/resources/requests/storage
18        value: 5Gi
19      - op: replace
20        path: /spec/pools/0/volumeClaimTemplate/spec/storageClassName
21        value: longhorn      

patches でkind: Tenantの設定内容を変更しています。

/spec/pools/0/serversはサーバーの数を定義します。4 以上を指定する必要があります。

/spec/pools/0/volumesPerServerは 1 サーバー当たりのボリュームの数を指定します。

/spec/pools/0/volumes/0/volumeClaimTemplate/spec/resources/requests/storageはボリュームのサイズを指定します。初期値は 1Ti となっているため、ストレージの容量に合わせて変更する必要があります。

/spec/pools/0/volumeClaimTemplate/spec/storageClassNameはストレージクラスを指定します。今回の環境では longhorn を利用しているため、longhornを指定します。

console-ingress.yaml

WebUI にアクセスできるように Ingress を追加します。

 1apiVersion: networking.k8s.io/v1
 2kind: Ingress
 3metadata:
 4  name: console
 5  namespace: minio-tenant
 6  annotations:
 7    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
 8    nginx.ingress.kubernetes.io/rewrite-target: /
 9    nginx.ingress.kubernetes.io/proxy-body-size: "0"
10    nginx.ingress.kubernetes.io/server-snippet: |
11      client_max_body_size 0;      
12    nginx.ingress.kubernetes.io/configuration-snippet: |
13      chunked_transfer_encoding off;      
14spec:
15  ingressClassName: nginx
16  rules:
17    - host: minio-console.homelab.t-inagaki.net
18      http:
19        paths:
20          - path: /
21            pathType: Prefix
22            backend:
23              service:
24                name: myminio-console
25                port:
26                  number: 9443

ingress-nginx を利用しています。annotations で-snippetを利用するには、ingress-nginx のインストール時に許可する必要があります。 helm でインストールしている場合は ingresss-nginx の values.yaml に以下の項目を追加します。

1controller:
2  allowSnippetAnnotations: true

この設定は、最終的に ingress-nginx の nginx.conf に挿入される可能性があるため、Ingress をデプロイするユーザーが信頼できる場合に有効にするべきです。

ArgoCD 上での見え方

以下のように見えます。

statefulset で 4 個サーバー(pod)がうごいていることがわかります。

Minio Console

Ingress を設定したホスト名でアクセスできます。今回の環境ではminio-console.homelab.t-inagaki.net になります。

kustomization の base の設定では、ユーザー名がconsole、パスワードがconsole123になっています。 本来はここも変更するべきでした・・・

さいごに

minio-operator の example の base を読み込んでいるため、Tenant の名前が myminio になっていたりパスワードが脆弱なままだったりしますが、minio を建てることができました。

k8s 内からは minio.minio-tenant.cluster.localでアクセスすることができます。 今後は、これを使って s3 をファイルストレージとしたアプリケーションの運用などして見たいと思います。