Spinnaker多云持续交付平台: 部署Minio存储服务

目录

一、实验

1.环境

[2.K8S storage节点部署NFS](#2.K8S storage节点部署NFS)

[3.K8S 动态创建PV](#3.K8S 动态创建PV)

[4.K8S master节点部署HELM3](#4.K8S master节点部署HELM3)

[4.K8S master节点部署Minio存储服务(第一种方式安装)](#4.K8S master节点部署Minio存储服务(第一种方式安装))

5.Minio客户端安装MC命令

[6.K8S master节点使用Docker 部署Minio存储服务(第二种方式安装)](#6.K8S master节点使用Docker 部署Minio存储服务(第二种方式安装))

二、问题

1.K8S无法删除pv,pvc问题

[2.minio 部署模式有哪些](#2.minio 部署模式有哪些)

[3.pod Readiness探针与Liveness探针失败](#3.pod Readiness探针与Liveness探针失败)

[4. 添加 MinIO服务失败](#4. 添加 MinIO服务失败)

5.docker创建容器失败

6.K8S如何快速创建Minio存储


一、实验

1.环境

(1)主机

表1 主机

|---------|--------------|--------|-----------------|----|
| 主机 | 架构 | 版本 | IP | 备注 |
| master1 | K8S master节点 | 1.20.6 | 192.168.204.180 | |
| node1 | K8S node节点 | 1.20.6 | 192.168.204.181 | |
| node2 | K8S node节点 | 1.20.6 | 192.168.204.182 | |
| stor01 | nfs存储节点 | | 192.168.204.177 | |

(2)查看集群状态

2.K8S storage节点部署NFS

(1)安装配置nfs服务

bash 复制代码
#在stor01(192.168.204.183)节点上安装nfs,并配置nfs服务
mkdir /opt/k8s
chmod 777 /opt/k8s/
 
yum -y install nfs-utils rpcbind
 
#给204网段用户赋予读写权限、同步内容、不压缩共享对象root用户权限
vim /etc/exports
/opt/k8s 192.168.204.0/24(rw,sync,no_root_squash)

#首次安装 
systemctl  start  rpcbind nfs

#非首次安装
systemctl  restart rpcbind
systemctl restart nfs

#监听服务
ss -antp | grep rpcbind

#查看共享
exportfs  -arv 

showmount  -e

 
#所有节点配置hosts映射,或者配置DNS解析
echo '192.168.204.177 stor01' >> /etc/hosts

在stor01(192.168.204.177)节点上安装nfs,并配置nfs服务

安装

配置文件

重启服务

监听服务

查看共享目录

(2)查看域名

bash 复制代码
vim /etc/hosts

3.K8S 动态创建PV

(1) 创建 Service Account,用来管理 NFS-Subdir-External-Provisioner 在 k8s 集群中运行的权限,设置 nfs-client 对 PV,PVC,StorageClass 等的规则

编写资源清单文件

bash 复制代码
vim nfs-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: default # 替换成你要部署的 Namespace
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

生成资源

bash 复制代码
kubectl apply -f nfs-rbac.yaml

再次查看sa

bash 复制代码
kubectl get sa

(3)使用 Deployment 来部署 NFS-Subdir-External-Provisioner

NFS Provisione(即 nfs-client),有两个功能:一个是在 NFS 共享目录下创建挂载点(volume),另一个则是将 PV 与 NFS 的挂载点建立关联。

bash 复制代码
vim  nfs-provisioner-deploy.yaml
bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate                   ## 设置升级策略为删除再创建(默认为滚动更新)
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          #image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0
          image: registry.cn-beijing.aliyuncs.com/xngczl/nfs-subdir-external-provisione:v4.0.0
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME     ## Provisioner的名称,以后设置的storageclass要和这个保持一致
              value: nfs-client
            - name: NFS_SERVER           ## NFS服务器地址,需和valumes参数中配置的保持一致
              value: stor01
            - name: NFS_PATH             ## NFS服务器数据存储目录,需和valumes参数中配置的保持一致
              value: /opt/k8s
      volumes:
        - name: nfs-client-root
          nfs:
            server: stor01             ## NFS服务器地址
            path: /opt/k8s            ## NFS服务器数据存储目录
bash 复制代码
kubectl apply -f nfs-provisioner-deploy.yaml

(5)创建 StorageClass,负责建立 PVC 并调用 NFS-Subdir-External-Provisioner进行预定的工作,并让 PV 与 PVC 建立关联,声明 NFS 动态卷提供者名称为 "nfs-storage"。

bash 复制代码
vim nfs-storage.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "false"  ## 是否设置为默认的storageclass
provisioner: nfs-client                                   ## 动态卷分配者名称,必须和上面创建的"provisioner"变量中设置的Name一致
parameters:
  archiveOnDelete: "true"                                 ## 设置为"false"时删除PVC不会保留数据,"true"则保留数据
mountOptions:
  - hard                                                  ## 指定为硬挂载方式
  - nfsvers=4                                             ## 指定NFS版本,这个需要根据NFS Server版本号设置
bash 复制代码
kubectl apply -f nfs-storage.yaml

4.K8S master节点部署HELM3

(1)Helm版本与K8S集群兼容

Helm | Helm版本支持策略

(2)查看K8S集群状态

bash 复制代码
# kubectl get node

(3)策略

当前K8S 集群为1.20.6版本,选择HELM 3.8.1 版本。

(4)部署

bash 复制代码
1)安装 helm 
//下载二进制 Helm client 安装包
wget https://get.helm.sh/helm-v3.8.1-linux-amd64.tar.gz
 
tar -zxvf helm-v3.8.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm version
 
//命令补全
source <(helm completion bash)
 
2)使用 helm 安装 Chart
//添加常用的 chart 仓库,
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

3) 更新 charts 列表
helm repo update
helm repo list          

安装

使用 helm 安装 Chart

4.K8S master节点部署Minio存储服务(第一种方式安装)

(1)Minio官方文档

minio 13.4.2 · bitnami/bitnami (artifacthub.io)

(2)获取最新minio charts

bash 复制代码
1)查询 minio 资源
helm search repo minio

2)创建目录
mkdir -p /root/minio/ && cd /root/minio/

3)拉取 chart 到本地目录
第一种方式:
helm fetch bitnami/minio --version 13.3.3
第二种方式
helm pull bitnami/minio --version 13.3.3 

4)解压
tar -zxvf minio-13.3.3.tgz
cp minio/values.yaml ./values-test.yaml

5)查看当前目录层级
tree -L 2
.
├── minio
│   ├── Chart.lock
│   ├── charts
│   ├── Chart.yaml
│   ├── README.md
│   ├── templates
│   └── values.yaml
├── minio-13.3.3.tgz
└── values-test.yaml

