Kubernetesで気になってるGitHub Issue・PR集

Kubernetesの開発はGitHub Issuesでかなりオープンに行われている認識です。Issueを見ておけば、利用者や開発者が何を課題に感じていて、今後Kubernetesがそれにどう対応していくのか動向がわかります。

しかし、k8sはIssueとPRが多い[^1]ので、全部はとても見られません。ので、個人的に気になるものを見つけたら、それを継続的にウォッチしながら、リンク先等から芋づる式的に新しいIssueを探す、という方法で追ってます。
[^1]: 2016/05/02時点でIssueが3089個、PRが452個もある。
![image](https://qiita-image-store.s3.amazonaws.com/0/5912/cfe6df11-a1bf-531f-dcfa-b590a46f2ee5.png)

## 想定読者

* k8sをウォッチしたい
* k8sを本気で本番投入したい
    * WebアプリでSwarm投入とか運用やばいですよね?
        * Swarmは個人的にはbuilding blockだけど、k8sはトータルソリューション。運用もかなり助けてくれる印象
    * やばくないよ、って情報があったら教えて下さい
* Issue・PRの動向を知りたい
* でもとても全部見られない
* 筆者と好みが似ている人

## Kubernetes + ELB連携の強化

2016/04/29 [AWS: Proposed set of annotations for ELB "advanced features" · Issue #24978 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/24978)

KubernetesでType=LoadBalancerなServiceをつくると、ELBのロードバランサを作ってくれる機能がありますが、あれにELBのProxyProtocol対応、SSL証明書組み込み、Route53のレコード作成などのオプション機能を追加する提案。これが実現したら、例えば社内用のKubernetesクラスタとRoute 53のHosted Zone、ワイルドカード証明書さえ用意しておけば、k8s利用するだけで開発者が本番環境と近いテスト環境でさくさくと開発・テストを進められる、という状態に近づけそう（k8sは利用できなきゃいけないので、その分の学習コストはかかっちゃうけど）

## Distributed CRON→v1.3?→v1.4

例えばMesosのChronosに相当するようなものを追加してほしい、というIssue。

2014/11/05 [Distributed CRON jobs in k8s · Issue #2156 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/2156)
一番最初のIssue。

2015/07/29 [ScheduledJob controller proposal by soltysh · Pull Request #11980 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/11980)
上記の仕様提案。

2016/06末リリース予定のk8s v1.3に入る予定らしい。

2016/04/29 [Scheduledjob api by soltysh · Pull Request #24970 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/24970)
関連APIの仕様(Swagger Spec)など。実装は含まれてない。

2016/07/04追記: 1.3に間に合わなかったので、1.4で入る予定になった
https://github.com/kubernetes/kubernetes/issues/2156#issuecomment-223385808

2016/10/12追記: 1.4で導入されました

## ローカルk8sをもっと気軽に立ち上げられる公式minikube

2016/04/12 [Proposal for improving local cluster experience. by vishh · Pull Request #24106 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/24106)
[redspread/localkube](https://github.com/redspread/localkube)ベースで、Docker Machineのようにワンコマンドでもっと気軽にk8sをローカル環境に立ち上げられる用にしよう、という提案。Vagrant上にワンコマンドで立ち上げられる、みたいなUXだとやっぱり難しいので、ワンコマンドにすることに価値があるらしい。実際、巷に溢れている「k8sをDockerやVagrantでサクッと立ち上げられるよ」と謳ったツールを色々試して、今のところlocalkubeが一番よくできてると思ったので、良い方向性だと思う。

GitHubレポジトリもあった。
https://github.com/kubernetes/minikube

2016/10/12追記: ローカルk8sの定番になっています。その他面白いところでは、rkt対応あり。CoreOS化もIssue化されていました。

## 自動再スケジューリング（Controlled Rescheduling)

うまい訳が思いつかないけど、ニュアンスとしては自動再スケジューリング。

2016/03/01 [[WIP/RFC] Rescheduling in Kubernetes design proposal by davidopp · Pull Request #22217 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/22217)
k8s 1.2の時点では、Podが再スケジューリングされるのは、ユーザが明示的にPodを削除したり、意図せず（エラー等で）Podが落ちたとき。現状でも、k8sはspecと現在のクラスタの状態に基づいて、Podを最適な配置になるようにスケジューリングする。しかし、状況は移り変わるので、最初のスケジューリングがどれだけ正しくても、しばらく時間が立つと最適じゃない配置になってしまっていることがある。そこで、その時々の状況に応じて、Podを再配置しよう、という提案。これが実現したら、リソースの状況に応じてユーザが`kubectl drain`を実行・・・みたいなことをしなくても、リソースを最適に使えるようになる?

## ノードメンテナンス

Kubernetesを導入したあと、バージョンアップのたびにあたふたしたくないですよね！
サービス無停止でクラスタのアップグレード含めたメンテナンスを行いたいところ。
1.2で登場した`kubectl drain`のきっかけにもなっています。

2015/11/18 [Add proposal for node maintenance. by mml · Pull Request #17393 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/17393)

## PetSet(Nominal Service)

etcdやCassandraやAkka Cluster製アプリのように、一般的なステートレスなk8sサービスがそうであるようにロードバランサは必ずしも必要ないけど、peer同士を発見してクラスタを組むことで機能するサービスをk8sで運用しやすくするために、新しいServiceを追加しよう、という話です。

[PetSet (was nominal services) · Issue #260 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/260)

2016/05/09時点では、まだ提案のみですが、6月リリース予定の1.3に含まれる見込みのようです。

[Support Kafka in PetSet · Issue #23794 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/23794)

## Kubernetes 1.3で採用するDockerのバージョン

今のところ、1.10か1.11らしい。

[Determine docker version(s) for Kubernetes 1.3 release · Issue #25893 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/25893)

Dockerは後方互換性保ってるし、大丈夫でしょ？と思ったら、Docker 1.11ではcAdvisorのAPIがDockerコンテナのラベルを返さなくなってしまう、みたいな既知の問題がいくつかあるみたい。

[[docker v1.11.0-rc2] container info missing metadata · Issue #1185 · google/cadvisor](https://github.com/google/cadvisor/issues/1185)

Kubernetes v1.2はDocker 1.9.1が推奨だけど、それでも[CHANGELOGには色々と注意事項が書かれていた…](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md#action-required-4)。

[Validate Docker 1.10 · Issue #19720 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/19720#issuecomment-215292092)

なお、自分にとってはこの「cAdvisorのAPIがDockerコンテナのラベルを返さない」問題は、DatadogでKubernetes podのメトリクスにポッド名のラベルが付かない結果になってしまうので、結構困る。

## Config MapをローリングアップデートでPodに反映する

[Facilitate ConfigMap rollouts / management · Issue #22368 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/22368)
いまはボリュームマウント以外の方法でPod等から読まれているConfigMapを変更すると、その値をPodに反映するためには以下の手順を踏む必要がある。

1. 新しいConfigMapを作成する
2. Deploymentを作成しなおし
3. ローリングアップデート完了を待つ
4. 古いConfigMapを削除する

これをワンコマンドで行えるようにしよう、というIssue。
1.3目標だったけど、着手している人がおらず延期された模様。

ボリュームマウントで利用する場合は、kubeletのsync loopでそのうち反映されるらしい
http://qiita.com/tkusumi/items/8e31fddda77f93ccfdd8#pod%E3%81%8B%E3%82%89configmap%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%BF%E3%81%86

## Kubeletの設定を実行時に行えるようにする

クラスタ起動時には最低限の設定でkubeletを起動して、その後はConfigMapを使って動的に設定を変更できるようにする、という内容のようです。

[Dynamic Kubelet Settings · Issue #27980 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/27980)

## kubeletのTLS証明書等を自動生成

kubeletやapiserverの通信経路を暗号化するためにTLSが使われてますが、そのための証明書は現在事前につくって、kubelet等を起動するホストにデプロイしておく必要があります。この手順が面倒だったり、そのために[kube-aws](https://github.com/coreos/coreos-kubernetes/tree/master/multi-node/aws)のようなデプロイ自動化側にしわ寄せがいってしまっているので、Kubernetes側で対応しよう、というIssueです。

対応予定: v1.4

[Kubelet TLS Bootstrap · Issue #43 · kubernetes/features](https://github.com/kubernetes/features/issues/43)

## Idling/Unidling

アクセスが来るまでPodのレプリカ数を0にしておき(Idling)、アクセスが来たら1以上にする(Unidling)ことで、利用頻度に偏りがある・またはめったに利用されないサービスのPodに使うリソースを減らせるようにしよう、という提案。

[Unidling proposal by pmorie · Pull Request #3247 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/3247)
[Proposal: Introduce Idling and Unidling by DirectXMan12 · Pull Request #29471 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/29471)

## Templates

Kubernetesオブジェクトをテンプレートをつかって記述できるようにすることで、PetSetのように似たようなPodを特定のパターンにしたがって複数生成する・・・というようなことを完結にかけるようにしよう、という話。

提案: [Proposal](https://github.com/kubernetes/kubernetes/blob/master/docs/proposals/templates.md)
実装: [Implement templates · Issue #23896 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/23896)

基本的にはhelmでいいような気もするですけど、何が違うんだろう・・・。

## Podにシグナルを送る

厳密には、「Podのいずれか、またはすべてのコンテナ」に任意のシグナルを送れるようにしたい、という話。

[Feature request: A way to signal pods · Issue #24957 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/24957)

## kube-dnsのパフォーマンス改善

GCEのDNSサーバに直接問い合わせした場合と、kube-dnsを通して問い合わせした場合とを比べると、後者が5倍から10倍スループットが低い・・という件。

[Improve kubedns QPS to be closer to GCE DNS server performance · Issue #28366 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/28366)

## kubectl cp/kubectl rsyncでファイルをpodへコピーする、またはローカルボリュームをマウント

[Add a kubectl cp ... command · Issue #13776 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/13776)
[Idea: kubectl export-local-volume · Issue #18007 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/18007)
[rsync files to a kubernetes pod - Server Fault](http://serverfault.com/questions/741670/rsync-files-to-a-kubernetes-pod)

OpenShiftに同様なコマンドがあるようですが、それをk8sにも導入してはどうか、というIssue。
いまもrsyncがローカルとpodにそれぞれ存在すれば、hackyなコマンドで実現できますが、もっと気軽に利用できるところがポイント？