存储抽象
# NFS
# 环境搭建
所有节点
yum install -y nfs-utils
主节点
#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r
从节点
172.31.0.4:主节点 IP
showmount -e 172.31.0.4
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data
mount -t nfs 172.31.0.4:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt
原生方式数据挂载:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pv-demo
name: nginx-pv-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pv-demo
template:
metadata:
labels:
app: nginx-pv-demo
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
server: 172.31.0.4
path: /nfs/data/nginx-pv
# PV&PVC
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置。 PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格。
# 示例
# 创建 pv 池
静态供应
#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
创建 PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01-10m #
spec:
capacity:
storage: 10M # 大小
accessModes:
- ReadWriteMany # 可读可写
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 172.31.0.4
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02-1gi
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 172.31.0.4
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv03-3gi
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/03
server: 172.31.0.4
# PVC 创建与绑定
创建 PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
在 pv 池中寻找满足 200Mi
大小要求的 pv,在上述 pv 配置中最接近的是 1Gi
# 查看绑定情况
kubectl get pv
创建 Pod 绑定 PVC
上面的操作是先创建 pv 池,再申明 pvc 绑定;除此以外还可以在创建 pod 的同时完成以上步骤
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy-pvc
name: nginx-deploy-pvc
spec:
replicas: 2
selector:
matchLabels:
app: nginx-deploy-pvc
template:
metadata:
labels:
app: nginx-deploy-pvc
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: nginx-pvc
# ConfigMap 配置
以配置 Redis 为例
把之前的配置文件创建为配置集
# 准备一个redis.conf
vim redis.conf
# 创建配置集
kubectl create cm redis-conf --from-file=redis.conf
# 查看
kubectl get cm
# 查看redis.conf配置集信息,使用yaml格式,之后使用yaml创建时可以参考
创建 Pod
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
command:
- redis-server
- "/redis-master/redis.conf" #指的是redis容器内部的位置
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: redis-conf
items:
- key: redis.conf
path: redis.conf
检查默认配置
kubectl exec -it redis -- redis-cli
127.0.0.1:6379> CONFIG GET appendonly
127.0.0.1:6379> CONFIG GET requirepass
修改 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: example-redis-config
data:
redis-config: |
maxmemory 2mb
maxmemory-policy allkeys-lru
检查配置是否更新
kubectl exec -it redis -- redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
127.0.0.1:6379> CONFIG GET maxmemory-policy
配置值未更改
因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。 原因:我们的 Pod 部署的中间件自己本身没有热更新能力
# Secret
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod (opens new window) 的定义或者 容器镜像 (opens new window) 中来说更加安全和灵活。
# 存储Docker Hub的账号密码信息
kubectl create secret docker-registry nipgeihou-docker \
--docker-username=nipgeihou \
--docker-password=123456 \
--docker-email=[email protected]
##命令格式
kubectl create secret docker-registry regcred \
--docker-server=<你的镜像仓库服务器> \
--docker-username=<你的用户名> \
--docker-password=<你的密码> \
--docker-email=<你的邮箱地址>
apiVersion: v1
kind: Pod
metadata:
name: private-nginx
spec:
containers:
- name: private-nginx
image: nipgeihou/my-nginx:v1.0
imagePullSecrets:
- name: nipgeihou-docker
在创建 Pod 时,指定 secret 信息来 pull 镜像
上次更新: 2024/03/11, 22:37:05