查询

拉取解压

查看目录

(3)查看集群 storageclasses

bash 复制代码
kubectl get storageclasses.storage.k8s.io

(4)修改配置文件

bash 复制代码
vim values-test.yaml 

(5)安装minio集群

bash 复制代码
helm install minio minio -f values-test.yaml

-n 指定 kubernetes 集群名称空间
-f 指定使用的配置文件,文件中定义的配置可以覆盖 minio/values.yaml 文件中配置

NAME: minio
LAST DEPLOYED: Thu Feb  8 09:03:41 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: minio
CHART VERSION: 13.3.3
APP VERSION: 2024.1.31

** Please be patient while the chart is being deployed **

MinIO&reg; can be accessed via port  on the following DNS name from within your cluster:

   minio.default.svc.cluster.local

To get your credentials run:

   export ROOT_USER=$(kubectl get secret --namespace default minio -o jsonpath="{.data.root-user}" | base64 -d)
   export ROOT_PASSWORD=$(kubectl get secret --namespace default minio -o jsonpath="{.data.root-password}" | base64 -d)

To connect to your MinIO&reg; server using a client:

- Run a MinIO&reg; Client pod and append the desired command (e.g. 'admin info'):

   kubectl run --namespace default minio-client \
     --rm --tty -i --restart='Never' \
     --env MINIO_SERVER_ROOT_USER=$ROOT_USER \
     --env MINIO_SERVER_ROOT_PASSWORD=$ROOT_PASSWORD \
     --env MINIO_SERVER_HOST=minio \
     --image docker.io/bitnami/minio-client:2024.1.31-debian-11-r1 -- admin info minio

To access the MinIO&reg; web UI:

- Get the MinIO&reg; URL:

   echo "MinIO&reg; web URL: http://127.0.0.1:9001/minio"
   kubectl port-forward --namespace default svc/minio 9001:9001

(6) 查看

bash 复制代码
helm list

kubectl get deploy

