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.

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

    OpenStack Days Tokyo 2019 中村 英和 2019年7⽉23⽇
  2. 2.
  3. 3.

    3 ⾃⼰紹介 中村 英和(Hidekazu Nakamura) l所属 NEC(NECソリューションイノベータから出向) lkubernetes-sigs Member l

    Certified Kubernetes Administrator l OpenStack Watcher コアレビューア l Web application developer
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 16.

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

    ▌対応OS lUbuntu lCentOS lCoreOS ▌注意 lシングルマスタのみ lCNIプラグインはCalico固定
  12. 17.

    17 Kubernetesクラスタ作成⼿順 (準備)OpenStack設定 n 仮想ネットワーク作成 n Floating IP作成(マスター⽤) n セキュリティグループ作成(マスター、ワーカー⽤)

    n キーペア作成・アップロード Kubernetesクラスタ作成 n マニフェストファイル⽣成・編集 n Kubernetesクラスタ作成
  13. 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 出⼒先
  14. 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
  15. 21.

    21 Target Cluster controller-manager clusterapi-controllers Cluster Machine Pivot clusterctl Bootstrap

    Cluster controller-manager clusterapi-controllers Cluster Machine kubeconfig
  16. 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
  17. 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
  18. 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
  19. 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
  20. 29.

    29 変わります Target Cluster Target Cluster Target Cluster Workload Cluster

    Workload Cluster Workload Cluster Management Cluster v1alpha1 v1alpha2
  21. 32.