Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetes in Docker で始めるお手軽 Kubernetes 環境 / cloudnativejp_09_kubernetes_in_docker_kind

Kubernetes in Docker で始めるお手軽 Kubernetes 環境 / cloudnativejp_09_kubernetes_in_docker_kind

Kubernetes の環境の選択でお困りですか?Docker for Mac、Minikube など色々な Kubernetes 環境がありますが、Kubernetes in Docker では 1 台のマシン上に複数台のからなるマルチノード Kubernetes クラスタを構築することが可能です。このセッションではkind でできることについてご紹介します。

Masaya Aoyama (@amsy810)

August 07, 2019
Tweet

More Decks by Masaya Aoyama (@amsy810)

Other Decks in Technology

Transcript

  1. Masaya Aoyama
    CyberAgent
    kind Ͱ࢝ΊΔ͓खܰ Kubernetes ؀ڥ
    ʙԶͨͪ͸งғؾͰ Local ͷ Kubernetes ؀ڥΛ࢖͍ͬͯΔʙ
    @Cloud Native Meetup Tokyo #9
    amsy810 @amsy810

    View Slide

  2. Publicity (一部抜粋)
      書籍 『Kubernetes 完全ガイド』 『みんなの Docker/K8s』
     基調講演 『Japan Container Days v18.04』 『Google Cloud K8s Day』 
     招待講演 『情報処理学会 コンピュータシステムシンポジウム』
            『AWS Dev Day Tokyo』 『IBM Think Japan』 『JEITA 委員会』
      登壇 『KubeCon + CNCon China 2019』 『Open Source Summit 2019』 等
     資格 『CKAD #2』 『CKA #138』
    Masaya Aoyama (@amsy810)
    Infrastructure Engineer
    Community
      Co-chair 『Cloud Native Days Tokyo (旧 Japan Container Days)』
     Organizer 『Cloud Native Meetup Tokyo』
      『Kubernetes Meetup Tokyo』
      『KubeCon Japanese exchange meeting』
      Contribute to OpenStack and Kubernetes
    主業務:
    K8s as a Service の実装
    K8s / CloudNative 関連のアーキテクト
    + CREATIONLINE / DENSO - 技術アドバイザ
    + SAKURA Internet Research Center – 客員研究員

    View Slide

  3. Local Kubernetes

    View Slide

  4. Local Kubernetes ͷબ୒ࢶ
    Docker for Mac
    https://docs.docker.com/
    docker-for-mac/
    microk8s
    https://microk8s.io/
    Minikube
    https://github.com/
    kubernetes/minikube
    kind
    Kubernetes in Docker
    https://kind.sigs.k8s.io/

    View Slide

  5. Docker for Mac by Docker, Inc.
    ワンクリックで Kubernetes を有効化可能
    Mac 上の Docker と同じレイヤに起動
    •  = ビルド済みイメージがそのまま利⽤可能
    •  spec.containers[].imagePullPolicy: Never/IfNotPresent
    “type: LoadBalancer” Service は localhost で binding
    •  1 Service のみ
    •  任意の 127.0.0.0/8 で binding してくれればいいのに…と思う

    View Slide

  6. Docker for Mac by Docker, Inc.
    Mac 上の領域をコンテナにマウント可能
    1 クラスタしか起動できない
    バージョンを選択できない
    •  Docker for Mac のバージョンに紐づく
    •  例) Docker 19.03.0-rc2 = Kubernetes v1.14.3

    View Slide

  7. microk8s by Canonical Ltd.
    •  snap を利⽤するため Linux での利⽤前提
    •  シングルノード Kubernetes を 1 コマンドでデプロイ
    •  バージョン指定可能
    •  addon 機能
    •  GPU Support

    View Slide

  8. Minikube by Kubernetes SIG-Cluster-Lifecycle
    •  Node に VM を⽤いてシングルノード K8s を起動
    •  マルチクラスタ対応
    •  minikube start –p NAME
    •  Tunneling して ClusterIP Service に接続可能
    •  minikube tunnel
    •  type: LB の場合は ClusterIP のエントリが書き込まれる
    •  Addon 機能
    •  GPU サポート

    View Slide

  9. kind by Kubernetes SIG-Testing
    •  マルチノード Kubernetes クラスタが構築可能
    •  Node にVM ではなくコンテナを利⽤可能
    •  googlability が最悪

    View Slide

  10. Retired: kubeadm-dind-cluster
    https://github.com/kubernetes-retired/kubeadm-dind-cluster
    いわゆる kind と同等のプロダクト

    View Slide

  11. dind – Docker in Docker
    •  Docker in Docker
    OS
    Docker
    Container
    Docker
    Container
    Container
    Docker
    Container
    Container
    Inner
    Outer

    View Slide

  12. Kind (Kubernetes in Docker)

    View Slide

  13. Kubernetes in Docker ͷ֓ཁ (1/4)
    Docker がインストールされたマシンを⽤意
    OS
    Docker

    View Slide

  14. Kubernetes in Docker ͷ֓ཁ (2/4)
    その上でコンテナを起動
    OS
    Docker
    Container Container

    View Slide

  15. Kubernetes in Docker ͷ֓ཁ (3/4)
    OS
    Docker
    Container
    Docker / kubelet
    Container
    Docker / kubelet
    コンテナ上で Docker や kubelet などを起動し、
    kubeadm を⽤いてクラスタを構成

    View Slide

  16. Kubernetes in Docker ͷ֓ཁ (4/4)
    構築した Kubernetes 上でコンテナを起動可能
    OS
    Docker
    Container
    Docker / kubelet
    Container
    Container
    Docker / kubelet
    Container
    Container

    View Slide

  17. γϯάϧϊʔυΫϥελͷߏங
    kubeconfig は ~/.kube/kind-config-NAME
    •  kind get kubeconfig-path --name NAME でも確認可能
    # kind create cluster --name NAME

    View Slide

  18. ΫϥελͷҰཡදࣔ
    # kind get clusters
    sample-k8s
    ...
    kind で作成されているクラスタ⼀覧を確認可能
    kind [create|delete] cluster --name NAME で作成|削除

    View Slide

  19. ϊʔυҰཡͷදࣔ
    各クラスタに割り当てられているノードを確認可能
    # kind get nodes --name NAME
    sample-k8s-control-plane
    # kubectl get nodes \
    --kubeconfig ~/.kube/kind-config-sample-k8s
    NAME STATUS ROLES AGE VERSION
    sample-k8s-control-plane Ready master 55s v1.15.0

    View Slide

  20. ϚϧνϊʔυΫϥελͷߏங
    kind: Cluster
    apiVersion: kind.sigs.k8s.io/v1alpha3
    nodes:
    - role: control-plane
    - role: control-plane
    - role: control-plane
    - role: worker
    - role: worker
    - role: worker
    https://github.com/kubernetes-sigs/kind/blob/master/pkg/apis/config/v1alpha3/types.go
    cluster.yaml
    # kind create cluster --config cluster.yaml
    # kind get nodes
    kind-control-plane
    kind-control-plane2
    kind-control-plane3
    kind-worker
    kind-worker2
    kind-worker3
    kind-external-load-balancer

    View Slide

  21. ホスト OS との繋ぎこみ

    View Slide

  22. ϩʔΧϧΠϝʔδΛ kind ʹΠϯϙʔτ
    # kind load docker-image IMAGE:TAG \
    --name NAME --nodes a,b,c
    OS
    Docker
    Container
    Docker / kubelet
    Container
    Container
    Docker / kubelet
    Container
    Container
    img
    img img

    View Slide

  23. extraPortMapping ホスト上のPort と NodeのPort
    のマッピングを⾏う
    = NodePort の利⽤が可能
    kind: Cluster
    apiVersion: kind.sigs.k8s.io/v1alpha3
    nodes:
    - role: control-plane
    - role: worker
    extraPortMappings:
    - containerPort: 8080
    hostPort: 8181
    listenAddress: ”0.0.0.0”
    protocol: tcp
    OS
    Docker
    Container
    Docker / kubelet
    Container Container
    8080
    8181

    View Slide

  24. kubeadm config ͷมߋ
    kubeadm の設定を上書き可能
    内部的には kustomize の Patch
    - kubeadmConfigPatches
    strategic merge patch
    - kubeadmConfigPatchesJson6902
    https://tools.ietf.org/html/rfc6902
    kind: Cluster
    apiVersion: kind.sigs.k8s.io/v1alpha3
    kubeadmConfigPatches:
    - |
    apiVersion: kubeadm.k8s.io/v1beta2
    kind: ClusterConfiguration
    metadata:
    name: config
    apiServer:
    extraArgs:
    "feature-gates": ”..."
    scheduler:
    extraArgs:

    View Slide

  25. base-image / node-image
    # kind build node-image \
    --kube-root ./kubernetes --image new-image:0.1
    base-image
      containerd や CNI Plugins などが含まれている
      https://github.com/kubernetes-sigs/kind/blob/master/images/base/Dockerfile
    node-image
    base-image を元に任意の Kubernetes Release でビルド可能

    View Slide

  26. Advantage Points
    •  マルチノードクラスタを構成可能
    •  ソースコードからKubernetesリリースをビルド可能
    •  make, bask, docker, bazel, apt(depricated)
    •  Kubernetes ⾃体の E2E でも利⽤可能
    •  Go ⾔語で実装されおり、ライブラリとしても利⽤可能

    View Slide

  27. Note
    •  現状は docker のみをサポート

    View Slide

  28. DEMO

    View Slide

  29. Conclusion of local
    主な Local Kubernetes 環境の選択肢は 4 つ
    kind Minikube Docker for Mac MicroK8s
    バージョンの選択 ◎ ○ × ○
    マルチクラスタ ○ ○ × ×
    マルチノード ○ × × ×
    機能性 ○ ◎ △ ◎
    シンプルさ ○ ○ ◎ ○

    View Slide

  30. Thank you for your attention
    Let’s enjoy with Kubernetes
    follow me: @amsy810

    View Slide

  31. View Slide