ConfigMapを使って任意のファイルをpod内に生成する
(2020/10/30作成)
はじめに
最近kubernetesを触り始めて、kustomizeでpodを立てることを学んでいる。
その中でConfigMapを作ってpod内にファイル生成をする方法が何となく理解できたので、アウトプットしてみた。
大体のことは公式ドキュメントに書いてあるのでそちらを参照されたし
ConfigMapとは
- 設定情報などのKey-Vlaueで保持できるデータを保存しておくリソース
- podに置きたいファイル、設定したい環境変数などをマニフェストとして持つことができる
- パスワードなど、暗号化したい情報は
Secret
を使う、という使い分けがある
環境
kubernetes v1.18.1
やりたいこと
- k8sでpodを立てるときに、pod内の特定のvolumeパスに任意のファイルを生成したい
手順
- 生成したいファイルをConfigMap化する(ConfigMapGenerator)
- pod内のvolume pathを定義する(volumeMounts)
- 2で定義したパスに対してどのようなファイルを生成するかを記述する(volumes)
-
kustomize build
コマンドを実行する
- applyする
例
- pod内の
/hoge/fuga
配下にA.txtを配置する。
- A.txtは手元のファイルを元に作成。
概要図
kustomize build
コマンドを実行する- pod内の
/hoge/fuga
配下にA.txtを配置する。 - A.txtは手元のファイルを元に作成。
概要図
※比較のためにB.txtを書いているが以下の詳細ではB.txtの作成は省略する
ディレクトリ構成
.
├── kustomization.yml
├── deployment.yml
└── A.txt
ConfigMapGeneratorを書く
- ConfigMapGeneratorを利用する利点としては以下
- ConfigMapのyamlファイルを自分で作成する必要がない
- 元ファイルとマニフェストを分離できる
(Aファイルをpodに置きたいと思ったらAファイルを用意すればいい)
.
├── kustomization.yml
├── deployment.yml
└── A.txt
- ConfigMapGeneratorを利用する利点としては以下
- ConfigMapのyamlファイルを自分で作成する必要がない
- 元ファイルとマニフェストを分離できる
(Aファイルをpodに置きたいと思ったらAファイルを用意すればいい)
逆に言えば、ConfigMapGeneratorを利用しないでも、自分でkind: ConfigMap
のyamlを用意して、その中のValueとして配置したいファイルの中身が書いてあればよい
-> 別でConfigMapのyamlを用意する場合
- 今回の例の場合A.txtを元にpod内に同じA.txtを配置したいので以下となる。
resources:
- deployment.yml
configMapGenerator:
- name: ConfigMapA #作成されるConfigMapの識別名
files:
- A.txt #元となるファイルを記載
aaa
bb
cccc
- これに
kusomize build
コマンドを実行することにより以下のようなマニフェストが作成される
<省略>
data:
A.txt: |- # ファイル名が"key"に、中身が"Value"になる
aaa
bb
cccc
kind: ConfigMap
metadata:
name: ConfigMapA-<乱数> #なぜか最後に乱数が入る
<省略>
pod内のvolume pathを定義する(volumeMounts)
-
deployment.yml
で.spec.containers[].volumeMounts[]
を記述。
- 今回のファイル作成先となる
/hoge/fuga
を定義する。
deployment.yml
kind: Deployment
<省略>
spec:
containers:
- name: sample
image: sample-image
volumeMounts:
- name: path-a #Volumeパスの識別名
mountPath: "/hoge/fuga" #デフォルトで無ければパスが作成される
定義したパスに対してどのようなファイルを生成するかを記述する(volumes)
- ConfigMapGeneratorで作成されるConfigMapAを用いる
- ConfigMapA内のどの箇所(key)を使って、何という名前(path)のファイルを生成するかを書く
deployment.yml
kind: Deployment
<省略>
spec:
containers:
<省略>
volumes:
- name: path-a #上でマウントしたVolumeパスを指定
configMap: #ConfigMapを元にファイルを作成することを宣言
name: ConfigMapA #ConfigMapを識別
items:
- key: A.txt #ConfigMapAの中の"key"を指定
path: A.txt #pod内に作成するファイル名を記載
kustomize build
コマンドを実行する
- ConfigMapとdeployment.ymlが合わさったマニフェストが作成される。
- 作成されたConfigMapのnameは、上で書いたように指定した
ConfigMapA
ではなくConfigMapA-<乱数>
となるが、Volumesでの指定も勝手に書き換えてくれるのでOK
kustomize build . > kustomize-deployment.yml
applyする
kubectl apply -f kustomize-deployment.yml
- podが立ち上がったら
kubectl exec -it <pod名> /bin/bash
deployment.yml
で.spec.containers[].volumeMounts[]
を記述。/hoge/fuga
を定義する。kind: Deployment
<省略>
spec:
containers:
- name: sample
image: sample-image
volumeMounts:
- name: path-a #Volumeパスの識別名
mountPath: "/hoge/fuga" #デフォルトで無ければパスが作成される
- ConfigMapGeneratorで作成されるConfigMapAを用いる
- ConfigMapA内のどの箇所(key)を使って、何という名前(path)のファイルを生成するかを書く
kind: Deployment
<省略>
spec:
containers:
<省略>
volumes:
- name: path-a #上でマウントしたVolumeパスを指定
configMap: #ConfigMapを元にファイルを作成することを宣言
name: ConfigMapA #ConfigMapを識別
items:
- key: A.txt #ConfigMapAの中の"key"を指定
path: A.txt #pod内に作成するファイル名を記載
kustomize build
コマンドを実行する
- ConfigMapとdeployment.ymlが合わさったマニフェストが作成される。
- 作成されたConfigMapのnameは、上で書いたように指定した
ConfigMapA
ではなくConfigMapA-<乱数>
となるが、Volumesでの指定も勝手に書き換えてくれるのでOK
kustomize build . > kustomize-deployment.yml
applyする
kubectl apply -f kustomize-deployment.yml
- podが立ち上がったら
kubectl exec -it <pod名> /bin/bash
ConfigMapA
ではなくConfigMapA-<乱数>
となるが、Volumesでの指定も勝手に書き換えてくれるのでOKkustomize build . > kustomize-deployment.yml
kubectl apply -f kustomize-deployment.yml
- podが立ち上がったら
kubectl exec -it <pod名> /bin/bash
などでpod内に想定通りファイルがあるか確認してみてください。
おまけ
別でConfigMapのyamlを用意する場合
-
kind: ConfigMap
のyamlを書くだけ
- ファイルを元にConfigMapを作成するのはコマンドでもできる
-
metadata.name
はConfigMapの識別名となる。(マニフェスト内で指定されるのはこっち。ConfigMapのファイル名は何でもいいし使われない)
kubectl create configmap --dry-run=client <metadata.name> --from-file=<file> -o yaml > <hoge>.yml
patchファイルを用いる場合のvolumes
- いわゆる以下のような構成で、素のdeploymentを用意して、patchを当ててkustomizeを管理する場合
.
├── base
│ ├── kustomization.yml
│ └── deployment.yml
└── overlays
└── prod
├── kustomization.yml
├── patch-deployment.yml
└── A.txt
-
deployment.yml
で先にディレクトリを定義をしたければ、下記のように空のディレクトリを宣言し、
base/deployment.yml
volumes:
- name: path-a
emptyDir: {}
-
patch-deployment.yml
側でnullであることを改めて宣言し直さなければいけない
overlays/patch-deployment.yml
volumes:
- name: path-a
emptyDir: null
configMap:
name: ConfigMapA
items:
- key:
path:
- patchの方でディレクトリパスを定義すればこんなことにはならなそうですが
kind: ConfigMap
のyamlを書くだけ-
metadata.name
はConfigMapの識別名となる。(マニフェスト内で指定されるのはこっち。ConfigMapのファイル名は何でもいいし使われない)
kubectl create configmap --dry-run=client <metadata.name> --from-file=<file> -o yaml > <hoge>.yml
.
├── base
│ ├── kustomization.yml
│ └── deployment.yml
└── overlays
└── prod
├── kustomization.yml
├── patch-deployment.yml
└── A.txt
deployment.yml
で先にディレクトリを定義をしたければ、下記のように空のディレクトリを宣言し、 volumes:
- name: path-a
emptyDir: {}
patch-deployment.yml
側でnullであることを改めて宣言し直さなければいけない volumes:
- name: path-a
emptyDir: null
configMap:
name: ConfigMapA
items:
- key:
path:
Author And Source
この問題について(ConfigMapを使って任意のファイルをpod内に生成する), 我々は、より多くの情報をここで見つけました https://qiita.com/shu-suke/items/517b9ecca8b1d5283124著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .