kubernetes中將hostpath卷安裝到POD

banq發表於2019-03-07

讓我們做一個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

重啟可見效,點選標題檢視測試原始碼和配置。

相關文章