🎼

[Kubernetes] ConfigMap を使ってファイルを Pod へマウントする

2023/07/29に公開

色々と制約のある環境にて、「kubectl を叩く端末に置いてあるファイルを Pod へ配置したい」という要件があり。

PV を用意するのも微妙、hostPath も避けたいなぁと思って調べていたところ、ConfigMap で読ませれば良さそうということで、試してみました。

環境・準備

  • Azure Kubernetes Service (v1.24.9)
  • Windows 10

やってみた

ファイルの準備

下記のファイルを用意しておきます。

テキストファイル

example.txt
test1
test2

バイナリファイル

上記のテキストファイルを zip 圧縮したものを用意しました。

ConfigMap の作成

テキストファイル

カレントディレクトリにファイルを用意し、下記のコマンドを実行します。

kubectl create configmap configmap-text --from-file=example.txt --dry-run=client -oyaml > configmap-text.yaml

yaml ファイルが作成されるので、これをデプロイします。

kubectl apply -f configmap-text.yaml

下記のように、Kubernetes 側に ConfigMap として登録されていれば OK です。

$ kubectl describe configmap configmap-text
Name:         configmap-text
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
example.txt:
----
test1\r
test2

BinaryData
====

Events:  <none>

バイナリファイル

バイナリファイルも同様に、カレントディレクトリにファイルを用意し、下記のコマンドを実行します。

kubectl create configmap configmap-binary --from-file=example.zip --dry-run=client -oyaml > configmap-binary.yaml

yaml ファイルが作成されるので、これをデプロイします。

kubectl apply -f configmap-binary.yaml

下記のように、Kubernetes 側に ConfigMap として登録されていれば OK です。

$ kubectl describe configmap configmap-binary
Name:         configmap-binary
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====

BinaryData
====
example.zip: 167 bytes

Events:  <none>

Deployment (yaml) の作成

作成した ConfigMap をマウントする yaml を作成します。Pod でも良いのですが、とりあえず Deployment で。

deployment-configmap-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: configmap-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: configmap-test
  template:
    metadata:
      labels:
        app: configmap-test
    spec:
      containers:
      - image: ubuntu
        command:
        - "sleep"
        - "604800"
        imagePullPolicy: IfNotPresent
        name: configmap-test
        volumeMounts:
        - name: volume-configmap-text
          mountPath: /tmp/example-text
        - name: volume-configmap-binary
          mountPath: /tmp/example-binary
      volumes:
      - name: volume-configmap-text
        configMap:
          name: configmap-text
      - name: volume-configmap-binary
        configMap:
          name: configmap-binary

動作確認

Deployment の yaml ファイルをデプロイし…

kubectl apply -f .\deployment-configmap-test.yaml

Pod が無事起動したので…

> kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
configmap-test-c9465459d-45sxj   1/1     Running   0          4

Pod の中に入ってみます。

$ kubectl exec -it configmap-test-c9465459d-45sxj -- bash

# ls -al /tmp
total 16
drwxrwxrwt 1 root root 4096 Jul 28 15:01 .
drwxr-xr-x 1 root root 4096 Jul 28 15:01 ..
drwxrwxrwx 3 root root 4096 Jul 28 15:01 example-text
drwxrwxrwx 3 root root 4096 Jul 28 15:01 example-binary

無事、マウントできていることが確認できます。

中身のチェックも大丈夫そう。

# cat /tmp/example-text/example.txt
test1
test2

# apt-get update; apt-get install unzip

# unzip -l /tmp/example-binary/example.zip
Archive:  /tmp/example-binary/example.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       12  2023-07-28 23:31   example.txt
---------                     -------
       12                     1 file

# unzip -d /tmp /tmp/example-binary/example.zip
Archive:  /tmp/example-binary/example.zip
  inflating: /tmp/example.txt

# cat /tmpexample.txt
test1
test2

まとめ

ということで、無事ホスト側へのファイル転送等は行わずに Pod へファイルを見せることができました。

基本的に AKS などはホスト側での作業せずに済ませたいので、こういう Tips はきちんと把握しておかないとですね…!

Discussion