kubernetes
Z LabDay 24

Kubernetes 1.13: 既知の問題 (Known Issues) と 廃止予定の機能 (Deprecations)


はじめに

このエントリは、Kubernetes 1.13 の CHANGELOG から 既知の問題 (Known Issues) と 廃止予定の機能 (Deprecations) についてまとめています。翻訳に合わせて補足を追記しています。その他の内容は次のリンク先を参照してください。


既知の問題 (Know Issues)



  • kubelet はドライバの失敗によりプラグインの登録が失敗したとしても、登録を再試行しません。ドライバは kubelet がドライバの登録を再度試みるように、ドライバ登録用のソケットを削除し、再作成する必要があります。単にドライバのコンテナの再起動を行うだけではソケットの再作成のための十分なトリガーにならない可能性があるため、Pod の再起動が必要かもしれません。(#71487)




    :pencil: Note
    現状、kubelet のプラグインは 監視下のディレクトリにおける inotify events をトリガーにして登録が行われているのですが、プラグインの登録に失敗した際に、リトライを試みるトリガーが必要なため、ソケットファイルの再作成が必要なようです。参照先の issue では、他の Kubernetes のコンポーネントと同じようにバックオフを伴ったリトライを行うべきであるとしています。



  • いくつかのケースにおいて、Flex volume のリサイズは、(もしそのリサイズが成功したとしても) 不正確な ”Resizing Condition” の情報を持った PVC を残してしまいます。ユーザは、もしその情報が必要でなかった場合、削除しても構いません。(#71470)




    :pencil: Note
    おそらく、PVC 中に .status.conditionsResizing / FileSystemResizePending が残ったままの状態になっていることがある、ということだと思われます。リサイズが終わったあとでこの情報が残ったままであった場合は、kubectl edit などで安全に取り除けるようです。


  • CSI driver-registrar サイドカーコンテナの v1.0.0-rc2 はいくつかの場合に置いて起動に1分以上かかることが知られています。この問題は将来のサイドカーコンテナのリリースで解決されると考えています。解決されたかどうかは、このサイドカーコンテナの将来のリリースノートをご確認ください。(#76)


  • IPV6-only を使っている場合は、kube-proxy の proxy-mode=iptables を使ってください。proxy-mode=ipvs は動作しないことが知られています。(#68437)



廃止予定の機能 (Deprecations)



  • kube-apiserver



    • --service-account-api-audiences は非推奨です。代わりに --api-audiences フラグを利用してください。このフラグはまだ警告とともに利用可能ですが、将来のリリースで削除されます。(#70105, @mikedanese)


    • --experimental-encryption-provider-config は非推奨です。代わりに --encryption-provider-config フラグを利用してください。このフラグはまだ警告とともに利用可能ですが、1.14 で削除されます。(#71206, @stlaz)

    • etcd 暗号化機能のベータ移行の一環として、設定ファイルは --encryption-provider-config によって参照されるようになり、 kind: EncryptionConfigurationapiVersion: apiserver.config.k8s.io/v1 を利用することになります。kind: EncryptionConfigapiVersion: v1 のサポートは非推奨となり、将来のリリースで削除されます。 (#67383, @stlaz)


    • --deserialization-cache-size フラグは非推奨です、将来のリリースで削除されます。etcd2 のストレージバックエンドが削除されたため、このフラグは何もしません。(#69842, @liggitt)


    • Node authorization モードは kubelet が自身の Node API オブジェクトを削除することを許可しなくなりました。(1.11以前は、Cloud Provider の node ID 変更に関連した特殊な状況下で、kubelet が自身の Node オブジェクトを起動時に、削除および再作成を試みていました。) (#71021, @liggitt)

    • ビルトインの system:csi-external-provisionersystem:csi-external-attacher ClusterRole は非推奨となり、将来のリリースでは自動で作成されなくなります。CSI の各ドライバは自身で必要な権限を持った RBAC リソースを作成するようにしてください。(#69868, @pohly)

    • ビルトインの system:aws-cloud-providerClusterRole は非推奨となり、将来のリリースでは自動で作成されなくなります。AWSクラウドプロバイダを利用しているシステムは、kube-system ネームスペースのaws-cloud-provider サービスアカウントに対して必要な権限を与えてください。 (#66635, @wgliang)




  • kubelet


    • kubelet plugin の登録時に使われているベータの plugin registration ディレクトリである{kubelet_root_dir}/plugins/ディレクトリの利用は非推奨になりました、{kubelet_root_dir}/plugins_registry/を利用してください。古いディレクトリのサポートは v1.15 で削除が予定されています。デバイスプラグインおよび CSI ストレージドライバは v1.15 の前に新しいディレクトリに移行してください。CSI ストレージドライバの 0.x バージョンのみがこの古いディレクトリを利用することが許可されています。(#70494 by @RenaudWasTaken and #71314 by @saad-ali)

    • CSI 1.0 API のリリースとともに、0.3 を使っている CSI ドライバーと古い CSI APIリリースのサポートを非推奨とします。これらは Kubernetes v1.15 で削除が予定されています。CSI ドライバはCSI 1.0 APIを利用するようアップデートし、クラスタ内の全てのノードが 1.13 以上になり次第、新しい kubelet plugin の登録ディレクトリ ({kubelet_root_dir}/plugins_registry/) に配備してください。


    • kubernetes.io/ と k8s.io/プレフィックスのついたラベルを --node-labels を利用して設定した場合、将来のリリースで NodeRestriction admission プラグインの制限の対象となります。許可されるラベルについては admission plugin のドキュメントをご覧ください。(#68267, @liggitt)


      :pencil: Note
      NodeRestriction addmission プラグイン は kubelet に対して Node や Pod リソースに対する権限を制限するプラグインです。kubelet 起動時に --node-labels をつけることでノードにラベルをつけることができるのですが、kubernetes.io/ と k8s.io/プレフィックスのついたラベルに関しては自由につけることができず、これから許可されたり制限されたりするとのことです。(例えば k8s.io/hoge は ok だけど k8s.io/fuga は無理など。) その制限内容はまだ決まっていないようなので、適当にラベルをつける場合はこのようなプレフィックスを避けるのが無難でしょう。





  • kube-scheduler


    • アルファの critical pod annotation (scheduler.alpha.kubernetes.io/critical-pod) は非推奨になりました。Pod に "critical" と印をつけるのではなく、Pod priorityを使うべきです。(#70298, @bsalamat)




  • 以下の機能が GA となりました。それに伴い、関連した Feature gates が非推奨となり将来のリリースで削除されます。




  • kubeadm


    • DynamicKubeletConfig feature gate が非推奨になりました。機能は kubeadm alpha kubelet enable-dynamic コマンドでまだ利用することができます。


    • kubeadm config print-defaults は非推奨になりました。代わりに kubeadm config print init-defaultskubeadm config print join-defaults を利用してください。(#69617, @rosti)


    • v1alpha3 の設定ファイルフォーマットのサポートは非推奨となり、1.14 で削除されます。kubeadm config migrate を利用して v1alpha3 の設定ファイルを v1beta1 に移行してください。v1beta1 にはイメージレポジトリの管理やアドオンの設定などの改善が含まれています。詳しくはv1beta1ドキュメントを参照 してください。



  • CSI volumes の node.status.volumes.attached.devicePath フィールドは非推奨です、将来のリリースでは設定されなくなります。(#71095, @msau42)



  • kubectl



    • kubectl convert コマンドは非推奨になりました、将来のリリースで削除されます。(#70820, @seans3)




  • e2e テスト実行時の未定義なプロバイダ名の指定のサポートは非推奨となりました、将来のリリースで削除されます。代わりに SSH アクセスをしない場合は --provider=skeleton を、ローカルクラスターに対して SSH アクセスを行う場合は --provider=local を指定してください。(#70141, @pohly)




    :pencil: Note
    リリースノートにはこう書いてあるものの、 localskelton の差が謎。定義SSH 関連の実装 は以下のようになっているようだが…。


RegisterProvider("local", func() (ProviderInterface, error) {

return NullProvider{}, nil
})
RegisterProvider("skeleton", func() (ProviderInterface, error) {
return NullProvider{}, nil
})

switch provider {

case "gce", "gke", "kubemark":
keyfile = "google_compute_engine"
case "aws":
// If there is an env. variable override, use that.
aws_keyfile := os.Getenv("AWS_SSH_KEY")
if len(aws_keyfile) != 0 {
return sshutil.MakePrivateKeySignerFromFile(aws_keyfile)
}
// Otherwise revert to home dir
keyfile = "kube_aws_rsa"
case "local", "vsphere":
keyfile = os.Getenv("LOCAL_SSH_KEY") // maybe?
if len(keyfile) == 0 {
keyfile = "id_rsa"
}
case "skeleton":
keyfile = os.Getenv("KUBE_SSH_KEY")
if len(keyfile) == 0 {
keyfile = "id_rsa"
}
default:
return nil, fmt.Errorf("GetSigner(...) not implemented for %s", provider)
}