Kubernetes v1.8: 既知の問題 (Known Issues)

このエントリは、[Kubernetes v1.8 CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#v180) から既知の問題 (Known Issues) をまとめています。その他の項目は下記リンク先を参照してください。

- [Kubernetes v1.8: 主な変更点 (Major Themes)](https://qiita.com/superbrothers/items/5a6a34c5eb919ce872aa)
- [Kubernetes v1.8: Before Upgrading](https://qiita.com/tkusumi/items/0962220a0700cb1f6eb3)
- Kubernetes v1.8: 既知の問題 (Known Issues)
- [Kubernetes v1.8: Deprecations](https://qiita.com/tkusumi/items/43fd62c1da931443943a)

---

v1.8.0 リリース時点での既知の問題です。ほとんどは既に v1.8.1 で修正されているため、そちらの CHANGELOG も合わせて参照してください。

- https://github.com/kubernetes/kubernetes/releases/tag/v1.8.1

## kubelet TLS ブートストラップや証明書ローテーションで取得したクライアント証明書がマシンの再起動後に失われる

kubelet の TLS ブートストラップ (`--bootstrap-kubeconfig`) や証明書のローテーション (`--rotate-certificates`)で取得したクライアント証明書がマシンの再起動後に失われる問題がある。これは証明書をストアするパスを指定する `--cert-dir` がデフォルト `/var/run/kubernetes` となっており、いくつかのプラットフォームでは `/var/run` 配下は一時的なディレクトリとして再起動で自動的にクリーンアップが実行されるためである。クライアント証明書が失われるため、再起動後に API サーバへの接続に失敗する。

この問題は、`--cert-dir` を明示的にそのような扱いのないパスに変更することで対応できる。v1.8.1 で修正されておりデフォルト値は `/var/lib/kubelet/pki` となっている。

- [TLS\-bootstrapped kubelet loses client certs after reboot, node stays on NotReady status · Issue \#53288 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/53288)
- [Change default \-\-cert\-dir for kubelet to a non\-transient location by liggitt · Pull Request \#53317 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/53317)

## `kubeadm init` と `kubeadm join` で `/var/lib/kubelet is not empty` というメッセージで pre-flight チェックに失敗する

kubelet のクライアント証明書の問題で kubelet の証明書のストア先を `/var/lib/kubelet/pki` に設定した場合、1.8.0 時点での `kubeadm init` と `kubeadm join` の pre-flight チェックでは `/var/lib/kubelet` が空であることを期待して `/var/lib/kubelet is not empty` というメッセージとともに失敗してしまう。

ワークアラウンドとして下記の対応でこの問題を回避できる。

- pre-flight チェックでの失敗がこのエラーのみであれば、`--skip-preflight-checks=true` を指定すること pre-flight チェックを無効化できる
- init または join コマンドを実行する前に kubelet サービスを停止し、`/var/lib/kubelet/pki` を削除する
- init または join コマンドを実行する前に `kubeadm reset` を実行する

この問題は v1.8.1 で修正されている。

- [kubeadm 1\.8\.0 init fails with "/var/lib/kubelet is not empty" · Issue \#53356 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/53356#issuecomment-333748618)

## 数百のノードから構成される大きなクラスタで数千の Pods の削除が一斉実行されると `delete pod` API コールのレイテンシが一時的に増大する

数百のノードから構成される大きなクラスタで数千の Pods の削除が同時に実行されると `delete pod` API コールのサービスレベル目標 (SLO) は1秒に設定されているがそれを超えるレイテンシに増大する。

背景として、Pod の削除はコンテナの停止、ボリュームの削除、cgroups の削除を待って実行されていたが、コンテナの削除を待っていなかったため、以下の条件のどちらかを満たしたときに Pod が削除されるように修正された。

1. Pod `.metadata.deletionTimestamp` が設定されており、コンテナが実行されていない
1. Pod が Eviction された (Phase が Failed であるかつ Reason が Evicted である)
    - https://github.com/kubernetes/kubernetes/blob/v1.8.0/pkg/kubelet/eviction/helpers.go#L1088-L1091

しかし、コンテナの削除は30秒間隔の定期的なガベージコレクションとして実行されていたため、コンテナの削除を待って Pod の削除を行う上記の変更により、Pod の削除が同時に実行されることとなり、大量の Pod の一斉の削除は API サーバの負荷が一時的に増大することとなった。

この問題は v1.8.1 でコンテナの削除を定期的なガベージコレクションではなく、Pod のステータスによって動的に削除を行うように変更することによって修正されている。

- [\`delete pods\` API call latencies shot up on large cluster tests · Issue \#51899 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/51899)
- [Wait for container cleanup before deletion by dashpole · Pull Request \#50350 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/50350)
- [Remove containers from deleted pods once containers have exited by dashpole · Pull Request \#53233 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/53233)

## Advanced Audit は、API サーバのパフォーマンスと大きなリクエストレスポンスのレイテンシに影響を与える可能性がある

Advanced Audit は、下記の条件を満たすと API サーバのパフォーマンスと大きなリクエストレスポンスのレイテンシに影響を与える可能性がある。

- JSON フォーマットのログバックエンドを使っている
    - JSON の marshal / unmarshal のパフォーマンスの問題だったため、json-iterator ライブラリを利用するように修正された
    - [Use json\-iterator instead of ugorji for JSON\. by thockin · Pull Request \#48287 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/48287)
- AuditPolicy でリクエストまたはレスポンスで大規模な API コールを記録している

Advanced Audit は設定を誤るととてつもない量のログを出力、送信してしまうため、慎重に設定する必要がある。

- [\`delete pods\` API call latencies shot up on large cluster tests · Issue \#51899 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/51899)

## minikube v0.22.2 またはそれ以下のバージョンで kubectl v1.8 かそれ以上からの操作で正しく動作しない

minikube の API サーバで登録されていない型が存在するために発生する。新しいバージョンの kubectl では OpenAPI スキーマで強制的にオブジェクトの検証を行うが、minikube の API サーバから配信されている OpenAPI スキーマに必要な全ての型が含まれていなかった。

これは minikube (localkube) のように `k8s.io/kubernetes` を vendoring している場合とそうでないときでパスが異なるために発生するようだ。この問題は minikube v0.22.3 で修正されている。

- [Kubectl 1\.8 broken for minikube \- OpenAPI swagger file doesn't include \`x\-kubernetes\-group\-version\-kind\` · Issue \#1996 · kubernetes/minikube](https://github.com/kubernetes/minikube/issues/1996)
- [Add patch for openapi by r2d4 · Pull Request \#2031 · kubernetes/minikube](https://github.com/kubernetes/minikube/pull/2031)
- [Release v0\.22\.3 · kubernetes/minikube](https://github.com/kubernetes/minikube/releases/tag/v0.22.3)

## GCE デプロイスクリプトでの `ENABLE_APISERVER_BASIC_AUDIT` パラメータが壊れている

`ENABLE_APISERVER_BASIC_AUDIT` パラメータは API サーバで旧来の Legacy Audit を有効にするものだったが、1.8 でそもそも Advanced Audit がデフォルトで有効になっているのでこのパラメータは機能しなくなっている。Legacy Audit は廃止されて今後削除予定のため、代わりに Advanced Audit を使いましょう。

- [ENABLE\_APISERVER\_BASIC\_AUDIT configuration out of date · Issue \#53154 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/53154)
- [Fix basic audit in GCE deploy scripts by crassirostris · Pull Request \#53225 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/53225)

## `kubectl set` コマンドが ReplicaSet と DaemonSet で時々バージョンエラーを返す

ReplicaSet と DaemonSet に対する全ての set コマンド（`set image` を含む `set env`, `set resources`, `set serviceaccounts`）に影響がある。これはパッチを送る際にバージョンを特定するだけの情報を持たない場合に時々エンコーダがバージョンエラーを返していたようだ。

この問題は v1.8.1 で読み込まれたオブジェクトと同じバージョンに最初にエンコードするように修正されている。

- [\`kubectl set\` commands on ReplicaSet and DaemonSet occasionally return version registration errors · Issue \#53040 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/53040)
- [Calculate patches for commands using input version by liggitt · Pull Request \#53158 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/53158/files)

## Object Count Quotas が他の Quotas と一貫性を持つ請求、更新を行わない

Object Count Quota はオブジェクトが初期化されているかされていないかに関わらず作成された段階で請求される。これは大量の初期化されていないオブジェクトからシステムを守るためにそうなっているが、他の Quotas はオブジェクトが初期化された際に請求されるようになっていおり、一貫性がない。

この問題は今後修正される予定になっている。

- [Known object count quota problems with uninitialized objects · Issue \#53109 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/53109)
- [Resource Quotas \- Kubernetes](https://kubernetes.io/docs/concepts/policy/resource-quotas/)