kubectl get pod

kubectl get pod -o wide

(7) 查看pv与pvc

bash 复制代码
kubectl get pv

kubectl get pvc

(8)NFS 查看卷

bash 复制代码
ls
bash 复制代码
ls | grep minio

5.Minio客户端安装MC命令

(1)下载

bash 复制代码
wget https://dl.min.io/client/mc/release/linux-amd64/mc

(2)安装

bash 复制代码
chmod a+x mc

mv mc /usr/local/bin/

mc --version

(3) 配置访问minio

bash 复制代码
mc config host add minio http://10.99.219.173:9000 minio minio123 --api S3v4

# 查看配置,不同 mc 版本,以下内容输出可能不一定完全相同
mc config host list

gcs  
  URL       : https://storage.googleapis.com
  AccessKey : YOUR-ACCESS-KEY-HERE
  SecretKey : YOUR-SECRET-KEY-HERE
  API       : S3v2
  Path      : dns

local
  URL       : http://localhost:9000
  AccessKey : 
  SecretKey : 
  API       : 
  Path      : auto

minio
  URL       : http://10.99.219.173:9000
  AccessKey : minio
  SecretKey : minio123
  API       : S3v4
  Path      : auto

play 
  URL       : https://play.min.io
  AccessKey : Q3AM3UQ867SPQQA43P2F
  SecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
  API       : S3v4
  Path      : auto

s3   
  URL       : https://s3.amazonaws.com
  AccessKey : YOUR-ACCESS-KEY-HERE
  SecretKey : YOUR-SECRET-KEY-HERE
  API       : S3v4
  Path      : dns

6.K8S master节点使用Docker 部署Minio存储服务(第二种方式安装)

(1)docker 命令去安装稳定版本的 minio

bash 复制代码
docker pull minio/minio

(2)创建存放数据的目录

bash 复制代码
# 一个用来存放配置,一个用来存储上传文件的目录
# 启动前需要先创建Minio外部挂载的配置文件( /rootconfig),和存储上传文件的目录( /root/data)

mkdir -p /root/data

mkdir -p /root/config

(3) 创建Minio容器并运行(多行模式)

bash 复制代码
# 9090端口指的是minio的客户端端口
# MINIO_ACCESS_KEY :账号
# MINIO_SECRET_KEY :密码(账号长度必须大于等于5,密码长度必须大于等于8位)

docker run -p 9000:9000 -p 9090:9090 \
     --net=host \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=minioadmin" \
     -e "MINIO_SECRET_KEY=minioadmin" \
     -v /root/data:/data \
     -v /root/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9090" -address ":9000"

(4)另一种方式创建Minio容器并运行(单行模式)

bash 复制代码
docker run -p 9000:9000 -p 9090:9090      --net=host      --name minio      -d --restart=always      -e "MINIO_ACCESS_KEY=minioadmin"      -e "MINIO_SECRET_KEY=minioadmin"      -v /root/data:/data      -v /root/config:/root/.minio      minio/minio server      /data --console-address ":9090" -address ":9000"

(5)查看docker进程

bash 复制代码
docker ps | grep minio

(6)登录

bash 复制代码
http://192.168.204.180:9090/login

进入系统

(7)创建用户

填写信息

(8)完成创建

(9)创建组

(10)创建accessKey和secretKey

查看

(11)创建Bucket

查看

(12)上传文件

查看

二、问题

1.K8S无法删除pv,pvc问题

(1)报错

bash 复制代码
error: resource(s) were provided, but no name was specified

(2)原因分析

删除顺序不对。

(3)解决方法

bash 复制代码
正确的删除顺序:
 
1)先删除pod
helm -n devops uninstall minio(项目名称) 
 
2)解除pv绑定
kubectl patch pv pvname(pv名称) -p '{"metadata":{"finalizers":null}}'
 
3)解除pvc绑定
kubectl patch pvc pvcname(pvc名称) -p '{"metadata":{"finalizers":null}}'

4) 删除pv
kubectl delete pv pvname(pv名称) -n devops

5) 删除pvc
kubectl delete pvc pvname(pvc名称) -n devops

2.minio 部署模式有哪些

(1)模式

bash 复制代码
1)standalone
独立模式下,服务部署数量为1个

3)distributed
分别模式下,服务部署数量,必须大于4个

(2)standalone模式

创建(服务部署数量为1个)

(3)distributed模式

