Slide 1

Slide 1 text

Rancher APIを使う時に 注意したこと Rancher Meetup #03 in Kyoto 2019.09.20

Slide 2

Slide 2 text

Shogo Seki カゴヤ・ジャパン株式会社 Rancher, Laravel, Vue.js, Docker Monitoring, CI/CD, GitOps

Slide 3

Slide 3 text

籠屋 京子 (Kagoya Kyoko) 広報部@カゴヤ・ジャパン株式会社 @kagoya_kyoko

Slide 4

Slide 4 text

少し宣伝させてください

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

KAGOYA CLOUD コンテナサービス をリリースしました〜

Slide 8

Slide 8 text

以上

Slide 9

Slide 9 text

Rancher APIを使う時に 注意したこと Rancher Meetup #03 in Kyoto 2019.09.20

Slide 10

Slide 10 text

Case1: Create Cluster API

Slide 11

Slide 11 text

〜ある日〜 A「クラスター名のバリデーション追加しておいて!」 S「わかりました」 S「(クラスター名はRancherの画面からも設定できるし、そこで入力チェックしちゃえ!)」 入力フォームさん「 」 S「(なるほど、なるほど)」

Slide 12

Slide 12 text

Send curl -X POST ¥ https://localhost/v3/cluster ¥ -H 'Content-Type: application/json' ¥ -H 'Authorization: Bearer token-XXXXX:XXXXXXXXXX' ¥ -d '{ "type": "cluster", ... "name": "ABCDEFG" }'

Slide 13

Slide 13 text

Response { "baseType": "error", "code": "InvalidFormat", "fieldName": "name", "message": "InvalidFormat 422: invalid value ABCDEFG: a DNS-1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')", "status": 422, "type": "error" } error!?

Slide 14

Slide 14 text

Response { "baseType": "error", "code": "InvalidFormat", "fieldName": "name", "message": "InvalidFormat 422: invalid value ABCDEFG: a DNS-1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')", "status": 422, "type": "error" } めっちゃ親切やん///

Slide 15

Slide 15 text

Case1: まとめ ● API使うならちゃんとAPIでテストしてからコード化しよう ● エラーメッセージが親切なのでエラー出してみよう

Slide 16

Slide 16 text

Case2: Get CAcert API

Slide 17

Slide 17 text

sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:latest --server https://localhost --token thmmxq9tjlkjsdfkwmbtsa4bnf2p2lv1l72fazfnt4sdf94ln8fctgg --ca-checksum 29a149e0319ddcc7f8c679d08de07471208bc54186a9e5749bd840befcf742ac --worker

Slide 18

Slide 18 text

Send curl -X GET ¥ https://localhost/v3/settings/cacerts ¥ -H 'Authorization: Bearer token-XXXXX:XXXXXXXXXX'

Slide 19

Slide 19 text

Response { "baseType": "setting", ... "id": "cacerts", ... "value": "-----BEGIN CERTIFICATE-----¥n XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX¥n -----END CERTIFICATE-----" }

Slide 20

Slide 20 text

checksumの求め方(公式より) checksumはvalueに対してsha256で求めればええんやな! https://rancher.com/adding-custom-nodes-kubernetes-cluster-rancher-2-0-tech-preview-2/ curl -s -H "Authorization: Bearer $APITOKEN" https://127.0.0.1/v3/settings/cacerts --insecure | jq -r .value | sha256sum | awk '{ print $1 }'

Slide 21

Slide 21 text

やってみる(失敗) $response = $client->request(...); $responseBody = $response->getBody(); hash('sha256', $responseBody['value']); これだとノード追加コマンドのca-checksum値と一致しない・・・

Slide 22

Slide 22 text

checksumの求め方(公式より) curl -s -H "Authorization: Bearer $APITOKEN" https://127.0.0.1/v3/settings/cacerts --insecure | jq -r .value | sha256sum | awk '{ print $1 }' これ怪しい

Slide 23

Slide 23 text

jq Manual ● --raw-output / -r: With this option, if the filter’s result is a string then it will be written directly to standard output rather than being formatted as a JSON string with quotes. This can be useful for making jq filters talk to non-JSON-based systems. ● --join-output / -j: Like -r but jq won’t print a newline after each output. https://stedolan.github.io/jq/manual/

Slide 24

Slide 24 text

jq Manual ● --raw-output/ -r: このオプションを使用すると、フィルターの結果が文字列の場合、引用符付きのJSON文 字列としてフォーマットされるのではなく、標準出力に直接書き込まれます。これは、 jqフィルターが非JSONベースのシステムと通信するのに役立ちます。 ● --join-output/ -j: -rに似ていますが、jqは各出力の後に改行を出力しません。 https://stedolan.github.io/jq/manual/ 書いてることは怪しいが・・・ -r : 改行コードあり -j : 改行コードなし

Slide 25

Slide 25 text

やってみる(成功) $response = $client->request(...); $responseBody = $response->getBody(); hash('sha256', $response['value']."¥n"); 間違ってるようにも見えるけど、これが正解 ちなみにissueもあったが、closeされているため、仕様っぽい https://github.com/rancher/rancher/issues/13308

Slide 26

Slide 26 text

Case2: まとめ ● 使われているコマンドを調べて見よう ● ドキュメントを読もう ● ついでに探せたらissueも読もう ● ソースコードも読むと更に良い ○ https://github.com/rancher/rancher/blob/master/pkg/systemtemplate/import.go#L52

Slide 27

Slide 27 text

ご清聴ありがとうございました