k8s存储卷
1.emptyDir存储卷
apiVersion: v1kind: Podmetadata: name: cunchujuanspec: containers: - name: myapp #定义第一容器用于显示index.html文件内容 image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent volumeMounts: #调用存储卷 - name: html #使用存储卷的名称要和下面定义的一样 mountPath: /usr/share/nginx/html/ #在容器内部挂载的路径 - name: busybox #定义第二个容器用于产生index.html内容 image: busybox:latest imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /data/ command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done'] #该命令会不停向,存储卷的index.html文件追加时间 volumes: #定义存储卷 - name: html #定义存储卷名称 emptyDir: {} #定义存储卷类型
在上面,我们定义了2个容器,其中第二个容器是输入日期到存储卷的index.html当中,因为两个容器都是挂载的同一个存储卷,所以第一个容器的index.html是和第二个共享的,不停curl 能看见index.html在不停的增长
2.hostPath存储卷
apiVersion: v1kind: Podmetadata: name: cs-hostpathspec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /usr/share/nginx/html/ volumes: - name: html hostPath: #存储卷类型为 hostPath path: /data/hostpath #实际node节点上的路径 type: DirectoryOrCreate
先看下调度到那个node的节点上,这边调度到cs27节点上了
mkdir /data/hostpath/ -pv #在cs27节点上创建 hostpath的存储卷文件夹
echo "hostpath存储卷测试" >/data/hostpath/index.html #在存储卷里生成一个主页文件
curl 访问一下,能看到文件内容就是上面我们生成的
注意这边容器在里面修改了数据,是会同步到hostpath 的存储卷的就和挂载一样
3.nfs共享存储卷
再找一台主机充当nfs server
mkdir data #创建nfs文件夹
echo "nfs测试">index.html #创建测试html文件
yum install -y nfs-utils #安装nfs 软件
vim /etc/exports #修改nfs配置文件
/data/ 192.168.0.0/24(rw,no_root_squash)
#配置文件 路径加共享对方的网段
每个node节点也要安装 yum install -y nfs-utils ,否则无法没挂载驱动
#在node的节点运行showmount -e 50.1.1.111 看看有没有挂载权限
kubectl apply -f nfs.yaml #载入容器资源
查看下ip ,curl 访问一下看是不是之前在nfs server上创建的html的测试文件
4.NFS使用PV和PVC
4.1 pv定义方式介绍
[root@k8s-master ~]# kubectl explain pv #查看pv的定义方式FIELDS: apiVersion kind metadata spec[root@k8s-master ~]# kubectl explain pv.spec #查看pv定义的规格spec: nfs(定义存储类型) path(定义挂载卷路径) server(定义服务器名称) accessModes(定义访问模型,有以下三种访问模型,以列表的方式存在,也就是说可以定义多个访问模式) ReadWriteOnce(RWO) 单节点读写 ReadOnlyMany(ROX) 多节点只读 ReadWriteMany(RWX) 多节点读写 capacity(定义PV空间的大小) storage(指定大小)[root@k8s-master volumes]# kubectl explain pvc #查看PVC的定义方式KIND: PersistentVolumeClaimVERSION: v1FIELDS: apiVersion kind metadata
4.2配置nfs 存储
mkdir v{1,2,3,}
vim /etc/exports
/data/v1 192.168.0.0/24(rw,no_root_squash)
/data/v2 192.168.0.0/24(rw,no_root_squash)
/data/v3 192.168.0.0/24(rw,no_root_squash)
4.3定义3个pv
apiVersion: v1kind: PersistentVolumemetadata: name: pv001 labels: name: pv001spec: nfs: path: /data/v1 server: 50.1.1.111 accessModes: ["ReadWriteMany","ReadWriteOnce",] capacity: storage: 1Gi---apiVersion: v1kind: PersistentVolumemetadata: name: pv002 labels: name: pv002spec: nfs: path: /data/v2 server: 50.1.1.111 accessModes: ["ReadWriteMany","ReadWriteOnce",] capacity: storage: 2Gi---apiVersion: v1kind: PersistentVolumemetadata: name: pv003 labels: name: pv003spec: nfs: path: /data/v3 server: 50.1.1.111 accessModes: ["ReadWriteMany","ReadWriteOnce",] capacity: storage: 5Gi
4.4 创建pvc
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: mypvc #name ,给下面调用的spec: accessModes: ["ReadWriteMany"] #声明访问类型,只能匹配到,pv包含的 resources: requests: storage: 3Gi #声明需要3GB的空间,只能匹配3GB及意思的PV---apiVersion: v1kind: Podmetadata: name: cs-hostpathspec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /usr/share/nginx/html/ volumes: - name: html persistentVolumeClaim: #挂载存储卷类型为 pvc claimName: mypvc #指定PVC的name为 "mypvc"
配置容器应用:Secret和configMap
Secret:用于向Pod传递敏感信息,比如密码,私钥,证书文件等,这些信息如果在容器中定义容易泄露,Secret资源可以让用户将这些信息存储在急群众,然后通过Pod进行挂载,实现敏感数据和系统解耦的效果。
ConfigMap:主要用于向Pod注入非敏感数据,使用时,用户将数据直接存储在ConfigMap对象当中,然后Pod通过使用ConfigMap卷进行引用,实现容器的配置文件集中定义和管理。
通过 --from-literal 创建
kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456#创建一个Secret namae为 mysecret
通过 --from-file创建
每个文件内容对应一个信息条目。
[root@cs25 ~]# echo "admin" >username[root@cs25 ~]# echo "123456" >passwordkubectl create secret generic mysecret2 --from-file=username --from-file=password
通过 --from-env-file创建
文件 env.txt 中每行 Key=Value 对应一个信息条目。
[root@cs25 ~]# cat << EOF > env.txt> username=admin> password=12345> EOFkubectl create secret generic mysecret3 --from-env-file=env.txt
通过 YAML 配置文件:
先用base64 命令对密码等保密的数据完成转码
vim secret.yaml
apiVersion: v1kind: Secretmetadata: name: mysecretyamldata: username: YWRtaW4K password: MTIzNDU2Cg== #键值
查看
#反解码
使用secret
apiVersion: v1kind: Podmetadata: name: pod-secretspec: containers: - name: pod-secret image: nginx volumeMounts: - name: foo #挂载那个存储卷 mountPath: "/etc/foo" #pod 挂载的路径 volumes: - name: foo #创建存储卷,name,用于被pod 调用 secret: #存储卷类型 secretName: mysecret #用那个文件
exec 进入容器 cd 到/etc/foo 能看到我们创建mysecret的key 及value
重定向数据
apiVersion: v1kind: Podmetadata: name: pod-secretspec: containers: - name: pod-secret image: nginx volumeMounts: - name: foo mountPath: "/etc/foo" volumes: - name: foo secret: secretName: mysecret items: #自定义存放路径及文件名 - key: username path: 233/name #重定向路径及文件名(key),注意路径要写相对路径 - key: password path: 233/pass
这时候数据都被重定向到"/etc/foo/233" 文件夹里了
使用这种方式 Secret 还支持动态更新:Secret 更新后,容器中的数据也会更新。
vim secret.yaml
kubectl apply -f secret.yaml
登录进去查看,name 的 value已经发生了变化
环境变量传递 key
apiVersion: v1kind: Podmetadata: name: pod-secretspec: containers: - name: pod-secret image: nginx env: - name: username #传递到容器内部的环境变量 valueFrom: secretKeyRef: name: mysecret #使用那个secret key: username #使用那个key - name: password valueFrom: secretKeyRef: name: mysecret key: password
exec 登录进去 echo 环境变量
通过环境变量 SECRET_USERNAME 和 SECRET_PASSWORD 成功读取到 Secret 的数据。
需要注意的是,环境变量读取 Secret 很方便,但无法支撑 Secret 动态更新。
Secret 可以为 Pod 提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap。
configmap 以上添加都支持就不一一举例了
configmap 来个实例
vim www.conf #创建nging 配置文件
server { server_name www.233.com; listen 8860; root /data/web/html;}
kubectl create configmap configmap-cs --from-file=www.conf
#创建一个name为"configmap-cs" configmap资源,内容就是之前创建的www.conf
vim nginx-configmap #创建pod
apiVersion: v1kind: Podmetadata: name: pod-secretspec: containers: - name: pod-secret image: nginx volumeMounts: - name: nginxconf #调用名为"nginxconf"的存储卷 mountPath: /etc/nginx/conf.d/ volumes: - name: nginxconf #创建存储卷 configMap: #存储卷类型为configMap name: configmap-cs #使用configmap里面的"configmap-cs"这个资源
kubectl apply -f nginx-configmap.yaml #载入启动
查看IP 访问我刚才定义的资端口,能正常访问说明配置文件生效了。
登录进去查看文件
kubectl edit configmaps configmap-cs
#命令修改资源,使用方法和vim 一样使用
POD挂载过程
POD先挂载名为"nginxconf"的存储卷 "nginxconf"的存储卷的内容是调用configMap资源里 "configmap-cs"这个资源生成的 "configmap-cs" 这个资源是读取www.conf 文件生成的