文档地址:​​https://github.com/minio/operator/blob/master/README.md​​​

​https://docs.min.io/minio/k8s/deployment/deploy-minio-operator.html​​​

MinIO是Kubernetes原生的高性能对象存储,具有S3兼容的API。MinIO Kubernetes运营商支持将MinIO租户部署到私有和公共云基础设施(“混合”云)。

结构

每个MinIO租户代表Kubernetes集群中的一个独立MinIO对象存储。下图描述了部署到Kubernetes的MinIO租户的体系结构:

MinIO对接k8s使用_github

MinIO提供了多种访问和管理MinIO租户的方法:

MinIO Console

MinIO控制台提供了一个图形用户界面(GUI),用于与MinIO租户进行交互。默认情况下,MinIO操作员为每个租户安装和配置控制台。

MinIO对接k8s使用_html_02

MinIO租户的管理员可以通过控制台执行各种任务,包括用户创建、策略配置和bucket复制。控制台还提供租户运行状况、使用情况和恢复状态的高级视图。

MinIO Operator and kubectl Plugin

MinIO Operator 扩展了Kubernetes API,以支持在Kubernetes集群中作为租户部署特定于MinIO的资源。

MinIO-kubectl MinIO插件包装了运营商,通过kubectl命令行工具为Kubernetes集群中部署和管理MinIO租户提供了一个简化的界面。

Deploy the MinIO Operator and Create a Tenant

此过程将安装MinIO操作符并创建一个4节点MinIO租户,以支持Kubernetes群集中的对象存储操作。

k8s版本要求

Kubernetes 1.19 or Later,必须将Kubernetes群集升级到1.19.0或更高版本才能使用Operator v4.0.0+。

Starting with Operator v4.0.0, MinIO requires Kubernetes version 1.19.0 or later. Previous versions of the Operator supported Kubernetes 1.17.0 or later. You must upgrade your Kubernetes cluster to 1.19.0 or later to use Operator v4.0.0+.

此过程假设主机安装了kubectl,并配置了对目标Kubernetes群集的访问权限。

安装k8s插件 krew

# yum -y install git
# (复制如下命令执行,包含括号)
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)

# vim .bashrc
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

# 运行kubectl krew检查安装情况

k8s中创建名称空间,MinIO Tenant Namespace

MinIO支持每个命名空间不超过一个MinIO租户。下面的kubectl命令为MinIO租户创建一个新的名称空间。MinIO Operator Console支持在租户创建过程中创建名称空间。

# kubectl create namespace minio-tenant
namespace/minio-tenant created

租户存储类

作为部署MinIO租户的一部分,MinIO Kubernetes运营商会自动生成持久卷声明(PVC)。

该插件默认使用默认的Kubernetes存储类创建每个PVC。如果默认存储类无法支持生成的PVC,租户可能无法部署。

MinIO租户要求StorageClass将volumeBindingMode设置为WaitForFirstConsumer。默认的StorageClass可能会使用立即设置,这可能会在PVC绑定过程中导致复杂性。MinIO强烈建议创建一个定制StorageClass,供支持MinIO租户的PV使用。

以下StorageClass对象包含支持使用​​MinIO DirectCSI托管驱动器​​ 的MinIO租户的适当字段:

这里是用MinIO DirectCSI托管驱动器创建的StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: direct-csi-min-io
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

租户持久卷

MinIO运营商为租户中的每个卷生成一个持久卷声明(PVC),再加上两个PVC,以支持收集租户指标和日志。集群必须有足够的持久卷,以满足每个PVC的容量要求,以便租户正确启动。例如,部署一个拥有16个卷的租户需要18(16+2)。如果每个PVC要求1TB的容量,则每个PV还必须提供至少1TB的容量。

MinIO建议使用MinIO DirectCSI驱动程序从本地连接的驱动器自动配置持久卷。本过程假设安装并配置了MinIO DirectCSI。

对于无法部署MinIO DirectCSI的群集,请使用本地持久卷。以下示例YAML描述了一个本地持久卷:

apiVersion: v1
kind: PersistentVolume
metadata:
name: <PV-NAME>
spec:
capacity:
storage: 1Ti
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: </mnt/disks/ssd1>
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- <NODE-NAME>

