Cluster APIで簡単Kubernetes on OpenStack / Cluster API: easy way to deploy kubernetes on OpenStack

Cluster APIで簡単Kubernetes on OpenStack / Cluster API: easy way to deploy kubernetes on OpenStack

CloudNative Days Tokyo 2019 / OpenStack Days Tokyo 2019で発表したスライドです。

E47b69ca7a02b9c9a7d7787e13aa6bbb?s=128

hidekazuna

July 23, 2019
Tweet

Transcript

  1. 1 Cluster APIで簡単Kubernetes on OpenStack CloudNative Days Tokyo 2019 /

    OpenStack Days Tokyo 2019 中村 英和 2019年7⽉23⽇
  2. None
  3. 3 ⾃⼰紹介 中村 英和(Hidekazu Nakamura) l所属 NEC(NECソリューションイノベータから出向) lkubernetes-sigs Member l

    Certified Kubernetes Administrator l OpenStack Watcher コアレビューア l Web application developer
  4. 4 Cluster API

  5. 5 Cluster APIとは ▌Kubernetesコミュニティのプロジェクト lCluster Lifecycle SIGのプロジェクト lhttps://github.com/kubernetes-sigs/cluster-api ▌バージョン l0.1.6(2019年7⽉17⽇現在)

    lapiVersion: "cluster.k8s.io/v1alpha1“
  6. 6 Cluster APIの⽬的 üKubernetesクラスタを üさまざまなインフラプロバイダに対して ü同じやり⽅で üマシンを含めて宣⾔的に管理 l作成 lスケール lアップグレード

    l削除 Cluster API オンプレ … クラウド プロバイダ クラウド プロバイダ
  7. 7 Provider Implementations ▌プロバイダごとの実装は別リポジトリ Kubernetesコミュニティでホストしていないものもある。 l AWS, https://github.com/kubernetes-sigs/cluster-api-provider-aws l vSphere,

    https://github.com/kubernetes-sigs/cluster-api-provider-vsphere l Bare Metal, https://github.com/metal3-io/cluster-api-provider-baremetal l Azure, https://github.com/kubernetes-sigs/cluster-api-provider-azure l IBM Cloud, https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud l OpenStack, https://github.com/kubernetes-sigs/cluster-api-provider-openstack l GCP, https://github.com/kubernetes-sigs/cluster-api-provider-gcp l DigitalOcean, https://github.com/kubernetes-sigs/cluster-api-provider-digitalocean l Exoscale, https://github.com/exoscale/cluster-api-provider-exoscale l Talos, https://github.com/talos-systems/cluster-api-provider-talos l Baidu Cloud, https://github.com/baidu/cluster-api-provider-baiducloud l Tencent Cloud, https://github.com/TencentCloud/cluster-api-provider-tencent
  8. 8 API resources Machine MachineSet MachineDeployment Pod ReplicaSet Deployment Cluster

    API Kubernetes Cluster
  9. 9 Cluster ▌Kubernetesクラスタの設定 ▌⼀般的なネットワーク設定 lPod、サービスCIDR lDNSドメイン kind: Cluster metadata: name:

    test1 spec: clusterNetwork: services: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["192.168.0.0/16"] serviceDomain: "cluster.local" providerSpec: value: apiVersion: "openstackproviderconfig/v1alpha1" kind: "OpenstackProviderSpec" tags: - a_cluster_wide_tag
  10. 10 Cluster Actuator Interface ▌ProviderはActuatorインタフェースを実装する。 ▌基本的なインタフェースが定義されている。 ⇒プロバイダごと実装に⼤きく依存 例︓ lシングルクラスタか、マルチクラスタか lCNIプラグインはなにか

    /// [Actuator] // Actuator controls clusters on a specific infrastructure. All // methods should be idempotent unless otherwise specified. type Actuator interface { // Reconcile creates or applies updates to the cluster. Reconcile(*clusterv1.Cluster) error // Delete the cluster. Delete(*clusterv1.Cluster) error } /// [Actuator] vendor/sigs.k8s.io/cluster-api/pkg//controller/cluster/actuator.go
  11. 11 Machine ▌(物理or仮想)マシンの設定 ▌ほとんどの設定はプロバイダごと の設定部分に記載 apiVersion: "cluster.k8s.io/v1alpha1" kind: Machine metadata:

    generateName: openstack-master- labels: set: master cluster.k8s.io/cluster-name: test1 spec: providerSpec: value: apiVersion: "openstackproviderconfig/v1alpha1" kind: "OpenstackProviderSpec" flavor: large image: u1804 sshUserName: Ubuntu ………… versions: kubelet: 1.14.0 controlPlane: 1.14.0
  12. 12 Machine Actuator Interface ▌ProviderはActuatorインタフェースを実装する。 ▌きわめて基本的なインタフェースのみ定義されている。 ⇒プロバイダごと実装に⼤きく依存 lCreate lUpdate lDelete

    lExists /// [Actuator] // Actuator controls machines on a specific infrastructure. All // methods should be idempotent unless otherwise specified. type Actuator interface { // Create the machine. Create(context.Context, *clusterv1.Cluster, *clusterv1.Machine) error // Delete the machine. If no error is returned, it is assumed that all dependent resources have been cleaned up. Delete(context.Context, *clusterv1.Cluster, *clusterv1.Machine) error // Update the machine to the provided definition. Update(context.Context, *clusterv1.Cluster, *clusterv1.Machine) error // Checks if the machine currently exists. Exists(context.Context, *clusterv1.Cluster, *clusterv1.Machine) (bool, error) } /// [Actuator] vendor/sigs.k8s.io/cluster-api/pkg//controller/machine/actuator.go
  13. 13 MachineSet ▌Machineの集まり ▌MachineDeploymentとどちらかを 使う。 apiVersion: cluster.k8s.io/v1alpha1 kind: MachineSet metadata:

    name: test1-machineset labels: set: node cluster.k8s.io/cluster-name: test1 spec: replicas: 2 selector: matchLabels: set: node cluster.k8s.io/cluster-name: test1 template: metadata: labels: set: node cluster.k8s.io/cluster-name: test1 spec: providerSpec: value: apiVersion: "openstackproviderconfig/v1alpha1" kind: "OpenstackProviderSpec" flavor: large image: u1804 sshUserName: Ubuntu ………… versions: kubelet: 1.14.0
  14. 14 MachineDeployment ▌MachineSetとどちらかを使う。 ▌Deploymentのようにふるまう。 apiVersion: "cluster.k8s.io/v1alpha1" kind: MachineDeployment metadata: name:

    test1-machinedeployment labels: cluster.k8s.io/cluster-name: test1 spec: replicas: 1 selector: matchLabels: cluster.k8s.io/cluster-name: test1 set: node template: metadata: labels: cluster.k8s.io/cluster-name: test1 set: node spec: providerSpec: value: apiVersion: "openstackproviderconfig/v1alpha1" kind: "OpenstackProviderSpec" flavor: small ………… versions: kubelet: 1.14.0
  15. 15 cluster-api-provider-openstack

  16. 16 cluster-api-provider-openstack とは ▌Cluster APIのOpenStack向け実装 ▌Cloud Provider OpenStackが設定される ▌バージョン lリリースはない

    ▌対応OS lUbuntu lCentOS lCoreOS ▌注意 lシングルマスタのみ lCNIプラグインはCalico固定
  17. 17 Kubernetesクラスタ作成⼿順 (準備)OpenStack設定 n 仮想ネットワーク作成 n Floating IP作成(マスター⽤) n セキュリティグループ作成(マスター、ワーカー⽤)

    n キーペア作成・アップロード Kubernetesクラスタ作成 n マニフェストファイル⽣成・編集 n Kubernetesクラスタ作成
  18. 18 Kubernetesクラスタ作成 ▌マニフェストファイル⽣成・編集 出⼒ファイル 説明 cluster.yaml Clusterの定義 machines.yaml Machineの定義 machine-deployment.yaml

    MachineDeploymentの定義 provider-components.yaml CRDと関連オブジェクト定義。 kubeadmによる構築スクリプトのSecretなど。 ./generate-yaml.sh -f ~/.config/openstack/clouds.yaml openstack ubuntu out1 OpenStack認証情報 対象OS 出⼒先
  19. 19 Kubernetesクラスタ作成 ▌Kubernetesクラスタ作成 ./clusterctl create cluster --bootstrap-type kind --provider openstack

    -c examples/openstack/out1/cluster.yaml -m examples/openstack/out1/machines.yaml -p examples/openstack/out1/provider-components.yaml
  20. 20 Bootstrapping kind clusterctl provider-components.yaml machines.yaml cluster.yaml Bootstrap Cluster controller-manager

    clusterapi-controllers Cluster Machine master-user-data Target Cluster
  21. 21 Target Cluster controller-manager clusterapi-controllers Cluster Machine Pivot clusterctl Bootstrap

    Cluster controller-manager clusterapi-controllers Cluster Machine kubeconfig
  22. 22 Target Cluster controller-manager clusterapi-controllers Cluster Machine Target Clusterへのアクセス kubeconfig

  23. 23 デモ 1. Masterのみのクラスタを作る 2. Workerを追加する 3. Workerをもうひとつ追加する 4. Workerをひとつ減らす

    5. WorkerのVMイメージを変更する
  24. 24 Masterのみのクラスタを作る ./clusterctl create cluster --bootstrap-type kind --provider openstack -c

    examples/openstack/out1/cluster.yaml -m examples/openstack/out1/machines.yaml -p examples/openstack/out1/provider-components.yaml
  25. 25 Workerを追加する kubectl --kubeconfig=kubeconfig apply -f examples/openstack/out1/machine-deployment.yaml

  26. 26 Workerをひとつ追加する kubectl --kubeconfig=kubeconfig apply -f examples/openstack/out1/machine-deployment.yaml apiVersion: "cluster.k8s.io/v1alpha1" kind:

    MachineDeployment metadata: name: machine-deploy-machinedeployment labels: cluster.k8s.io/cluster-name: machine-deploy spec: replicas: 2
  27. 27 Workerをひとつ減らす kubectl --kubeconfig=kubeconfig apply -f examples/openstack/out1/machine-deployment.yaml apiVersion: "cluster.k8s.io/v1alpha1" kind:

    MachineDeployment metadata: name: machine-deploy-machinedeployment labels: cluster.k8s.io/cluster-name: machine-deploy spec: replicas: 1
  28. 28 WorkerのVMイメージを変更する kubectl --kubeconfig=kubeconfig apply -f examples/openstack/out1/machi ne-deployment.yaml kind: MachineDeployment

    metadata: name: test2-machinedeployment labels: cluster.k8s.io/cluster-name: test2 spec: replicas: 1 selector: matchLabels: cluster.k8s.io/cluster-name: test2 set: node template: metadata: labels: cluster.k8s.io/cluster-name: test2 set: node spec: providerSpec: value: apiVersion: "openstackproviderconfig/v1alpha1" kind: "OpenstackProviderSpec" flavor: small image: bionic
  29. 29 変わります Target Cluster Target Cluster Target Cluster Workload Cluster

    Workload Cluster Workload Cluster Management Cluster v1alpha1 v1alpha2
  30. 30 まとめ uCluster APIで宣⾔的にkubernetesクラスタを構築できる uWorkerノードの追加・削除が簡単にできる uCluster APIは活発に開発されている。今後に期待︕ uHA構成 uRollingUpdate

  31. 31 Thank you

  32. None