このセクションでは、hostPath の Volume リソースについて紹介します。 hostPath の Volume リソースは、Kubernetes Node 上の領域をコンテナにマッピングすることができます。マッピングすると Kubernetes Node 上のディレクトリが参照できてしまうため、セキュリティの観点から利用を控えるようにしてください。また、セキュリティの観点から hostPath を利用できないようにしている Kubernetes 環境もあります。

サンプルのマニフェストファイルを新規作成し、以下コードを記述します。

[root@kube-master sample-volume]# vi sample-hostpath.yaml 

spec の containers の volumeMounts に Volume のマウントパスを指定します。また、volumes に hostPath を指定しています。hostPath の type には、Directory、DirectoryOrCreate、File、Socket、BlockDevice などがあり、Directory はディレクトリが存在しなければ何もしませんが、DirectoryOrCreate はディレクトリが存在しない場合には作成する違いがあります。

apiVersion: v1
kind: Pod
metadata:
  name: sample-hostpath
spec:
  containers:
    - name: nginx-container
      image: nginx:1.13
      volumeMounts:
      - mountPath: /srv
        name: hostpath-sample
  volumes:
  - name: hostpath-sample
    hostPath:
      path: /etc
      type: DirectoryOrCreate

Master サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。

[root@kube-master sample-volume]# kubectl apply -f sample-hostpath.yaml 
pod/sample-hostpath created
[root@kube-master sample-volume]#

Master サーバーから Kubernetes クラスタ上の Pod リソースを確認します。

[root@kube-master sample-volume]# kubectl get pod sample-hostpath
NAME              READY   STATUS    RESTARTS   AGE
sample-hostpath   1/1     Running   0          9s
[root@kube-master sample-volume]# 

Master サーバーから Pod の /srv/os-release を参照します。ここでは、/srv/ はホスト上の /etc/ にマウントされているため、ホスト上の OS情報が参照できていることが確認できます。

[root@kube-master sample-volume]# kubectl exec -it sample-hostpath cat /srv/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

[root@kube-master sample-volume]# 

Master サーバーから Pod の /etc/os-release を参照します。ここでは、Pod の OS情報が参照できていることが確認できます。

[root@kube-master sample-volume]# kubectl exec -it sample-hostpath cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
[root@kube-master sample-volume]# 

Master サーバーから 作成したKubernetes クラスタ上の Pod リソースを削除します。

[root@kube-master sample-volume]# kubectl delete pod sample-hostpath
pod "sample-hostpath" deleted
[root@kube-master sample-volume]#