让我们做一个MVC控制器,它会在POD的/mnt/share目录创建一个日志文件,并记录访问日志:
@RestController public class VolumeController {
@GetMapping( path = "/logUrlHit") public String logUrlHit() { final String fileNameRandom = UUID.randomUUID().toString(); try (PrintWriter p = new PrintWriter(new FileOutputStream("/mnt/share/"+fileNameRandom+".txt", true))) { p.println("Datetime: "+new Date()); } catch (FileNotFoundException e1) { e1.printStackTrace(); }
return "Url hit logged as "+fileNameRandom; } }
|
现在我们想要让POD中的/mnt/share目录内容能够在minikube主机中访问,下面是准备helm chart部署模板的配置:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: {{ .Chart.Name }} spec: replicas: {{ .Values.replicaCount }} template: metadata: labels: app: {{ .Chart.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - containerPort: {{ .Values.service.internalPort }} volumeMounts: - name: {{ .Values.volumes.volumeName }} mountPath: {{ .Values.volumes.containerPath }} volumes: - name: {{ .Values.volumes.volumeName }} hostpath: path: {{ .Values.volumes.hostPath }} type: DirectoryOrCreate
|
了解更多hstpath是如何设置工作的,可看看模板的Vaules.yaml:
replicaCount: 1 image: repository: volume-test tag: 0.0.1-SNAPSHOT pullPolicy: IfNotPresent service: name: volume-service type: NodePort externalPort: 8080 internalPort: 8080 volumes: containerPath: /mnt/share/ hostPath: /home/docker/pod_share volumeName: myvolume ingress: enabled: false # Used to create an Ingress record. hosts: - chart-example.local annotations: # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" tls: # Secrets must be manually created in the namespace. # - secretName: chart-example-tls # hosts: # - chart-example.local resources: {}
|
换句话说,我们安装POD的/mnt/share目录到minikube的主机/home/docker/pod_share下。
下面开始测试一下,在minikube中切换docker:
eval $(minikube docker-env)
构建项目:
mvn clean install
如果chart模板改变,需要构建helm chart:
helm package --debug ./volume-chart/volume-chart
构建chart以后,安装到kuberbetes:
helm install -n volume-chart volume-chart-0.1.0.tgz
测试:
mnk service volume-chart --url http://192.168.99.100:30789
curl http://192.168.99.100:30789/logUrlHit Url hit logged as 7f4bb181-04a1-4165-93bf-2103171fe542
|
现在文件产生与/mnt/share目录中,检查一下:
kubectl get pods NAME READY STATUS RESTARTS AGE volume-chart-774f8947b7-dqlpt 1/1 Running 1 1h
|
kubectl exec -it volume-chart-774f8947b7-dqlpt /bin/sh # cd /mnt/share # ls -l total 16 -rw-r--r-- 1 root root 39 Mar 3 20:46 289f2248-5f0c-4c07-b4c8-a8dd5539d511.txt -rw-r--r-- 1 root root 39 Mar 3 20:46 39da5e0c-59b9-42e7-9fd5-9fe5202e5980.txt -rw-r--r-- 1 root root 39 Mar 3 20:46 5b335a4e-b47f-43fe-82a4-cf4e4d7be0c0.txt -rw-r--r-- 1 root root 39 Mar 3 20:46 7f4bb181-04a1-4165-93bf-2103171fe542.txt
|
文件确实产生了,现在这些文件应该可以从POD外面访问。为了验证,登录进入minikube节点检查:
mnk ssh _ _ _ _ ( ) ( ) ___ ___ (_) ___ (_)| |/') _ _ | |_ __ /' _ ` _ `\| |/' _ `\| || , < ( ) ( )| '_`\ /'__`\ | ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )( ___/ (_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)
$ cd /home/docker/pod_share $ ls -l total 16 -rw-r--r-- 1 root root 39 Mar 3 20:46 289f2248-5f0c-4c07-b4c8-a8dd5539d511.txt -rw-r--r-- 1 root root 39 Mar 3 20:46 39da5e0c-59b9-42e7-9fd5-9fe5202e5980.txt -rw-r--r-- 1 root root 39 Mar 3 20:46 5b335a4e-b47f-43fe-82a4-cf4e4d7be0c0.txt -rw-r--r-- 1 root root 39 Mar 3 20:46 7f4bb181-04a1-4165-93bf-2103171fe542.txt
|
如果你重启minikuber,将丢失这些文件,需要持久使用,使用下面任何一个预定义目录:
- /data
- /var/lib/minikube
- /var/lib/docker
- /tmp/hostpath_pv
- /tmp/hostpath-provisioner
只需要在values.yaml改变:
hostPath: /home/docker/pod_share
到:
hostPath: /data/pod_share
重启可见效,点击标题查看测试源码和配置。