本スライドは「Kubernetes Meetup Tokyo #4」の登壇資料です。
kube-awsの近況
本当にあった怖い(?)話
現象: 本番k8sクラスタでapiserverのaudit loggingを有効化してたらNヶ月後にapiserverのpodがno space left on deviceエラーを延々と履き続けるように
# ls -lah /dev
total 1.9G
...
lrwxrwxrwx. 1 root root 15 Dec 27 06:36 stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Dec 27 06:36 stdin -> /proc/self/fd/0
-rw-------. 1 root root 84M Mar 17 09:28 stdout
lrwxrwxrwx. 1 root root 15 Dec 27 06:36 stdout-2016-12-28T06-08-02.236 -> /proc/self/fd/1
-rw-------. 1 root root 100M Dec 29 02:58 stdout-2016-12-29T02-58-48.742
...
-
/dev/stdout
が84MBの"ファイル"? -
stdout-2016-12-28T06-08-02.236 -> /proc/self/fd/1
?? - apiserverにTwelve factor的にaudit logを標準出力に出すために
--audit-log-file /dev/stdout
を指定してた
kube-aws
kube-aws init
-> kube-aws up
->
TL;DR;
- kube-aws = Kubernetes on AWS
- KubernetesクラスタをAWS上に構築するCLIツール(CloudFormation利用)
- Kubernetes Meetup #3から3ヶ月でv0.9.3→v0.9.6.rc.2へ
- さらに本番環境で使いやすくなりました
v0.9.4
- Bypass 16KB userdata limit
- Easier to configure, easier to version-control, more tightly integrated node pools
- Flexible and customizable network topology
- Add DOCKER_OPTS environment variable to limit docker log files
- kube2iam support
v0.9.5
- Managed HA etcd cluster
- Auth token file support
- AWS China region support
- Bring your own docker images
v0.9.6 (WIP)
- K8s 1.6
- Etcd3
- Manual/Automated Backup & Restore for Etcd3
- Kubelet TLS bootstrapping
- Rescheduler support
- Support for multiple k8s API endpoints
- Reusing existing ELBs and SGs for controller nodes
とてもLTで紹介しきれないので
ハイライトだけ
Kubernetes Incubatorに採択
- 旧: https://github.com/coreos/kube-aws
- 新: https://github.com/kubernetes-incubator/kube-aws
- このまま順調にいけばkubernetesのトップレベルプロジェクトに?
- でも、SponsorのTim Hockinさんからは暗に「kopsと被ってんだよ!」と言われている気がする
- 心の声: kopsが守備範囲広げす(ry
続・AWS限界突破
- UserData
- OS起動後にEC2インスタンスを色々設定変更するのに使う
- kube-awsデフォルト+ユーザが自由に変更可
- kube-awsのカスタマイズ性の要
- kube-awsデフォルトだけでUserDataのサイズ上限16KBに近くなってしまった
- ユーザがそれ以上カスタマイズできない
- S3を経由させることにした
- UserDataを2分割: UDをS3からDLするUD
インフラ構成をより柔軟にカスタマイズできるように
- Network Topology
- Private/Public、既存/新規Subnetを自由に組み合わせ
- 例: 特定のPodだけはPrivateネットワーク内で実行して、かつNAT Gateway経由でインターネットへ出て欲しい。そのとき、ソースとなるPublic IPは特定のEIPにしたい
- 本番環境だとよくある構成
おさらい: ノードプール
- 様々なスペックのサーバをいい感じに混在させる機能
- EC2インスタンスタイプ
- EBSボリューム
- タイプ
- サイズ
- IOPS
- など
コマンド体系がシンプルに
- 昔: node-pools/<ノードプール名>/cluster.yaml
- kube-aws node-pools [up|update|destroy] --pool-name <ノードプール名>
- 今: cluster.yaml: worker.nodePools[]というキー追加
- kube-aws [up|update|destroy]
- cluster.yamlに定義したノードプールを勝手にCRUDしてくれる
- kube-aws [up|update|destroy]
- CloudFormation Nested Stacks
- 副産物: 大きなクラスタの構築時間短縮
H/A Etcdクラスタ
- EtcdノードをAutoScaling Group化
- ノードが故障したら、新ノードが引き継ぎ
- Etcdクラスタからは、ノードが一時的に通信不能になっただけのように見える=自動復旧
- 手法: EIP+EBSのペアをプール
- 例: 3ノードEtcdクラスタなら3ペアをプール
- 1ペア=1ノードのIdentityと状態
- ペアさえ残っていれば、EC2インスタンスが故障してもEtcdのデータは消えない
次バージョンv0.9.6予定
- Kubernetes 1.6, Etcd 3
- Etcd自動ディザスタリカバリ
- 全Etcdノードのディスクが同時に壊れても、自動バックアップから自動復旧
- EBSのDurabilityは100%ではない(AFR 0.2%)
- Multiple Kubernetes API Endpoints
- Kubernetes"クラスタ"のBlue-Greenデプロイ
まとめ
- kube-awsがさらに本番環境で使いやすくなりました
自己紹介 & おわり
twitter/github/slack.k8s.io: @mumoshu (むもしゅ)
kube-aws唯一のメンテナ
Fin