私有网络:这是一种很灵活的方式。可以给宿主机和虚机各自设定一个固定的IP地址,这样可以双向互访。任何端口都没有问题,唯一的缺点就是你要事先确定IP地址。详情请参见“Vagrant reverse port forwarding?”。Vagrant的配置命令:“config.vm.network "private_network", ip: "192.168.50.4”
当配置私有网络时,需要在笔记本的VirtualBox上配置“Host-only Adapter”,如下图所示。
但这会造成在Vagrant启动Minikube时产生如下错误:“VBoxManage.exe: error: Failed to create the host-only adapter”。这是VirtualBox的一个Bug,你可以下载一个软件解决,详见这里. 这个软件已经是四年之前的了,开始还担心是否与现在的VirtualBox版本兼容,结果很好用,而且它是一个单独运行的软件,不会与现在的软件冲突。只要在启动虚机之前,用管理员身份运行这个补丁就行了。另外一个问题是,我原来使用的是5.x版的VirtualBox,上图中只能选“NAT”,不能选“Host-only Adapter”,升级到6.X之后才能选“Host-only Adapter”。但当虚机重新启动之后,它会自动变回“NAT”,不过私有网络还是可用。
创建持久卷(PersistentVolume):k8s卷的概念包括卷和持久卷。
卷(volume):卷是k8s的存储概念,它依附于Pod,不能单独存在。但它不是在容器层。因此如果容器被重新启动,卷仍然在。但如果Pod重新启动,卷就丢失了。如果一个Pod里有多个容器,那么这些容器共享Pod的卷。你可以把卷看成是一个目录,里面可以存储各种文件。k8s支持各种类型的卷,例如本地文件系统和各种云存储。
持久卷(PersistentVolume):是对卷的一个封装,目的是为了更好地管理卷。它的生命周期不需要与Pod绑定,它可以独立于Pod存在。
持久卷申请(PersistentVolumeClaim):是对持久卷资源的一个申请,你可以申请特定的存储容量的大小和访问模式,例如读写模式或只读模式。k8s会根据持久卷申请分配适合的持久卷,如果没有合适的,系统会自动创建一个。持久卷申请是对持久卷的一个抽象,就像编程里的接口(Interface),它可以有不同的具体实现(持久卷)。例如,阿里云和华为云支持的存储系统不同,它生成的持久卷也不相同。持久卷是与特定的存储实现绑定的。那你要把程序从阿里云移植到华为云,怎么保证配置文件的兼容性呢?你就用持久卷申请来做这个接口,它只规定存储容量大小和访问模式,而由阿里云和华为云自动生成各自云里满足这个接口需求的持久卷. 不过,它还有一个限制条件,那就是持久卷申请和持久卷的StorageClass需要匹配,这使它没有接口灵活。后面会详细讲解。
动态持久卷:在这种情况下,你只需创建持久卷申请(不需要单独创建持久卷),然后把持久卷申请与部署绑定。系统会按照持久卷申请自动创建持久卷。下面是持久卷申请配置文件。其中“storage:1Gi”,是指申请的空间大小是1G。
持久卷申请配置文件:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim labels: app: mysql spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi #持久卷的容量是 1 GB ``` **挂载持久卷申请的部署:** 下面是挂载了持久卷申请的部署配置文件。它通过把持久卷申请当做持久卷来使用,与Pod进行绑定。请阅读文件里有关持久卷的注释。 ```shell apiVersion: apps/v1 kind: Deployment metadata: name: mysql-deployment spec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: mysql:5.7 name: mysql-con imagePullPolicy: Never env: - name: MYSQL_ROOT_PASSWORD value: root - name: MYSQL_USER value: dbuser - name: MYSQL_PASSWORD value: dbuser args: ["--default-authentication-plugin=mysql_native_password"] ports: - containerPort: 3306 name: mysql volumeMounts: # 挂载Pod上的卷到容器 - name: mysql-persistent-storage # Pod上卷的名字,与“volumes”名字匹配 mountPath: /var/lib/mysql # 挂载的Pod的目录 volumes: # 挂载持久卷到Pod - name: mysql-persistent-storage # 持久卷名字, 与“volumMounts”名字匹配 persistentVolumeClaim: claimName: mysql-pv-claim # 持久卷申请名字这里只指定了Pod的挂载目录,并没有指定虚拟机(宿主机)的目录,后面会讲到如何找到虚拟机的目录(系统自动分配挂载目录)。
运行部署:
键入“kubectl apply -f mysql-volume.yaml”创建持久卷申请,在创建它的同时,系统自动创建持久卷。