将括号​​<VALUE>​​中的值替换为本地驱动器的适当值。

通过将租户中minio服务器吊舱的数量乘以每个节点的驱动器数量,可以估计PVC的数量。例如,每个节点有4个驱动器的4节点租户需要16个PVC,因此需要16个PV。

MinIO强烈建议使用以下CSI驱动程序创建本地PV,以确保最佳对象存储性能:

证书有关

MinIO Operator 自动生成TLS证书签名请求(CSR)并使用Kubernetes证书。certificates.k8s.io TLS证书管理API,用于创建已签名的TLS证书。

因此,MinIO操作员要求Kubernetes kube控制器管理器配置包括以下配置设置:

  • --cluster-signing-key-file: 指定用于签名群集范围证书的PEM编码RSA或ECDSA私钥。
  • --cluster-signing-cert-file: 指定用于颁发群集范围证书的PEM编码的x.509证书颁发机构证书。

如果Kubernetes群集未配置为响应生成的CSR,则操作员无法完成初始化。默认情况下,某些Kubernetes提供程序不指定这些配置值。

要验证kube controller manager是否具有所需的设置,请使用以下命令。将​​集群名称-当前主机名​​替换为Kubernetes群集的名称:

kubectl get pod kube-controller-manager-集群名称-当前主机名 -n kube-system -o yaml

# 查询具体的pod
]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
......
kube-controller-manager-develop-master-1 1/1 Running 2 84d
......

# 再查询
kubectl get pod kube-controller-manager-develop-master-1 -n kube-system -o yaml

确认输出包含高亮显示的行。上述示例命令的输出可能与终端中的输出不同:

MinIO对接k8s使用_html_03

MinIO操作员使用指定的证书颁发机构(CA)为所有MinIO租户POD自动生成TLS证书。Kubernetes群集外部的客户端必须信任Kubernetes群集CA才能连接到MinIO运营商或MinIO租户。无法信任Kubernetes群集CA的客户端可以尝试禁用连接到MinIO运营商或MinIO租户的TLS验证。或者,您可以生成由已知且受信任的CA签名的x.509 TLS证书,并将这些证书传递给MinIO租户。有关更完整的文档,请参阅MinIO对象存储的用户生成的TLS证书。

操作步骤

Install the MinIO Kubernetes Operator

运行以下命令,使用Kubernetes krew插件管理器安装MinIO操作符和插件:

# 如下这两步操作是在线更新插件列表和安装插件,需要连接github,因为网络问题,导致无法访问,因此这俩命令可以不用执行,改成使用下面的直接下载二进制文件来操作

# kubectl krew update
W0316 10:03:24.732181 22170 update.go:168] failed to update index "default": fetch index at "/root/.krew/index/default" failed: command execution failure, output="fatal: unable to access 'https://github.com/kubernetes-sigs/krew-index.git/': Encountered end of file\n": exit status 128
failed to update the following indexes: default
: fetch index at "/root/.krew/index/default" failed: command execution failure, output="fatal: unable to access 'https://github.com/kubernetes-sigs/krew-index.git/': Encountered end of file\n": exit status 128

# kubectl krew install minio
W0316 10:10:54.231193 48472 update.go:168] failed to update index "default": fetch index at "/root/.krew/index/default" failed: command execution failure, output="fatal: unable to access 'https://github.com/kubernetes-sigs/krew-index.git/': Encountered end of file\n": exit status 128
failed to update the following indexes: default
: fetch index at "/root/.krew/index/default" failed: command execution failure, output="fatal: unable to access 'https://github.com/kubernetes-sigs/krew-index.git/': Encountered end of file\n": exit status 128

还可以直接下载kubectl minio插件,并将其安装到您的系统路径。以下代码下载MinIO Kubernetes插件的最新稳定版本4.4.11,并将其安装到系统​​$PATH​​中:

wget https://github.com/minio/operator/releases/download/v4.4.4/kubectl-minio_4.4.4_linux_amd64 -O kubectl-minio
chmod +x kubectl-minio
mv kubectl-minio /usr/local/bin/

运行以下命令以验证插件的安装:

# kubectl minio version
v4.4.11

