このエントリは、Kubernetes v1.8 CHANGELOG から既知の問題 (Known Issues) をまとめています。その他の項目は下記リンク先を参照してください。
- Kubernetes v1.8: 主な変更点 (Major Themes)
- Kubernetes v1.8: Before Upgrading
- Kubernetes v1.8: 既知の問題 (Known Issues)
- Kubernetes v1.8: Deprecations
v1.8.0 リリース時点での既知の問題です。ほとんどは既に v1.8.1 で修正されているため、そちらの CHANGELOG も合わせて参照してください。
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
- Change default --cert-dir for kubelet to a non-transient location by liggitt · Pull Request #53317 · kubernetes/kubernetes
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
数百のノードから構成される大きなクラスタで数千の Pods の削除が一斉実行されると delete pod
API コールのレイテンシが一時的に増大する
数百のノードから構成される大きなクラスタで数千の Pods の削除が同時に実行されると delete pod
API コールのサービスレベル目標 (SLO) は1秒に設定されているがそれを超えるレイテンシに増大する。
背景として、Pod の削除はコンテナの停止、ボリュームの削除、cgroups の削除を待って実行されていたが、コンテナの削除を待っていなかったため、以下の条件のどちらかを満たしたときに Pod が削除されるように修正された。
- Pod
.metadata.deletionTimestamp
が設定されており、コンテナが実行されていない - Pod が Eviction された (Phase が Failed であるかつ Reason が Evicted である)
しかし、コンテナの削除は30秒間隔の定期的なガベージコレクションとして実行されていたため、コンテナの削除を待って Pod の削除を行う上記の変更により、Pod の削除が同時に実行されることとなり、大量の Pod の一斉の削除は API サーバの負荷が一時的に増大することとなった。
この問題は v1.8.1 でコンテナの削除を定期的なガベージコレクションではなく、Pod のステータスによって動的に削除を行うように変更することによって修正されている。
- `delete pods` API call latencies shot up on large cluster tests · Issue #51899 · kubernetes/kubernetes
- Wait for container cleanup before deletion by dashpole · Pull Request #50350 · kubernetes/kubernetes
- Remove containers from deleted pods once containers have exited by dashpole · Pull Request #53233 · kubernetes/kubernetes
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
- AuditPolicy でリクエストまたはレスポンスで大規模な API コールを記録している
Advanced Audit は設定を誤るととてつもない量のログを出力、送信してしまうため、慎重に設定する必要がある。
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
- Add patch for openapi by r2d4 · Pull Request #2031 · kubernetes/minikube
- Release v0.22.3 · kubernetes/minikube
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
- Fix basic audit in GCE deploy scripts by crassirostris · Pull Request #53225 · kubernetes/kubernetes
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
- Calculate patches for commands using input version by liggitt · Pull Request #53158 · kubernetes/kubernetes
Object Count Quotas が他の Quotas と一貫性を持つ請求、更新を行わない
Object Count Quota はオブジェクトが初期化されているかされていないかに関わらず作成された段階で請求される。これは大量の初期化されていないオブジェクトからシステムを守るためにそうなっているが、他の Quotas はオブジェクトが初期化された際に請求されるようになっていおり、一貫性がない。
この問題は今後修正される予定になっている。