kubernetes中将hostpath卷安装到POD


让我们做一个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

重启可见效,点击标题查看测试源码和配置。