KubernetesのConfigMapの作成方法・確認方法

プログラミング
この記事は約17分で読めます。

 

このページの内容は、minikubeで行っています(特に普通のkubernetesと差異はないはず?)。また、利用しているversionは以下の通りです。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.2", GitCommit:"81753b10df112992bf51bbc2c2f85208aad78335", GitTreeState:"clean", BuildDate:"2018-04-27T09:22:21Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

 


設定について

Dockerを利用したアプリケーションを作成した際には、設定はどこに配置しますか?おそらく次の2つの内どちらかだと思います。

  • 起動時に環境変数としてDockerに渡す
  • 起動時にvolume追加して設定ファイルを配置する

Twelve-Factor App的には環境変数で渡す方が筋がよさそうですが、ConfigMapを使えば、どちらも簡単に実現できます。

 


ConfigMapの作成

ConfigMapの作成方法は以下の4つがあるようです。

  • ディレクトリからConfigMap作成
  • ファイルからConfigMap作成
  • リテラルからConfigMap作成
  • kubernetesのyamlファイルを直接作成

上の3つの方法ではkubectl create configmapを利用します。使い方は以下の通りです。

$ kubectl create configmap <map-name> <data-source>
  • <map-name>  configmapの名前
  • <data-source>  ディレクトリ・ファイル・リテラル

 

■ ディレクトリからConfigMap作成

設定ファイルって色々ありますよね。=形式、yaml形式、json形式などなど。

$ ls property/
app.properties  default.yml  develop.json

$ cat property/app.properties 
classname=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/sampledb
username=testuser
password=testpassword

$ cat property/default.yml 
mysql1:
  master:
    host: 'localhost'
    port: 3306
    dbName: 'testDb'
    user: 'master'
    password: 'password'
  slave:
    host: 'localhost'
    port: 3306
    dbName: 'testDb'
    user: 'slave'
    password: 'password'

$ cat property/develop.json 
{
    "server": {
        "port": 3000
    },
    "db": {
        "host": "localhost",
        "user": "dbuser",
        "password": "dbpassword",
        "database": "dbname",
        "timezone": "utc",
        "dateStrings": "date"
    },

    "mongodb": {
        "dsn": "mongodb://localhost:27017/dev-app"
    },
    
    "log": {
        "appenders": [
            {
                "category": "access",
                "type": "dateFile",
                "filename": "/path/to/dev-app/logs/access.log",
                "pattern": "-yyyy-MM-dd"
            }, {
                "category": "app",
                "type": "dateFile",
                "filename": "/path/to/dev-app/log/system.log",
                "pattern": "-yyyy-MM-dd"
            }, {
                "category": "error",
                "type": "dateFile",
                "filename": "/path/to/dev-app/log/error.log",
                "pattern": "-yyyy-MM-dd"
            }, {
                "type": "console"
            }
        ]
    }
}

これらのpropertyディレクトリにあるファイルをすべてConfigMapとして作成にするには以下のコマンドを用います。

$ kubectl create configmap game-config --from-file=./property
configmap "game-config" created

# 削除はこちら
$ kubectl delete configmap game-config
configmap "game-config" deleted

createしたConfigMapは以下のコマンドで確認できます。

  • kubectl get configma <map-name>
  • kubectl describe configmap <map-name>
  • kubectl get configmap <map-name> -o yaml

実際に今回createしたファイルは以下のように見えます。お好きなものをご利用ください。

ポイントとしては、「ファイル名がキー(Key)」:「ファイル内容が値(Value)」となってyaml形式で保存されているところです。

$ kubectl get configmap game-config
NAME          DATA      AGE
game-config   3         56s

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

Data
====
app.properties:
----
classname=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/sampledb
username=testuser
password=testpassword

default.yml:
----
mysql1:
  master:
    host: 'localhost'
    port: 3306
    dbName: 'testDb'
    user: 'master'
    password: 'password'
  slave:
    host: 'localhost'
    port: 3306
    dbName: 'testDb'
    user: 'slave'
    password: 'password'

develop.json:
----
{
    "server": {
        "port": 3000
    },
    "db": {
        "host": "localhost",
        "user": "dbuser",
        "password": "dbpassword",
        "database": "dbname",
        "timezone": "utc",
        "dateStrings": "date"
    },

    "mongodb": {
        "dsn": "mongodb://localhost:27017/dev-app"
    },
    
    "log": {
        "appenders": [
            {
                "category": "access",
                "type": "dateFile",
                "filename": "/path/to/dev-app/logs/access.log",
                "pattern": "-yyyy-MM-dd"
            }, {
                "category": "app",
                "type": "dateFile",
                "filename": "/path/to/dev-app/log/system.log",
                "pattern": "-yyyy-MM-dd"
            }, {
                "category": "error",
                "type": "dateFile",
                "filename": "/path/to/dev-app/dev-app07/log/error.log",
                "pattern": "-yyyy-MM-dd"
            }, {
                "type": "console"
            }
        ]
    }
}

