Spinnaker多云持续交付平台: 部署Minio存储服务
目录
4.K8S master节点部署Minio存储服务(第一种方式安装)
6.K8S master节点使用Docker 部署Minio存储服务(第二种方式安装)
3.pod Readiness探针与Liveness探针失败
一、实验
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服务
#在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)查看域名
vim /etc/hosts 

3.K8S 动态创建PV
(1) 创建 Service Account,用来管理 NFS-Subdir-External-Provisioner 在 k8s 集群中运行的权限,设置 nfs-client 对 PV,PVC,StorageClass 等的规则
编写资源清单文件
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 
 
生成资源
kubectl apply -f nfs-rbac.yaml
 
再次查看sa
kubectl get sa 

(3)使用 Deployment 来部署 NFS-Subdir-External-Provisioner
NFS Provisione(即 nfs-client),有两个功能:一个是在 NFS 共享目录下创建挂载点(volume),另一个则是将 PV 与 NFS 的挂载点建立关联。
vim  nfs-provisioner-deploy.yaml
 
 
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服务器数据存储目录 
kubectl apply -f nfs-provisioner-deploy.yaml 
 

(5)创建 StorageClass,负责建立 PVC 并调用 NFS-Subdir-External-Provisioner进行预定的工作,并让 PV 与 PVC 建立关联,声明 NFS 动态卷提供者名称为 “nfs-storage”。
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版本号设置
 
 
kubectl apply -f nfs-storage.yaml 

4.K8S master节点部署HELM3
(1)Helm版本与K8S集群兼容

(2)查看K8S集群状态
# kubectl get node
 
 

(3)策略
当前K8S 集群为1.20.6版本,选择HELM 3.8.1 版本。
(4)部署
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
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
kubectl get storageclasses.storage.k8s.io 

(4)修改配置文件
vim values-test.yaml  
![]()











(5)安装minio集群
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® 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® server using a client:
- Run a MinIO® 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® web UI:
- Get the MinIO® URL:
   echo "MinIO® web URL: http://127.0.0.1:9001/minio"
   kubectl port-forward --namespace default svc/minio 9001:9001
 
 

(6) 查看
helm list
kubectl get deploy
kubectl get pod
kubectl get pod -o wide 


(7) 查看pv与pvc
kubectl get pv
kubectl get pvc 

(8)NFS 查看卷
ls 

ls | grep minio
 
 

5.Minio客户端安装MC命令
(1)下载
wget https://dl.min.io/client/mc/release/linux-amd64/mc 
(2)安装
chmod a+x mc
mv mc /usr/local/bin/
mc --version
 
![]()

(3) 配置访问minio
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
docker pull minio/minio 

(2)创建存放数据的目录
# 一个用来存放配置,一个用来存储上传文件的目录
# 启动前需要先创建Minio外部挂载的配置文件( /rootconfig),和存储上传文件的目录( /root/data)
mkdir -p /root/data
mkdir -p /root/config 

(3) 创建Minio容器并运行(多行模式)
# 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容器并运行(单行模式)
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进程
docker ps | grep minio 

(6)登录
http://192.168.204.180:9090/login 

进入系统

(7)创建用户

填写信息



(8)完成创建

(9)创建组


(10)创建accessKey和secretKey


查看

(11)创建Bucket


查看

(12)上传文件

查看

二、问题
1.K8S无法删除pv,pvc问题
(1)报错
error: resource(s) were provided, but no name was specified 
(2)原因分析
删除顺序不对。
(3)解决方法
正确的删除顺序:
 
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)模式
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
kubectl get pod 

kubectl describe pod minio-9c678d65c-45js9  


(2)原因分析
Back-off restarting failed container的Warning事件,一般是由于通过指定的镜像启动容器后,容器内部没有常驻进程,导致容器启动成功后即退出,从而进行了持续的重启。
(3)解决方法
如果是通过yaml文件创建的pod,找到对应的deployment,增加命令command: ["/bin/bash", "-ce", "tail -f /dev/null"] 
kubectl edit deploy 


4. 添加 MinIO服务失败
(1)报错

(2)原因分析
端口不能漏,–api不能漏
(3)解决方法
连接
mc config host add minio http://10.99.219.173:9000 minio minio123 --api S3v4 
![]()
如需删除
mc config host remove minio 
![]()
5.docker创建容器失败
(1)报错

(2)原因分析
容器名称重复
(3)解决方法
查看
docker ps -a 

删除
docker rm -f a17f4299e7bd 
![]()
成功:
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 对象
curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O 
(3)应用 MinIO 对象定义
kubectl apply -f minio-dev.yaml 
命令输出应如下所示:
namespace/minio-dev created
pod/minio created 
(4)验证 Pod 的状态
kubectl get pods -n minio-dev 
(5)检索有关 Pod 状态的详细信息
kubectl describe pod/minio -n minio-dev
kubectl logs pod/minio -n minio-dev 
(6)临时访问 MinIO S3 API 和控制台
使用以下命令将流量从 MinIO Pod 临时转发到本地计算机
#该命令在 shell 中处于活动状态时,将 pod 端口转发到本地计算机上的匹配端口。 该命令仅在 shell 会话中处于活动状态时起作用。 终止会话将关闭本地计算机上的端口。
#要配置对 Pod 的长期访问,需要在 Kubernetes 中配置 Ingress 或类似的网络控制组件,以路由进出 Pod 的流量。
kubectl port-forward pod/minio 9000 9090 -n minio-dev 
(7)浏览器连接到 MinIO 服务器
通过在本地计算机上打开浏览器并导航到 来访问 MinIO 控制台。http://127.0.0.1:9001
使用凭据 登录控制台。 这些是默认的 root 用户凭证。minioadmin | minioadmin 
(8)连接 MinIO 客户端
如果本地计算机已安装mc,请使用以下命令进行身份验证并连接到 MinIO 部署
mc alias set k8s-minio-dev http://127.0.0.1:9000 minioadmin minioadmin
mc admin info k8s-minio-dev 
                