创建 (服务部署数量为4个)

3.pod Readiness探针与Liveness探针失败

(1)报错

通过yaml文件创建pod时,执行完yaml文件,过一会就开始报错说Back-off restarting failed container

查看pod状态一致处于CrashLoopBackOff

bash 复制代码
kubectl get pod
bash 复制代码
kubectl describe pod minio-9c678d65c-45js9 

(2)原因分析

Back-off restarting failed container的Warning事件,一般是由于通过指定的镜像启动容器后,容器内部没有常驻进程,导致容器启动成功后即退出,从而进行了持续的重启。

(3)解决方法

bash 复制代码
如果是通过yaml文件创建的pod,找到对应的deployment,增加命令command: ["/bin/bash", "-ce", "tail -f /dev/null"]
bash 复制代码
kubectl edit deploy

4. 添加 MinIO服务失败

(1)报错

(2)原因分析

端口不能漏,--api不能漏

(3)解决方法

连接

bash 复制代码
mc config host add minio http://10.99.219.173:9000 minio minio123 --api S3v4

如需删除

bash 复制代码
mc config host remove minio

5.docker创建容器失败

(1)报错

(2)原因分析

容器名称重复

(3)解决方法

查看

bash 复制代码
docker ps -a

删除

bash 复制代码
docker rm -f a17f4299e7bd

成功:

bash 复制代码
docker run -p 9000:9000 --name minio -v /root/data:/data -v /root/config:/root/.minio minio/minio server /data

6.K8S如何快速创建Minio存储

(1)官方文档

MinIO Object Storage for Kubernetes --- MinIO Object Storage for Kubernetes

(2)下载 MinIO 对象

bash 复制代码
curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O

(3)应用 MinIO 对象定义

bash 复制代码
kubectl apply -f minio-dev.yaml

命令输出应如下所示:

bash 复制代码
namespace/minio-dev created
pod/minio created

(4)验证 Pod 的状态

bash 复制代码
kubectl get pods -n minio-dev

(5)检索有关 Pod 状态的详细信息

bash 复制代码
kubectl describe pod/minio -n minio-dev

kubectl logs pod/minio -n minio-dev

(6)临时访问 MinIO S3 API 和控制台

使用以下命令将流量从 MinIO Pod 临时转发到本地计算机

bash 复制代码
#该命令在 shell 中处于活动状态时,将 pod 端口转发到本地计算机上的匹配端口。 该命令仅在 shell 会话中处于活动状态时起作用。 终止会话将关闭本地计算机上的端口。

#要配置对 Pod 的长期访问,需要在 Kubernetes 中配置 Ingress 或类似的网络控制组件,以路由进出 Pod 的流量。

kubectl port-forward pod/minio 9000 9090 -n minio-dev

(7)浏览器连接到 MinIO 服务器

bash 复制代码
通过在本地计算机上打开浏览器并导航到 来访问 MinIO 控制台。http://127.0.0.1:9001

使用凭据 登录控制台。 这些是默认的 root 用户凭证。minioadmin | minioadmin

(8)连接 MinIO 客户端

如果本地计算机已安装mc,请使用以下命令进行身份验证并连接到 MinIO 部署

bash 复制代码
mc alias set k8s-minio-dev http://127.0.0.1:9000 minioadmin minioadmin
mc admin info k8s-minio-dev
相关推荐
Shepherd06191 小时前
【Jenkins实战】Windows安装服务启动失败
运维·jenkins
Biomamba生信基地2 小时前
Linux也有百度云喔~
linux·运维·服务器·百度云
沈艺强2 小时前
云计算在esxi 主机上创建 4g磁盘,同时在此磁盘上部署linux
云计算
new_abc2 小时前
Ubuntu 22.04 ftp搭建
linux·运维·ubuntu
鹿鸣天涯2 小时前
‌华为交换机在Spine-Leaf架构中的使用场景
运维·服务器·网络
小白也有IT梦3 小时前
域名绑定服务器小白教程
运维·nginx
有梦想的咕噜3 小时前
Secure Shell(SSH) 是一种网络协议
运维·网络协议·ssh
dntktop3 小时前
免费,WPS Office教育考试专用版
运维
苹果醋33 小时前
C语言 strlen 函数 - C语言零基础入门教程
java·运维·spring boot·mysql·nginx
loong_XL4 小时前
automa 浏览器自动化工具插件
运维·自动化