Oracle Kubernetes Engine ファーストインプレッション
はじめに
Oracle Cloud Infrastructure(OCI)のOracle Kubernetes Engine(OKE)を触ったので、所感含めメモを書いていきます。
OKEのその前に
OCIもAWS/GCP/Azureのように専用のコマンド(oci
)が用意されており、まずはそのセッティングを行う必要があります。
https://docs.cloud.oracle.com/en-us/iaas/Content/API/SDKDocs/cliinstall.htm
ポイントとしてはoci setup config
実行の最後に表示される通り、公開キーをWebコンソールから登録しないといけない点でしょうか。
If you haven't already uploaded your API Signing public key through the console, follow the instructions on the page linked below in the section 'How to upload the public key': https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#How2
AWS/GCP/Azureは使ったことがあるのですが、その時のノリで上記文言を読まずにすすめて「なんか動かない・・・」となりました。ちゃんと表示された英語は読みましょう。
OKEの起動
(OKE自体の起動は他にも記事があるので割愛します)
出来上がったOKEをながめる
KubernetesをKubernetesたらしめるResourceを眺めていきます。
各種Resourceで気になったものは個別にピックアップしていきます。
Namespace
# kubectl get ns NAME STATUS AGE default Active 9d kube-node-lease Active 9d kube-public Active 9d kube-system Active 9d
各Namespaceの役割はKubernetesのドキュメントから引っ張ってきました。
https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/namespaces/
上記ページにはkube-node-lease
の説明はないので、下記からかいつまんで書いています。
https://kubernetes.io/ja/docs/concepts/architecture/nodes/
Namespace名 | 役割 |
---|---|
default | 他にNamespaceを持っていないオブジェクトのためのデフォルトNamespace |
kube-system | Kubernetesシステムによって作成されたオブジェクトのためのNamespace |
kube-public | このNamespaceは自動的に作成され、全てのユーザーから読み取り可能です。(認証されていないユーザーも含みます。)このNamespaceは、リソースをクラスター全体を通じてパブリックに表示・読み取り可能にするため、ほとんどクラスターによって使用される用途で予約されます。 このNamespaceのパブリックな側面は単なる慣例であり、要件ではありません。 |
kube-node-lease | NodeLeaseを有効にしたとき、Leaseオブジェクトを管理するために作成されるNamespace |
kube-node-lease
kube-node-lease
Namespaceですが、こちらはKubernetesのNodeLease
Feature Gate関連のNamespaceです。
https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/0009-node-heartbeat.md
数千台のNodeを使った拡張性のテストをしたとき、各Node(上のKubeletから)のHeatbeatでetcd側の処理限界が発生する問題に対応するためのFeatureになります。
Deployment
# kubectl get deploy -A NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE kube-system coredns 3/3 3 3 9d kube-system kube-dns-autoscaler 1/1 1 1 9d
Deployment名 | 概要 |
---|---|
coredns | KubernetesのCluster内DNSのDeployment |
kube-dns-autoscaler | Cluster内DNSをオートスケールするためのDeployment |
https://kubernetes.io/docs/tasks/administer-cluster/coredns/
https://kubernetes.io/docs/tasks/administer-cluster/dns-horizontal-autoscaling/
こちらも独自のなにかというのはなさそうです。
kube-dns-autoscaler(のConfigMap)
kube-dns-autoscaler
がいるのでConfigMapものぞいてみましょう。
# kubectl get cm kube-dns-autoscaler --namespace=kube-system -o yaml apiVersion: v1 data: linear: "{\n\t\t\t \"nodesPerReplica\": 1,\n\t\t\t \"preventSinglePointFailure\": true\n\t\t\t}" kind: ConfigMap metadata: (metadataは不要なので割愛)
nodesPerReplica
が1に設定されており、かつpreventSinglePointFailure
がtrue
に設定されているので、「各Nodeに1台ずつ起動。かつ最低でも2台はPodが起動」という意味合いになるかと思います。
https://github.com/kubernetes-sigs/cluster-proportional-autoscaler
Service
# kubectl get svc -A NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d kube-system kube-dns ClusterIP 10.96.5.5 <none> 53/UDP,53/TCP,9153/TCP 9d
Service名 | 概要 |
---|---|
kubernetes | API Serverを表すService |
kube-dns | kube-dnsを表すService |
(kubernetes
Service、kubectl delete service --all
でよく誤って消すやつ)
DaemonSet
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE kube-system kube-flannel-ds 3 3 3 3 3 beta.kubernetes.io/arch=amd64 9d kube-system kube-proxy 3 3 3 3 3 beta.kubernetes.io/os=linux 9d kube-system nvidia-gpu-device-plugin 0 0 0 0 0 <none> 9d kube-system nvidia-gpu-device-plugin-1-8 0 0 0 0 0 <none> 9d kube-system proxymux-client 3 3 3 3 3 node.info.ds_proxymux_client=true 9d
DaemonSet名 | 概要 |
---|---|
kube-flannel-ds | オーバーレイネットワークのDaemonSet |
kube-proxy | kube-proxyのDaemonSet |
nvidia-gpu-device-plugin | NVIDIAのGPUを載せたNodeのためのDaemonSet |
nvidia-gpu-device-plugin-1-8 | NVIDIAのGPUを載せたNodeのためのDaemonSet |
proxymux-client | 5/30追記→Oracle Kubernetes Engineのproxymux-clientを眺める - gashirar's blog |
kube-flannel-ds
kube-flannel-ds`がDaemonSetとして展開されており、デフォルトのオーバーレイネットワークはFlannelであることがわかります。
つまり、NetworkPolicy
ResourceによるNamespace間の通信制御などは行えません。
NetworkPolicy
を使いたい人向けに、Calicoのインストール手順が公式から提供されているようです。
https://docs.cloud.oracle.com/en-us/iaas/Content/ContEng/Tasks/contengsettingupcalico.htm
nvidia-gpu-device-plugin(-1-8)
nvidia-gpu-device-plugin
/nvidia-gpu-device-plugin-1-8
は名前の通りDevice Pluginに関わるDaemonSetのようです。
https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/
Kubernetes provides a device plugin framework that you can use to advertise system hardware resources to the Kubelet.
とあるように、NVIDIAのGPUが載っているということをKubeletに伝えるためのものでしょう。
https://github.com/NVIDIA/k8s-device-plugin
とするとOKEではNVIDIAのGPUを積んだNodeを払い出せるのかなと思い調べてみると確かにTeslaを積んだコンピュートリソースは払い出せるようです。
が、Node Pool作成の一覧にはStandard Shapesのみの表示となっていたため、利用するには別の方法をとる必要がありそうです。(少し調べたのですが、方法はわからず。
nvidia-gpu-device-plugin
とnvidia-gpu-device-plugin-1-8
の違いについてはわからずです。公式ドキュメント上で検索してみましたが何もでず。
proxymux-client
5/30追記→Oracle Kubernetes Engineのproxymux-clientを眺める - gashirar's blog
最後にproxymux-client
ですが、これはなにかわかりませんでした。公式ドキュメント上で検索してもでてこず、Googleで検索してもでてこず、Github上で検索しても出てこず。muxは多分「Multiplexser」の略だとは思いますが、Proxyになにかするようなやつなんでしょうか。
多分Oracle Kubernetes Engine独自のものな気はするのでしょうが、調べ方がわるいのか出てこずなのでギブアップです。
Pod
# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-67bb89d7c6-9wqhl 1/1 Running 0 6d kube-system coredns-67bb89d7c6-tshkw 1/1 Running 0 6d kube-system coredns-67bb89d7c6-wmx4c 1/1 Running 0 6d kube-system kube-dns-autoscaler-655fffb489-m2gqr 1/1 Running 0 6d kube-system kube-flannel-ds-g7n9l 1/1 Running 1 153m kube-system kube-flannel-ds-tc4vl 1/1 Running 0 153m kube-system kube-flannel-ds-xd6hz 1/1 Running 1 153m kube-system kube-proxy-9wbh9 1/1 Running 0 153m kube-system kube-proxy-xklbj 1/1 Running 0 153m kube-system kube-proxy-zcmm9 1/1 Running 0 153m kube-system proxymux-client-btl5q 1/1 Running 0 153m kube-system proxymux-client-c64s9 1/1 Running 0 152m kube-system proxymux-client-pph62 1/1 Running 0 153m
先述したDeployment
やDaemonSet
から作られたPodが並んでいます。
あえてポイントをいうなれば、etcd
やapi-server
などが表示されていないところでしょうか。Master上でstatic Podとして起動しているのであれば上記に表示されると思うのですが、そうではないのでPodとして起動はしていないのかもしれません。
ConfigMap
# kubectl get configmap -A NAMESPACE NAME DATA AGE kube-public cluster-info 4 9d kube-system coredns 1 9d kube-system extension-apiserver-authentication 6 9d kube-system kube-dns-autoscaler 1 9d kube-system kube-flannel-cfg 2 9d kube-system kube-proxy 2 9d kube-system kubeadm-config 2 9d
記事を書いている今気づきましたが、kubeadm-config
ConfigMapがありました。kubeadm
で構築されているのでしょうか。
Secret
kubectl get secret -A NAMESPACE NAME TYPE DATA AGE default default-token-vbwws kubernetes.io/service-account-token 3 9d kube-node-lease default-token-zp8p8 kubernetes.io/service-account-token 3 9d kube-public default-token-gg6bn kubernetes.io/service-account-token 3 9d kube-system attachdetach-controller-token-dsnvw kubernetes.io/service-account-token 3 9d kube-system bootstrap-signer-token-dldnr kubernetes.io/service-account-token 3 9d kube-system bootstrap-token-5cwa9d bootstrap.kubernetes.io/token 6 9d kube-system bootstrap-token-8igddv bootstrap.kubernetes.io/token 6 176m kube-system bootstrap-token-8sda87 bootstrap.kubernetes.io/token 7 9d kube-system bootstrap-token-beiclf bootstrap.kubernetes.io/token 6 176m kube-system bootstrap-token-ed7kjh bootstrap.kubernetes.io/token 6 9d kube-system bootstrap-token-fu5nwq bootstrap.kubernetes.io/token 6 9d kube-system bootstrap-token-uzl2fd bootstrap.kubernetes.io/token 6 176m kube-system certificate-controller-token-2vltd kubernetes.io/service-account-token 3 9d kube-system clusterrole-aggregation-controller-token-hrjdn kubernetes.io/service-account-token 3 9d kube-system coredns-token-2vns7 kubernetes.io/service-account-token 3 9d kube-system cronjob-controller-token-wqzbf kubernetes.io/service-account-token 3 9d kube-system daemon-set-controller-token-5v2n5 kubernetes.io/service-account-token 3 9d kube-system default-token-kngtx kubernetes.io/service-account-token 3 9d kube-system deployment-controller-token-knxv6 kubernetes.io/service-account-token 3 9d kube-system disruption-controller-token-vr6nv kubernetes.io/service-account-token 3 9d kube-system dns-autoscaler-token-4r5hk kubernetes.io/service-account-token 3 9d kube-system endpoint-controller-token-f4txk kubernetes.io/service-account-token 3 9d kube-system expand-controller-token-jh64w kubernetes.io/service-account-token 3 9d kube-system flannel-token-29slf kubernetes.io/service-account-token 3 9d kube-system generic-garbage-collector-token-89l4f kubernetes.io/service-account-token 3 9d kube-system horizontal-pod-autoscaler-token-f4nxk kubernetes.io/service-account-token 3 9d kube-system job-controller-token-jz64n kubernetes.io/service-account-token 3 9d kube-system kube-proxy-token-nxl9r kubernetes.io/service-account-token 3 9d kube-system namespace-controller-token-bbr6q kubernetes.io/service-account-token 3 9d kube-system node-controller-token-4fthc kubernetes.io/service-account-token 3 9d kube-system persistent-volume-binder-token-jrks4 kubernetes.io/service-account-token 3 9d kube-system pod-garbage-collector-token-6x77b kubernetes.io/service-account-token 3 9d kube-system pv-protection-controller-token-bt6d7 kubernetes.io/service-account-token 3 9d kube-system pvc-protection-controller-token-8gp24 kubernetes.io/service-account-token 3 9d kube-system replicaset-controller-token-wz8vw kubernetes.io/service-account-token 3 9d kube-system replication-controller-token-9988d kubernetes.io/service-account-token 3 9d kube-system resourcequota-controller-token-qmj8f kubernetes.io/service-account-token 3 9d kube-system service-account-controller-token-vdfqb kubernetes.io/service-account-token 3 9d kube-system statefulset-controller-token-t67lc kubernetes.io/service-account-token 3 9d kube-system tiller-token-rbmkw kubernetes.io/service-account-token 3 9d kube-system token-cleaner-token-k5426 kubernetes.io/service-account-token 3 9d kube-system ttl-controller-token-8kwh2 kubernetes.io/service-account-token 3 9d
裏でどんなControllerが動いているのが透けてみえますね。
tiller-token-rbmkw
はHelm TillerのTokenと思われます。今回はインストールしませんでしたが、OKEセットアップ時にHelm Tillerをいれるか聞かれます。
所感
ほぼほぼVanillaなKubernetesな感じです。
(といってもOpenShiftとよくたわむれているのでそれと比べたら全部Vanillaな気もしますが)
Masterのコンポーネントが見えないのはマネージドサービス感ありますね。
TODO
次のネタとしては下記。 マネージドサービスなので他サービスと連携してこそ真価を発揮するものと考えていますので、サービス連携系はきちんと押さえておきたいところ。