apiVersion: v1
kind: Pod
metadata:name: producer-consumernamespace: default # 命名空间
spec:containers:- name: producerimage: busyboximagePullPolicy: IfNotPresent # 优先使用本地镜像,没有则下载volumeMounts: # 2、producer容器将shared-volume mount到/producer_dir目录;- mountPath: /producer_dirname: shared-volumeargs: # 3、producer 通过 echo 将数据写到文件 /producer_dir/hello 里。- /bin/sh- -c- echo "hello world" > /producer_dir/hello; sleep 30000- name: consumerimage: busyboximagePullPolicy: IfNotPresent # 优先使用本地镜像,没有则下载volumeMounts: # 4、consumer 容器将 shared-volume mount 到 /consumer_dir 目录。- mountPath: /consumer_dirname: shared-volumeargs: # 5、 consumer 通过 cat 从文件 hello 读数据- /bin/sh- -c- cat /consumer_dir/hello; sleep 30000volumes: # 1、文件最底部volumes定义一个emptyDir类型的Volume shared-volume- name: shared-volumeemptyDir: {}
执行如下命令创建Pod:
apiVersion: apps/v1
kind: Deployment
metadata:name: redis # Deployment名称
spec:selector:matchLabels: # 通过标签选择被控制的podapp: redistemplate: # pod信息metadata:labels:app: redis # 给pod打上标签app=redisspec:containers:- image: redisname: redisimagePullPolicy: IfNotPresentports:- containerPort: 6379 # 对service暴露端口name: redis6379env:- name: ALLOW_EMPTY_PASSWORD # 本地Keyvalue: "yes"- name: REDIS_PASSWORDvalue: "redis"volumeMounts:- name: redis-persistent-storagemountPath: /datavolumes:- name: redis-persistent-storagenfs:path: /k8s-nfs/redis/data # 共享出来的目录server: 192.168.126.112 # 提前做好解析
apiVersion: v1
kind: PersistentVolume
metadata:name: mypv1namespace: defaultlabels: # 对 pv 打 label,关联pvc到特定的pvpv: nfs-pv1
spec:capacity: # 指定 PV 的容量为 1Gstorage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: nfs # 指定PV的class为nfs,等同于为PV设置一个分类,PVC可以指定class申请相应的class的PVnfs:path: /nas/pv1 # 指定 PV 在 NFS 服务器上对应的目录,/nas/pv1这个目录得存在server: 192.168.11.45
accessModes: 指定访问模式,支持的访问模式有:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc1
namespace: default
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi # 只需要指定 PV 的容量,访问模式和 classstorageClassName: nfsselector:matchLabels: # 使用 matchLabel 来关联刚创建的 pv:nfs-pv1,绑定到特定的pvpv: nfs-pv1
创建 mypvc1:
apiVersion: v1
kind: Pod
metadata:name: mypod1
spec:containers:- name: mypod1image: busyboxargs:- /bin/sh- -c- sleep 30000volumeMounts:- mountPath: "/mydata"name: mydatavolumes:- name: mydatapersistentVolumeClaim:claimName: mypvc1
创建 mypod1:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain # StorageClass 支持 Delete 和 Retain 两种 reclaimPolicy,默认是 Delete
StorageClass slow
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
type: io1
zones: us-east-1d, us-east-1c
iopsPerGB: "10"
这两个 StorageClass 都会动态创建 AWS EBS,不同在于 standard 创建的是 gp2 类型的 EBS,而 slow 创建的是 io1 类型的 EBS。不同类型的 EBS 支持的参数可参考 AWS 官方文档。
与之前一样,PVC 在申请 PV 时,只需要指定 StorageClass 和容量以及访问模式,比如:apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc1
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi storageClassName: standard
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: nfsnfs:path: /nas/mysql-pv # 指定 PV 在 NFS 服务器上对应的目录,/nas/mysql-pv这个目录得存在server: 192.168.11.45
mysql-pvc.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvc1
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi # 只需要指定 PV 的容量,访问模式和 classstorageClassName: nfs
创建mysql-pv与mysql-pvc:
apiVersion: apps/v1 # 当前配置格式的版本
kind: Deployment # kind 是要创建的资源类型
metadata: # metadata 是该资源的元数据,name 是必需的元数据项name: mysql-deployment # deployment名称
spec: # spec 部分是该 Deployment 的规格说明selector: # 通过标签选择被控制的podmatchLabels:app: mysqlreplicas: 1 # 通过replicas声明pod个数是3template: # template 定义 Pod 的模板,这是配置文件的重要部分metadata: # metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定labels: # 给pod打上标签app=httpdapp: mysqlspec: # spec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image 是必需的。containers: # 声明容器的名称、镜像、端口- name: mysqlimage: mysql:5.7env:- name: MYSQL_ROOT_PASSWORDvalue: passwordports: # 需要暴露的端口库号列表- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mysql-pvc1---
apiVersion: v1
kind: Service
metadata:name: mysql-service
spec:selector:app: mysql # 将选择具有app: mysql标签的Pod作为管理范围ports:- port: 3306 # service监听端口
kubectl run -it --rm --image=mysql:5.7 --restart=Never mysql-client -- mysql -h mysql-service -ppassword