k8s核心资源存储对象
和docker类似,k8s也需要存储数据,比如redis和mysql都需要外部存储对象,要不然重新拉起pod,在其他机器上数据会消失。
一、简介
和docker类似,k8s也需要存储数据,比如redis和mysql都需要外部存储对象,要不然重新拉起pod,在其他机器上数据会消失。
二、NFS共享存储
NFS这个文件系统提供了远程挂载共享数据,我们可以利用这个文件系统来做数据共享。
1、下载文件系统
需要共享的机器都下载
apt-get install nfs-kernel-server
2、配置服务端
# 对外暴露共享目录 /data是服务端的文件夹
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
*是所有机器都可以访问我们的共享资源。如果写ip地址的话,就指定特定的ip.
# 在主共享机器创建/nfs/data/目录
mkdir -p /nfs/data
# 重启NFS服务
service nfs-kernel-server restart
# 查看暴露服务信息
exportfs -v
说明服务端配置成功
3、配置客户端
# 查看服务端那些目录可被挂载
showmount -e 192.168.211.11
# 挂载
mount -t nfs4 -o noac 192.168.211.11:/nfs/data /nfs/data
# 查看挂载是否成功,最后一行
df -h
注意:执行挂载命令的时候不要再/nfs/data里执行,否则挂载后,创建的文件不共享
4、部署一个nginx
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pv
name: nginx-pv
spec :
replicas: 2
selector:
matchLabels:
app: nginx-pv
template:
metadata :
labels:
app: nginx-pv
spec:
containers :
- image: nginx
name: nginx
volumeMounts :
- name: html
mountPath: /usr/share/nginx/html
volumes :
- name: html
nfs:
server: 192.168.211.11
path: /nfs/data/nginx-pv
kubectl apply -f mount.yaml
首先部署之前需要创建好/nfs/data/nginx-pv,要不然会不成功。测试ok。
三、PV&PVC
静态供应
需要提前创建好各种大小的pv,然后再声明
PV:持久卷
PVC:持久卷声明
用法:提前创建好持久卷,比如100M,5G,100G大小的持久卷,然后再使用(声明PVC),最后在创建项目的时候应用申明即可。
1、创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01-10m
spec:
capacity:
storage: 10M
accessModes :
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 192.168.211.11
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02-1gi
spec:
capacity:
storage: 1Gi
accessModes :
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 192.168.211.11
kubectl apply -f pv.yaml
查看创建状态
kubectl get persistentvolume
kubectl get pv
2、声明PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests :
storage: 200Mi
storageClassName: nfs
注意:声明中的nfs要和上面创建PV中的storageClassName: nfs里的nfs对应。
kubectl apply -f pvc.yaml
可以看到1G空间已经绑定了。
查看声明
kubectl get pvc
3、项目中应用
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
claimName: nginx-pvc就是声明里的名字
此处部署的nginx和上面《三》部署的nginx区别就是一个直接挂载,一个直接用的声明。
动态供应
不需要提前创建pv,直接声明,会自动创建声明大小的块。
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: persistentvolumes
- name: NFS_SERVER
value: 192.168.211.11
- name: NFS_PATH
value: /nfs/data/03 # nfs服务器共享的目录 指定NFS服务器共享的目录
volumes:
- name: nfs-client-root
nfs:
server: 192.168.211.11
path: /nfs/data/03 # nfs服务器共享的目录 指定NFS服务器共享的目录
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
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: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
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
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: persistentvolumes
只要需要把里面的ip换成自己nfs的ip即可
下面是配置默认存储类。
kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
创建pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc01
spec:
accessModes:
- ReadWriteMany
resources:
requests :
storage: 200Mi
这里不需要写storageClassName,因为我吗上面配置了默认存储。
这就成功了。
注意:如果有的朋友出现了pending状态,查看日志
如果和我的报错一样,那就是缺少配置。
/etc/kubernetes/manifests/kube-apiserver.yaml增加配置
spec:
containers:
- command:
- kube-apiserver
- --feature-gates=RemoveSelfLink=false
kubeadm安装的apiserver是Static Pod,它的配置文件被修改后,立即生效。Kubelet 会监听该文件的变化,当您修改了 /etc/kubenetes/manifest/kube-apiserver.yaml 文件之后,kubelet 将自动终止原有的 kube-apiserver-{nodename} 的 Pod,并自动创建一个使用了新配置参数的 Pod 作为替代。如果您有多个 Kubernetes Master 节点,您需要在每一个 Master 节点上都修改该文件,并使各节点上的参数保持一致。
这里我的修改后没生效,手动加载下yaml即可
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
这个时候pending就变成Bound了。
四、ConfigMap抽取配置文件
有时候我们还需要把应用的配置文件抽象出来,统一管理,configMap就诞生了
1、创建
# 把redis的配置创建成可配置集
kubectl create cm redis-conf --from-file=redis.conf
# 获取配置配置集
kubectl get cm
# 获取配置集内容
kubectl get cm redis-conf -oyaml
redis-conf 结果集名
redis.conf 文件名
vim redis.conf
appendonly yes
配置已经有了,所以如果你创建应用(redis)的时候只需要应用一下这个配置集就可以了
2、应用配置集
上面我们创建了配置如下截图
kubectl get cm redis-conf -oyaml
接下来我们应用一下
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 # 挂载的东西的名字 (1
volumes :
- name: data
emptyDir: {}
- name: config # 和上面(1 对应
configMap:
name: redis-conf # 第一步创建的结果集名字
items:
- key: redis.conf # 对应结果集中的配置文件名,可以看出来可以有多个
path: redis.conf # 在pod容器中生成配置文件后的名字
kubectl apply -f cm.yaml
创建成功后,查看redis确实是我们当初的配置
3、修改配置
配置修改后,容器里的配置也会生效
kubectl edit cm redis-conf
修改完后,差不多等会就会通步到容器内部
redis获取配置
注意:redis修改完后,没有热更新配置,需要重新启动redis
五、Secret
Secret对象类型用来保存敏感信息,例如密码、OAuth 令牌和SSH密钥。将这些信息放在secret中比放在Pod的定义或者容器镜像中来说更加安全和灵活。
我们接下来为仓库创建一套登录账户和密码
kubectl create secret docker-registry mysecret-docker \
--docker-username=xiaoming \
--docker-password=xm123123 \
--docker-email=123@qq.com
再这样应用去拉去镜像
apiVersion: v1
kind: Pod
metadata:
name: private-nginx
spec:
containers:
- name: private-nginx
image: nginx
imagePullsecrets:
- name: mysecret-docker
完毕了!!!!
更多推荐
所有评论(0)