Initialize the MinIO Kubernetes Operator

运行kubectl minio init命令初始化minio运算符:

# kubectl minio init
namespace/minio-operator created
serviceaccount/minio-operator created
clusterrole.rbac.authorization.k8s.io/minio-operator-role created
clusterrolebinding.rbac.authorization.k8s.io/minio-operator-binding created
customresourcedefinition.apiextensions.k8s.io/tenants.minio.min.io created
service/operator created
deployment.apps/minio-operator created
serviceaccount/console-sa created
clusterrole.rbac.authorization.k8s.io/console-sa-role created
clusterrolebinding.rbac.authorization.k8s.io/console-sa-binding created
configmap/console-env created
service/console created
deployment.apps/console created
-----------------

To open Operator UI, start a port forward using this command:

kubectl minio proxy -n minio-operator

-----------------

该命令使用以下默认设置初始化MinIO运算符:

  • 将操作符部署到minio-operator命名空间中。指定​​kubectl minio init--namespace​​参数,将运算符部署到不同的命名空间中。
  • 使用 cluster.local 在配置操作员的DNS主机名时,本地作为群集域。指定​​kubectl minio init--cluster domain​​参数以设置其他群集域值。

记录初始化MinIO运算符时使用的所有参数。

Validate the Operator Installation

要验证安装,请运行以下命令:

# kubectl get all --namespace minio-operator
NAME READY STATUS RESTARTS AGE
pod/console-58b7dc8856-gzrqt 1/1 Running 0 2m55s
pod/minio-operator-849f8cf8b8-sjbss 1/1 Running 0 2m55s
pod/minio-operator-849f8cf8b8-v5lzn 1/1 Running 0 2m55s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/console ClusterIP 172.16.13.10 <none> 9090/TCP,9443/TCP 2m55s
service/operator ClusterIP 172.16.118.243 <none> 4222/TCP 2m55s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/console 1/1 1 1 2m55s
deployment.apps/minio-operator 2/2 2 2 2m55s

NAME DESIRED CURRENT READY AGE
replicaset.apps/console-58b7dc8856 1 1 1 2m55s
replicaset.apps/minio-operator-849f8cf8b8 2 2 2 2m55s

如果使用自定义名称空间初始化运算符,请使用该名称空间替换minio-operator。

Open the Operator Console

运行kubectl minio proxy命令,将流量从minio操作员控制台服务临时发到本地计算机:

# kubectl minio proxy
Starting port forward of the Console UI.

To connect open a browser and go to http://localhost:9090

Current JWT to login: eyJhbGciOiJSUzI1NiIsImtpZCI6InBneENoOVhBcEtsTmFGUGhiWHBwSHBjeHl5cmdYWU5GS3pMbzlhbEdGMm8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJtaW5pby1vcGVyYXRvciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjb25zb2xlLXNhLXRva2VuLXRjcXZyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImNvbnNvbGUtc2EiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI2N2QwNTRhMy1iYzZhLTQxMTktODQ5Zi0wMGM5YmM2YTY3MDEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6bWluaW8tb3BlcmF0b3I6Y29uc29sZS1zYSJ9.UZ5r1_mqoh-3zZT_w5s_z-9lvktUPcyaF-COLViJ414J-HbMxiEu7FCk7aXDe_VCrXkbSpy4lwxWT4lXfX_F2yq0KVTyrrUt7VlRj_iUpKsEAoI7xwbnnsxyBKxKb98nzXyA8je2xkTwKNDBfJ1-FlMLzJH2IIjuTLVD_blIU97RN1PlZXH2ODqiDN_ulL4AAdsdnbNAgIpSe5WITtbUTdHHtLVZtJCEu4FN_EGqmN-ta4H0_k6aL9fPyknCGR087VKgnMfnDiTgq_lh9XbnLxCtHqoBflGMssjxaYeNWbB2zEgi8M1AtQ5I8vFqKGxhXTEDXrzoupKe0igtX-okHw

Forwarding from 0.0.0.0:9090 -> 9090

The command output includes a JWT token you must use to log into the Operator Console.

MinIO对接k8s使用_html_04

MinIO对接k8s使用_github_05

您可以从操作员仪表板部署新的MinIO租户。