#####################################################################

$ kubectl get configmap game-config -o yaml
apiVersion: v1
data:
  app.properties: |
    classname=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost/sampledb
    username=testuser
    password=testpassword
  default.yml: |
    mysql1:
      master:
        host: 'localhost'
        port: 3306
        dbName: 'testDb'
        user: 'master'
        password: 'password'
      slave:
        host: 'localhost'
        port: 3306
        dbName: 'testDb'
        user: 'slave'
        password: 'password'
  develop.json: "{\n    \"server\": {\n        \"port\": 3000\n    },\n    \"db\":
    {\n        \"host\": \"localhost\",\n        \"user\": \"dbuser\",\n        \"password\":
    \"dbpassword\",\n        \"database\": \"dbname\",\n        \"timezone\": \"utc\",\n
    \       \"dateStrings\": \"date\"\n    },\n\n    \"mongodb\": {\n        \"dsn\":
    \"mongodb://localhost:27017/dev-app\"\n    },\n    \n    \"log\": {\n        \"appenders\":
    [\n            {\n                \"category\": \"access\",\n                \"type\":
    \"dateFile\",\n                \"filename\": \"/path/to/dev-app/logs/access.log\",\n
    \               \"pattern\": \"-yyyy-MM-dd\"\n            }, {\n                \"category\":
    \"app\",\n                \"type\": \"dateFile\",\n                \"filename\":
    \"/path/to/dev-app/log/system.log\",\n                \"pattern\": \"-yyyy-MM-dd\"\n
    \           }, {\n                \"category\": \"error\",\n                \"type\":
    \"dateFile\",\n                \"filename\": \"/path/to/dev-app/dev-app07/log/error.log\",\n
    \               \"pattern\": \"-yyyy-MM-dd\"\n            }, {\n                \"type\":
    \"console\"\n            }\n        ]\n    }\n}\n"
kind: ConfigMap
metadata:
  creationTimestamp: 2018-05-22T12:30:37Z
  name: game-config
  namespace: default
  resourceVersion: "40807"
  selfLink: /api/v1/namespaces/default/configmaps/game-config
  uid: ee614638-5dbb-11e8-b633-080027936a1f

 


■ ファイルからConfigMap作成

ディレクトリの中身すべてのファイルををConfigMapに追加するときとほぼ同じです。コマンドは以下の通り

$ kubectl create configmap app-config --from-file=property/app.properties 
configmap "app-config" created

# 削除するときはこちら
$ kubectl delete configmap app-config
configmap "app-config" deleted

作成したConfigMapの確認方法は同様なので省略しますが、describeで見てみると以下のようにファイル名がそのままキー名になっているのがわかります。

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

Data
====
app.properties:
----
classname=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/sampledb
username=testuser
password=testpassword

Events:  <none>

ファイル名をキー名としたくない場合、–from-file=<my-key-name>=<path-to-file> とすることで、作成時にキー名を指定できます。以下の例ではファイル名(app.properties)でなく指定した(game-app-config)がキー名になっていることがわかります。

$ kubectl delete configmap app-config
configmap "app-config" deleted

$ kubectl create configmap app-config --from-file=game-app-config=property/app.properties 
configmap "app-config" created

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

Data
====
game-app-config:
----
classname=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/sampledb
username=testuser
password=testpassword

Events:  <none>

 

■ リテラルからConfigMap作成

キー名と値(key-value)の文字列を直接入力して、ConfigMapを作成します。作成コマンドは以下の通りです。key-valueのセットはいくらでも入力できます。

kubectl create configmap <map-name> --from-literal=<key1>=<value1> --from-literal=<key2>=<value2>

例えば以下のように作成できます。

$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
configmap "special-config" created

# 以下のようにConfigMapが作成できている
$ kubectl get configmaps special-config -o yaml
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  creationTimestamp: 2018-05-22T13:00:49Z
  name: special-config
  namespace: default
  resourceVersion: "42799"
  selfLink: /api/v1/namespaces/default/configmaps/special-config
  uid: 26526935-5dc0-11e8-b633-080027936a1f

 

■ kubernetesのyamlファイルを直接作成

ここまでの3つは、kubectl create configmapを利用していましたが、「yamlファイルを直接作成」では、kubectl create -f <yamlファイル>を利用して作成します。

$ cat config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
data:
  special.how: very
  special.type: charm


# 作成・および削除は-fオプションでyamlファイルを指定します。
$ kubectl create -f config.yaml 
configmap "special-config" created

$ kubectl delete -f config.yaml 
configmap "special-config" deleted

 


参考

コメント

タイトルとURLをコピーしました