目录
一、实验
1.环境
2.K8S storage节点部署NFS
3.K8S 动态创建PV
4.K8S master节点部署HELM3
4.K8S master节点部署Minio存储服务(第一种方式安装)
5.Minio客户端安装MC命令
6.K8S master节点使用Docker 部署Minio存储服务(第二种方式安装)
二、问题
1.K8S无法删除pv,pvc问题
2.minio 部署模式有哪些
3.pod Readiness探针与Liveness探针失败
4. 添加 MinIO服务失败
5.docker创建容器失败
6.K8S如何快速创建Minio存储
(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)查看集群状态
(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
(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
(1)Helm版本与K8S集群兼容
Helm | Helm版本支持策略
(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
(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
(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
(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)报错
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
(1)模式
1)standalone
独立模式下,服务部署数量为1个
3)distributed
分别模式下,服务部署数量,必须大于4个
(2)standalone模式
(3)distributed模式
创建 (服务部署数量为4个)
(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
(1)报错
(2)原因分析
端口不能漏,–api不能漏
(3)解决方法
连接
mc config host add minio http://10.99.219.173:9000 minio minio123 --api S3v4
如需删除
mc config host remove minio
(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
(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