tjtjtjのメモ

自分のためのメモです

kubernetes 学習 configmap

configure-pod-configmap やってみたメモ。

最初

configmap がなにもないことを確認

$ kubectl get configmap
No resources found.

ディレクトリから configmap 作成

mkdir -> game.properties, ui.properties をディレクトリに取得 -> kubectl create configmap game-config でディレクトリ指定

mkdir -p configure-pod-container/configmap/kubectl/
wget https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties -O configure-pod-container/configmap/kubectl/game.properties
wget https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/ui.properties -O configure-pod-container/configmap/kubectl/ui.properties
kubectl create configmap game-config --from-file=configure-pod-container/configmap/kubectl/

wgetした game.properties を確認。UUDDLRLRBABAS ってww

enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30

wgetした ui.properties を確認

color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

作成したconfigmapを確認。--from-file で指定したディレクトリ内の ui.properties と game.properties が、ファイル名がキー、ファイル内容が値で作成されている。

$ kubectl get configmap game-config
NAME          DATA   AGE
game-config   2      5m49s
$ kubectl describe configmap game-config
Name:         game-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

Events:  <none>

yaml で確認したり、編集したり

$ kubectl get configmaps game-config -o yaml
$ kubectl edit configmaps game-config

ファイルから configmap 作成

--from-file でファイルを指定して作成するやり方。ファイル1コとファイル2コの例

$ kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/kubectl/game.properties
$ kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/kubectl/game.properties --from-file=configure-pod-container/configmap/kubectl/ui.properties

pod のボリュームにConfigMapデータをマウント

properties-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: properties-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: ["sleep", "3600"]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: game-config
  restartPolicy: Never

pod 作成

$ kubectl apply -f properties-pod.yaml

podで ls してみると

$ kubectl exec properties-pod -- ls /etc/config/ -al
total 40
drwxrwxrwx    3 root     root          4096 Feb 28 11:34 .
drwxr-xr-x    1 root     root          4096 Feb 28 11:35 ..
drwxr-xr-x    2 root     root          4096 Feb 28 11:34 ..2019_02_28_11_34_59.905140496
lrwxrwxrwx    1 root     root            31 Feb 28 11:34 ..data -> ..2019_02_28_11_34_59.905140496
lrwxrwxrwx    1 root     root            31 Feb 28 11:34 game-env-file.properties -> ..data/game-env-file.properties
lrwxrwxrwx    1 root     root            22 Feb 28 11:34 game.properties -> ..data/game.properties
lrwxrwxrwx    1 root     root            20 Feb 28 11:34 ui.properties -> ..data/ui.properties

pod で game.properties を cat してみると

$ kubectl exec properties-pod cat /etc/config/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30

pod 起動したまま、configmap:game-config を編集してみると

$ kubectl edit configmap game-config

  game.properties: |-
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
    qwer=asdf

podにマウントされたファイルが反映された 反映はすぐ行われない。ラグがある。

$ kubectl exec properties-pod cat /etc/config/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
$ kubectl exec properties-pod cat /etc/config/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
qwer=asdf

シンボリックリンクが更新されている。

$ kubectl exec properties-pod -- ls /etc/config/ -al
total 40
drwxrwxrwx    3 root     root          4096 Feb 28 11:46 .
drwxr-xr-x    1 root     root          4096 Feb 28 11:35 ..
drwxr-xr-x    2 root     root          4096 Feb 28 11:46 ..2019_02_28_11_46_07.342696761
lrwxrwxrwx    1 root     root            31 Feb 28 11:46 ..data -> ..2019_02_28_11_46_07.342696761
lrwxrwxrwx    1 root     root            31 Feb 28 11:34 game-env-file.properties -> ..data/game-env-file.properties
lrwxrwxrwx    1 root     root            22 Feb 28 11:34 game.properties -> ..data/game.properties
lrwxrwxrwx    1 root     root            20 Feb 28 11:34 ui.properties -> ..data/ui.properties

env ファイルからconfigmap作成

google translate先生、env ファイルってなに?

環境ファイルには環境変数のリストが含まれています。
これらの構文規則が適用されます。
envファイルの各行はVAR = VAL形式でなければなりません。
#で始まる行(つまりコメント)は無視されます。
空白行は無視されます。
引用符の特別な処理はありません(それらはConfigMap値の一部になります)。

ファイル取得し内容確認

$ wget https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game-env-file.properties -O configure-pod-container/configmap/kubectl/game-env-file.properties
$ cat configure-pod-container/configmap/kubectl/game-env-file.properties
enemies=aliens
lives=3
allowed="true"

# This comment and the empty line above it are ignored

env ファイルからconfigmap作成し確認

$ kubectl create configmap game-config-env-file \
        --from-env-file=configure-pod-container/configmap/kubectl/game-env-file.properties
configmap/game-config-env-file created

get で確認

$ kubectl get configmap game-config-env-file
NAME                   DATA   AGE
game-config-env-file   3      29s

describe で確認。空行、コメントがなくなっている。

$ kubectl describe configmap game-config-env-file
Name:         game-config-env-file
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
allowed:
----
"true"
enemies:
----
aliens
lives:
----
3
Events:  <none>

yaml で確認

$ kubectl get configmap game-config-env-file -o yaml
apiVersion: v1
data:
  allowed: '"true"'
  enemies: aliens
  lives: "3"
kind: ConfigMap
metadata:
  creationTimestamp: "2019-02-28T11:06:54Z"
  name: game-config-env-file
  namespace: default
  resourceVersion: "1816425"
  selfLink: /api/v1/namespaces/default/configmaps/game-config-env-file
  uid: f4eb52db-3b48-11e9-b688-9ca3ba319985

configmap 削除するなら。

kubectl delete configmap game-config-env-file

pod の環境変数に envFrom でConfigMapデータを設定

envファイル:game-config-env-file の内容すべてを環境変数に設定。やらなかったけどprefixフィルタできるそうだ。

envfrom-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: envfrom-pod
spec:
  containers:
  - name: nginx
    image: nginx
    envFrom:
    - configMapRef:
        name: game-config-env-file

pod 作ったり、確認したり、削除したり。。。

kubectl apply -f envfrom-pod
kubectl describe -f envfrom-pod.yaml
kubectl delete -f envfrom-pod.yaml

環境変数を確認

$ kubectl exec envfrom-pod env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=envfrom-pod
allowed="true"
enemies=aliens
lives=3
:

■ pod の環境変数に env でConfigMapデータを設定

env は環境変数を1コずつ指定するやり方。マニフェストに記述した値を環境変数に設定したり、configmap の値を環境変数に設定したり。

env-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: env-pod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
    # マニフェストに記述した値を環境変数に設定
    - name: ENV_X
      value: env_x_value
    # configmap の値を環境変数に設定
    - name: ENV_Y
      valueFrom:
        configMapKeyRef:
          name: game-config-env-file
          key: allowed

pod 作ったり、確認したり、削除したり。。。

kubectl apply -f env-pod.yaml
kubectl describe -f env-pod.yaml
kubectl delete -f env-pod.yaml

環境変数を確認

$ kubectl exec env-pod env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=env-pod
ENV_X=env_x_value
ENV_Y="true"
: