gashirar's blog

ウイスキーがすき/美味しいものがすき/k8sがすき

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をながめる

KubernetesKubernetesたらしめる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ですが、こちらはKubernetesNodeLease 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に設定されており、かつpreventSinglePointFailuretrueに設定されているので、「各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 NVIDIAGPUを載せたNodeのためのDaemonSet
nvidia-gpu-device-plugin-1-8 NVIDIAGPUを載せた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.

とあるように、NVIDIAGPUが載っているということをKubeletに伝えるためのものでしょう。

https://github.com/NVIDIA/k8s-device-plugin

とするとOKEではNVIDIAGPUを積んだNodeを払い出せるのかなと思い調べてみると確かにTeslaを積んだコンピュートリソースは払い出せるようです。

https://docs.cloud.oracle.com/en-us/iaas/Content/Compute/References/computeshapes.htm?Highlight=nvidia

が、Node Pool作成の一覧にはStandard Shapesのみの表示となっていたため、利用するには別の方法をとる必要がありそうです。(少し調べたのですが、方法はわからず。

nvidia-gpu-device-pluginnvidia-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

先述したDeploymentDaemonSetから作られたPodが並んでいます。

あえてポイントをいうなれば、etcdapi-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

次のネタとしては下記。 マネージドサービスなので他サービスと連携してこそ真価を発揮するものと考えていますので、サービス連携系はきちんと押さえておきたいところ。

  • OCIのユーザとKubernetesのユーザの紐づけ
    • AWSだとauth-config ComfigMapとかでやってたはず。
  • ログ周り
    • GKEだとStackdriver、AWSだとCloudWatchみたいな
  • api-serverのパラメータカスタマイズ
    • AWSだとAMIをうまいことやるとできると聞いてますが、Oracleだとどうなるか。GKEもどうなんだろ。
  • StorageClass周り
  • OCIR(コンテナレジストリ