kube-awsの近況 / Recent updates to kube-aws Jan-April, 2017 #k8sjp

本スライドは「Kubernetes Meetup Tokyo #4」の登壇資料です。

https://k8sjp.connpass.com/event/53737/

---

# 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` ->

![image](https://qiita-image-store.s3.amazonaws.com/0/5912/4529a853-5396-2537-3b5b-1a5dd46ce1ee.png)

---

# TL;DR;

* kube-aws = **Kube**rnetes 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と被ってんだよ！」と[言われている気がする](https://groups.google.com/forum/#!topic/kubernetes-dev/diN0KIOpLro)
    * 心の声: kopsが守備範囲広げす(ry

---

# 続・AWS限界突破

* UserData
    * OS起動後にEC２インスタンスを色々設定変更するのに使う
    * 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してくれる
- CloudFormation Nested Stacks
    - 副産物: 大きなクラスタの構築時間短縮

---

# H/A Etcdクラスタ

- EtcdノードをAutoScaling Group化
    - ノードが故障したら、新ノードが引き継ぎ
    - Etcdクラスタからは、ノードが一時的に通信不能になっただけのように見える=自動復旧
- 手法: EIP+EBSのペアをプール
    - 例: 3ノードEtcdクラスタなら3ペアをプール
    - １ペア=1ノードのIdentityと状態
    - ペアさえ残っていれば、EC2インスタンスが故障してもEtcdのデータは消えない

---

# 次バージョンv0.9.6予定

- Kubernetes 1.6, Etcd 3
- Etcd自動ディザスタリカバリ
    - 全Etcdノードのディスクが同時に壊れても、自動バックアップから自動復旧
    - EBSのDurabilityは100%ではない([AFR 0.2%](https://forums.aws.amazon.com/thread.jspa?messageID=111950))
- Multiple Kubernetes API Endpoints
    - Kubernetes"クラスタ"のBlue-Greenデプロイ

---

## まとめ

* kube-awsがさらに本番環境で使いやすくなりました

---

# 自己紹介 & おわり

twitter/github/slack.k8s.io: @mumoshu (むもしゅ)
kube-aws唯一のメンテナ

https://github.com/kubernetes-incubator/kube-aws

Fin :bow: :clap: