ksaitoの日記

日々試したことの覚え書き

CodeBuildのローカル実行

CodeBuildのローカル実行がうまく動きませんでした。

AWS CodeBuild がローカルのテストとデバッグをサポート

手順に従ってビルドコンテナをビルドして、ヘルパーシェルをダウンロードして、実行してみると下記のエラーがでます。

$ ./codebuild_build.sh -i aws/codebuild/ruby:2.5.1 -a tmp
Build Command:

docker run -it -v /var/run/docker.sock:/var/run/docker.sock -e "IMAGE_NAME=aws/codebuild/ruby:2.5.1" -e "ARTIFACTS=/home/user/aws/aws-codebuild-docker-images/ubuntu/docker/17.09.0/tmp" -e "SOURCE=/home/user/aws/aws-codebuild-docker-images/ubuntu/docker/17.09.0" amazon/aws-codebuild-local:latest

Removing agentresources_build_1 ... done
Removing agentresources_agent_1 ... done
Removing network agentresources_default
Removing volume agentresources_user_volume
Removing volume agentresources_source_volume
Creating network "agentresources_default" with the default driver
Creating volume "agentresources_user_volume" with local driver
Creating volume "agentresources_source_volume" with local driver
Creating agentresources_agent_1 ... 
Creating agentresources_agent_1 ... done
Creating agentresources_build_1 ... 
Creating agentresources_build_1 ... done
Attaching to agentresources_agent_1, agentresources_build_1
agentresources_agent_1 exited with code 0
Stopping agentresources_build_1 ... done
Aborting on container exit...
$

VPCエンドポイントの性能

S3のVPCエンドポイントとNAT Gateway経由の性能差です。

1つ目がVPCエンドポイント経由で0.664ms、NAT Gateway経由が3.097msと圧倒的にVPCエンドポイントが早かった。

[ec2-user@ip-10-0-10-188 ~]$ sudo  tcptraceroute s3.ap-northeast-1.amazonaws.com 443
traceroute to s3.ap-northeast-1.amazonaws.com (52.219.68.120), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  s3-ap-northeast-1.amazonaws.com (52.219.68.120) <syn,ack>  0.660 ms  0.667 ms  0.664 ms
[ec2-user@ip-10-0-10-188 ~]$ sudo  tcptraceroute s3.ap-northeast-1.amazonaws.com 443
traceroute to s3.ap-northeast-1.amazonaws.com (52.219.0.60), 30 hops max, 60 byte packets
 1  ip-10-0-1-132.ap-northeast-1.compute.internal (10.0.1.132)  0.421 ms  0.401 ms  0.398 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  52.219.0.60 (52.219.0.60) <syn,ack>  3.357 ms  3.068 ms  3.097 ms
[ec2-user@ip-10-0-10-188 ~]$

テンプレートに環境変数を埋め込む。

Dockerコンテナを作るときに環境変数を使ってテンプレートから設定ファイルを作成します。

やりたいことは、次の2つなのですが、手軽な方法が見つかりません。

結局、ansibleのJinja2を使って次のようにしました。

テンプレートとplaybook

下記のようにテンプレートのtest.cfgとplaybookのmain.yamlを準備します。

$ cat templates/test.cfg
test={{ aaa }}
$ cat main.yaml
---
- name: setup proxy
  hosts: all
  vars:
    aaa: "{{ lookup('env', 'AAA') | ternary(lookup('env', 'AAA'), 'default value') }}"
  tasks:
    - name: test
      debug: msg="value is {{ aaa }}"
    - template:
        src: test.cfg
        dest: /tmp/test.cfg
$

動作確認

環境変数がなければ、ternaryのfalse側の値がデフォルト値として採用され、環境変数が定義されていれば、環境変数の値が埋め込まれます。

$ ansible-playbook -i "localhost," -c local main.yaml > /dev/null  && cat /tmp/test.cfg
test=default value
$ AAA="env value" ansible-playbook -i "localhost," -c local main.yaml > /dev/null  && cat /tmp/test.cfg
test=env value
$

下記のような不満は、ちょっとありますが、一番良さそう。

  • 環境変数の表現が長い(lookup(env, "環境変数")には省略形がほしい)
  • デフォルト値のternaryには、ちょっと馴染めない。
  • varsへの設定ではなく、テンプレート側に埋め込みたい

他に試した方法

envsubst

