持久卷和申请的配置文件:
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 1Gi volumeMode: Filesystem accessModes: - ReadWriteOnce storageClassName: standard #持久卷存储类型,它需要与持久卷申请的类型相匹配 local: path: /home/vagrant/database/mysql #宿主机的目录 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - minikube # Node的名字 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim labels: app: mysql spec: accessModes: - ReadWriteOnce # storageClassName: # 这里的存储类型注释掉了 resources: requests: storage: 1Gi #1 GB如果不知道Node名字,可用如下命令查看:
vagrant@ubuntu-xenial:/$ kubectl get node NAME STATUS ROLES AGE VERSION minikube Ready master 6d3h v1.15.2改用静态持久卷之后,只有持久卷配置文件发生了变化,部署和服务的配置文件没有变。重新运行持久卷和部署,成功之后,即使重启虚拟机,MySQL里面的新建内容也没有丢失。
注意这里storageClassName的用法。k8s规定持久卷和持久卷申请的storageClassName必须匹配,这时才会把持久卷分配给持久卷申请。我们这里的持久卷申请没有指定storageClassName,这时系统会使用缺省的storageClass。
查看是否安装了缺省的storageClass
vagrant@ubuntu-xenial:/$ kubectl get sc NAME PROVISIONER AGE standard (default) k8s.io/minikube-hostpath 6d3h vagrant@ubuntu-xenial:/$查看缺省的storageClass详细信息
vagrant@ubuntu-xenial:/$ kubectl describe sc Name: standard IsDefaultClass: Yes Annotations: storageclass.kubernetes.io/is-default-class=true Provisioner: k8s.io/minikube-hostpath Parameters: <none> AllowVolumeExpansion: <unset> MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: Immediate Events: <none>从这里可以看出,Minikube安装了缺省的storageClass,它的名字是“standard”。上面的持久卷申请里没有指定storageClass,因此系统使用缺省的storageClass与之匹配,而上面的持久卷的storageClassName是“standard”,正好能配上。详情请见“Dynamic Provisioning and Storage Classes in Kubernetes”
踩过的坑:
使用Hyper-V还是VirtualBox
Hyper-V和VirtualBox是不兼容的,只能选一个(当然你可以在这两者之间切换,但太麻烦了)。我在Windows上装了VirtualBox,运行正常。进入Vagrant之后,安装了“ubuntu”版的Linux。这时,当你启动Minikube时,可以键入“minikube start --vm-driver=virtualbox”,但系统显示“This computer doesn\'t have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory”。我按照网上的建议去修改BIOS的“VT-X/AMD-v”,但我的BIOS就没有这个选项。其他的方法也都试过了,没有一个成功的。但因为已经装了VirtualBox,就不能用Hyper-V了。就只能用另外一个方法,使用命令“minikube start --vm-driver=none”。幸好这个方法工作得很好。
当用“minikube start --vm-driver=virtualbox”时,你是先建了虚拟机,再在虚拟机上运行Minikube。当用“minikube start --vm-driver=none”时,是直接在宿主机上运行Minikube。但由于我的Windows版本不能直接支持k8s,我已经在Windows上装了Linux虚机,并用Vagrant进行管理。如果用“minikube start --vm-driver=virtualbox”,就是在Linux虚机上又装了一个虚机。现在用“minikube start --vm-driver=none”,表面上看是在宿主机上运行,实际上已经运行在Windows的Linux虚机上了。
登录k8s集群
当用“minikube start --vm-driver=none”启动Minikube时,不能用“minikube ssh”登录k8s集群,因为这时已经没有虚机了,是直接安装在宿主机上,因此不需要“minikube ssh”。但你可以登录到Pod上,可用如下命令:" kubectl exec -ti mysql-deployment-56c9cf5857-fffth -- /bin/bash"。其中“mysql-deployment-56c9cf5857-fffth”是Pod名字。
创建重名PV或PVC
当原来的PV或PVC还在,而你又创建了一个新的PV, 并与原来的重名,则会得到如下错误:The persistentvolumeclaim "mysql-pv-claim" is invalid: spec: forbidden: is immutable after creation except resources.requests for bound claims. 这时,你需要将原来的PV或PVC删掉,再重新创建新的。
请继续阅读下篇“通过搭建MySQL掌握k8s(Kubernetes)重要概念(下):参数配置”
索引:通过实例快速掌握k8s(Kubernetes)核心概念
Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?
Vagrant reverse port forwarding?
hostPath as volume in kubernetes
Kubernetes Volumes Guide
Dynamic Provisioning and Storage Classes in Kubernetes