envsubstコマンドは、aptでインストール可能で、環境変数を${変数名}で置換するので最有力でしたが、デフォルト値が設定できなかったり、エスケープの問題が解決できず断念しまいた。

entrykit

DockerのEntrypointのための専用ツール、Jinja2風のテンプレート表記でデフォルト値の設定も可能と機能的には申し分なしでしたが、パッケージからのインストールができず、curl + tarが残念、また、Entrypointの表記が、ちょっと受け入れられなかった。

以上

kubectlのデフォルト環境

kubernetesで複数のクラスタを作成すると、kubectlコマンドで操作対象にするクラスタやネームスペースを選択するのが煩雑になります。

kubectl config set-contextでコンテキストにクラスタとネームスペースの組み合わせに名前をつけて切り替えられるようになるので便利です。

最初の環境

下記のように、最初に作成したクラスタとdefaultネームスペースが捜査の対象になります。

$ kubectl config get-contexts 
CURRENT   NAME      CLUSTER   AUTHINFO     NAMESPACE
*         sandbox   sandbox   user-6ds5r

コンテキストの作成

kubectl config set-contextコマンドで、クラスタとネームスペースの組み合わせに名前をつけます。

下記のようにsandboxクラスタのjenkinsネームスペースにjenkinsというコンテキスト名を付けます。

kubectl config set-context jenkins --cluster=sandbox --namespace=jenkins --user=user-6ds5r
$ kubectl config get-contexts 
CURRENT   NAME      CLUSTER   AUTHINFO     NAMESPACE
          jenkins   sandbox   user-6ds5r   jenkins
*         sandbox   sandbox   user-6ds5r
$

コンテキストの使用

kubectl config use-contextでコンテキストを切り替えます。

これで、kubectlコマンドの操作対象がsandboxクラスタのjenkinsネームスペースになります。

$ kubectl config use-context jenkins 
Switched to context "jenkins".
$ kubectl config current-context 
jenkins
$ kubectl config get-contexts 
CURRENT   NAME      CLUSTER   AUTHINFO     NAMESPACE
*         jenkins   sandbox   user-6ds5r   jenkins
          sandbox   sandbox   user-6ds5r 
$

以上

kubernetesのclusterとnamespaceとcontextの操作を整理

clusternamespacecontextの操作について整理します。

cluster

クラスタを一覧します。

kubectl config get-clusters

クラスタは、サーバの集まりなので、同じクラスタで動くワークロードはサーバリソースを共有します。負荷テスト用、開発用、本番用など、負荷とコストのバランスを考慮してクラスタを考える必要があります。

namespace

ネームスペースを一覧します。

$ kubectl get namespaces 
NAME            STATUS    AGE
default         Active    27m
ingress-nginx   Active    26m
kube-public     Active    27m
kube-system     Active    27m
$

ネームスペースは、クラスタに作成するリソースを入れるフォルダのようなものです。システム毎に作成して、他のシステムのリソースと分離することができます。

コンテキスト

コンテキストの一覧を表示します。

$ kubectl config get-contexts 
CURRENT   NAME      CLUSTER   AUTHINFO     NAMESPACE
*         Default   local     kube-admin
$

コンテキストでデフォルトで利用するクラスタとネームスペースを指定できます。

jenkins用の環境を作る場合には、次のようにします。

$ kubectl create namespace jenkins
namespace/jenkins created
$ kubectl config set-context my-jenkins --cluster=local --namespace=jenkins
Context "my-jenkins" created.
$ kubectl config use-context my-jenkins 
Switched to context "my-jenkins".
$ kubectl config get-contexts 
CURRENT   NAME         CLUSTER   AUTHINFO     NAMESPACE
          Default      local     kube-admin   
*         my-jenkins   local                  jenkins
$ kubectl config current-context 
my-jenkins
$

以上

kubbectl cluster-info dumpのエラー

kubectl cluster-info dumpしたらエラーになりました。

$ kubectl cluster-info dump
error: missing apiVersion or kind and cannot assign it; no kind is registered for the type core.NodeList

バージョンは以下の通り

$ kubectl version --short
Client Version: v1.11.1
Server Version: v1.11.1
$

バージョンアップしたらエラーはなくなりました。

$ kubectl version --short
Client Version: v1.11.3
Server Version: v1.11.1
$ kubectl cluster-info dump | head -3
{
    "kind": "NodeList",
    "apiVersion": "v1",
$