VMware Kubernetes Engine (VKE)によるk8sクラスターの利用方法


# VKEとは

[VMware Kubernetes Engine(VKE)](https://cloud.vmware.com/vmware-kubernetes-engine)はVMwareが提供するKaaS(Kubernetes as a Service)です。AWSインフラ上で提供されています。Master/WorkerノードともVMwareのサービスとして提供されるため、インスタンスはすべてVMwareのVPC内で起動します。2018年9月現在ベータ版として提供されています。

# VKEの特徴

- AWS上でネイティブに起動し、VMC on AWSやvSphereハイパーバイザーは利用していない
- 複数のAWSリージョン(現在はOregon/Virginia/Ireland)で利用可能
- 将来的にAzureへの対応も予定
- グローバルで一貫したポリシーによる管理が可能
- [Kubernetesの認証](https://www.cncf.io/certification/software-conformance/)に適合
- VKE Connectionを利用することによりAWSサービスとのインテグレーションが可能

# VKEの機能

## VMware Smart Cluster

VKEのk8sクラスターはSmart Clusterと呼ばれます。Smart Clusterはコンピュートリソースを最適化し、可用性とコスト削減を実現します。コンピュートリソース(workerノード)は、必要に応じて増減するため、クラスターやサイジングが不要です。また、利用されていない場合はコンピュートノードが自動的に削除されるため、費用対効果に優れたスケーラブルなKubernetesクラスタの運用が可能です。また、クラスターのノードに対しては定期的なヘルスチェックが行われ、自己修復機能により高可用性が提供されます。


## VKE Connection

VKEによって作成されるk8sクラスターはVMware管理のVPCに作成されるため、利用者のVPCと直接通信することができません。VKE ConnectionはAWSのVPC Peeringを利用して、VMwareのk8sクラスターと利用者のVPCを接続することが可能です。

# VKEの使い方

## Smart Clusterの作成

VKE管理画面からSmart Clusterを作成することが可能です。Smart ClusterにはDevelopment ClusterとProduction Clusterの2種類があり、Development Clusterはシングルノードで提供され、VKE Connectionを利用することはできません。VKEのすべての機能を利用するには、Production Clusterを選択する必要があります。現在、k8sのバージョンとして 1.10.2-62と1.10.2-67 を選択できます。

![Kobito.3zIYoV.png](https://qiita-image-store.s3.amazonaws.com/0/27668/c4614a10-2985-cbf7-5084-936c8cf37c36.png "Kobito.3zIYoV.png")

クラスターを作成するAWSのリージョンを選択して、クラスターの名前を決めることができます。

![Kobito.SjHRsY.png](https://qiita-image-store.s3.amazonaws.com/0/27668/78a3aef9-1dc4-9bd3-7ecc-212ee3ee63d8.png "Kobito.SjHRsY.png")

クラスターが作成されると、管理画面上で確認することができます。

![Kobito.0XmAz1.png](https://qiita-image-store.s3.amazonaws.com/0/27668/18da9776-673a-70e2-c86c-83f9491d5ced.png "Kobito.0XmAz1.png")



## Smart Clusterの実体

Smart Clusterのオートスケール機能は、[cluster-autoscaler](https://github.com/kubernetes/autoscaler)が利用されているようです。また、ネットワーク機能は[Canal](https://github.com/projectcalico/canal)が利用されているようです。

```
$ kubectl get pods -o wide --all-namespaces
NAMESPACE    NAME                                                  READY     STATUS    RESTARTS   AGE       IP             NODE
vke-system   canal-node-1-10-2-67-7q5pb                            3/3       Running   0          13m       10.1.188.108   master-469d98e4-b865-11e8-bee9-025cd8439484
vke-system   canal-node-1-10-2-67-8d2ww                            3/3       Running   0          13m       10.1.205.56    master-469d989e-b865-11e8-bee9-025cd8439484
vke-system   canal-node-1-10-2-67-c2dhw                            3/3       Running   0          13m       10.1.117.171   master-469d98c6-b865-11e8-bee9-025cd8439484
vke-system   cluster-autoscaler-1-10-2-67-7fd67485c-fp687          1/1       Running   0          13m       10.2.2.4       master-469d98c6-b865-11e8-bee9-025cd8439484
vke-system   kube-dns-1-10-2-67-68659d4fd8-h9zmm                   3/3       Running   0          13m       10.2.1.4       master-469d989e-b865-11e8-bee9-025cd8439484
vke-system   kubernetes-dashboard-1-10-2-67-55d99bf649-rrt58       2/2       Running   0          13m       10.2.1.5       master-469d989e-b865-11e8-bee9-025cd8439484
vke-system   nginx-ingress-deployment-1-10-2-67-67c87d9bd6-5tpjq   1/1       Running   0          13m       10.2.2.5       master-469d98c6-b865-11e8-bee9-025cd8439484
vke-system   node-monitor-ds-1-10-2-67-6bscc                       1/1       Running   0          13m       10.2.0.2       master-469d98e4-b865-11e8-bee9-025cd8439484
vke-system   node-monitor-ds-1-10-2-67-79kfm                       1/1       Running   0          13m       10.2.1.2       master-469d989e-b865-11e8-bee9-025cd8439484
vke-system   node-monitor-ds-1-10-2-67-pcjgz                       1/1       Running   0          13m       10.2.2.3       master-469d98c6-b865-11e8-bee9-025cd8439484
vke-system   update-controller-ds-1-10-2-67-4fhj9                  1/1       Running   0          13m       10.2.2.2       master-469d98c6-b865-11e8-bee9-025cd8439484
vke-system   update-controller-ds-1-10-2-67-7j44z                  1/1       Running   0          13m       10.2.0.3       master-469d98e4-b865-11e8-bee9-025cd8439484
vke-system   update-controller-ds-1-10-2-67-84r5v                  1/1       Running   0          13m       10.2.1.3       master-469d989e-b865-11e8-bee9-025cd8439484
```

## vke cli

VKE管理画面からvke cliをダウンロードして利用することができます。vkeコマンドによりスマートクラスターの作成や管理が可能です。


### ログイン

vkeコマンドを利用するには、VMware Cloud ServiceのOrganization IDとRefresh Tokenが必要です。Organization IDとRefresh TokenはVMware Cloud Serviceのポータルから参照することができます。

```
$ vke account login --organization 3cf52fc8-bc7d-4755-983a-XXXXXXXXXXXX --reflesh-token 2d208834-6e0a-4f58-879a-yyyyyyyyyyyy
```

### k8sクラスターの作成

vke cliによりクラスターを作成することも可能です。

```
$ vke cluster create --name k8s-01 --service-level ENTERPRISE ¥
  --display-name my-vke --region us-west-2 ¥
  --folder "SharedFolder" --project "SharedProject" --version 1.10.2-62

$ vke cluster show my1st-cluster
Creating Cluster:
  Name: k8s-01
  Region: us-west-2
  Service Level: ENTERPRISE
  Pod Network CIDR: 10.2.0.0/16
  Version: 1.10.2-62
CreateKubernetesCluster completed for 'Cluster' entity 8da04a92-af06-11e8-a0f0-061a39cd6d80

$ vke cluster list
      NAME      | DISPLAY NAME  |  REGION   |   FOLDER NAME   |   PROJECT NAME
+---------------+---------------+-----------+-----------------+-------------------+
  my1st-cluster | my1st-cluster | us-west-2 | m-nara830171651 | masanara830172013

vke cluster show my1st-cluster
Name:                   my1st-cluster
Health:                 HEALTHY
Display Name:           my1st-cluster
Folder Name:            m-nara830171651
Project Name:           masanara830172013
Region:                 us-west-2
Service Level:          ENTERPRISE
Network Tenancy:        DEDICATED
Cluster Network:        10.1.0.0/16
Pod Network:            10.2.0.0/16
Service Network:        10.0.0.0/24
Version:                1.10.2-67
Cluster ID:             82f8f410-b864-11e8-bee9-025cd8439484
Autoscale:              true
VCPU:                   2
Memory in GB:           8
Maximum VCPU:           240
Maximum Memory in GB:   960
Minimum VCPU:           0
Minimum Memory in GB:   0
State:                  READY
Address:                my1st-cluster-82f8f410-b864-11e8-bee9-025cd8439484.3cf52fc8-bc7d-4755-983a-bbdca41a768d.vke-user.com
UI URL:                 https://ui.my1st-cluster-82f8f410-b864-11e8-bee9-025cd8439484.3cf52fc8-bc7d-4755-983a-bbdca41a768d.vke-user.com:443
API URL:                https://api.my1st-cluster-82f8f410-b864-11e8-bee9-025cd8439484.3cf52fc8-bc7d-4755-983a-bbdca41a768d.vke-user.com:443
OIDC Client ID:         78590775-226a-4a07-9ea0-c8497cc8e121
OIDC Issuer URL:        https://lightwave.vke.cloud.vmware.com/openidconnect/3cf52fc8-bc7d-4755-983a-bbdca41a768d
Worker Count:           0
Kubectl URLs:
  Linux, 64-bit:        https://storage.googleapis.com:443/kubernetes-release/release/v1.10.2/bin/linux/amd64/kubectl
  Linux, 32-bit:        https://storage.googleapis.com:443/kubernetes-release/release/v1.10.2/bin/linux/386/kubectl
  Mac:                  https://storage.googleapis.com:443/kubernetes-release/release/v1.10.2/bin/darwin/amd64/kubectl
  Windows, 64-bit:      https://storage.googleapis.com:443/kubernetes-release/release/v1.10.2/bin/windows/amd64/kubectl.exe
  Windows, 32-bit:      https://storage.googleapis.com:443/kubernetes-release/release/v1.10.2/bin/windows/386/kubectl.exe

```

### k8s contextの作成

vkeコマンドによりkubectlのcontextを生成し、kubectlでクラスターに接続することが可能です。

```
$ vke cluster get-kubectl-auth --configfile k8s-config my1st-cluster
Export KUBECONFIG to k8s-config to access the cluster
$ cat k8s-config >> ~/.kube/config
kubectl config get-contexts
CURRENT   NAME                    CLUSTER         AUTHINFO              NAMESPACE
*         my1st-cluster-context   my1st-cluster   masanara

$ kubectl config use-context my1st-cluster-context
Switched to context "my1st-cluster-context".

$ kubectl get nodes -o wide
NAME                                          STATUS    ROLES     AGE       VERSION   EXTERNAL-IP   OS-IMAGE                 KERNEL-VERSION   CONTAINER-RUNTIME
master-469d989e-b865-11e8-bee9-025cd8439484   Ready     master    13m       v1.10.2   <none>        VMware Photon OS/Linux   4.9.124-1.ph2    docker://17.6.0
master-469d98c6-b865-11e8-bee9-025cd8439484   Ready     master    13m       v1.10.2   <none>        VMware Photon OS/Linux   4.9.124-1.ph2    docker://17.6.0
master-469d98e4-b865-11e8-bee9-025cd8439484   Ready     master    13m       v1.10.2   <none>        VMware Photon OS/Linux   4.9.124-1.ph2    docker://17.6.0
```


## kubernetes dashboard

Smart Clusterにはk8s dashboardがデプロイされており、VKE管理画面からVMware Cloud Serviceが提供する認証を利用してダッシュボードを開くことが可能です。

![Kobito.tGSxFQ.png](https://qiita-image-store.s3.amazonaws.com/0/27668/99d64bdc-430c-2974-d06f-f78dd9e022b5.png "Kobito.tGSxFQ.png")

kubernetes dashboardにはVMware Cloud Serviceによって認証されるため、VMware Cloud Serviceへのログインが必要です。

![Kobito.iVgubp.png](https://qiita-image-store.s3.amazonaws.com/0/27668/13064594-4007-f789-33ca-c2cb1ba70da6.png "Kobito.iVgubp.png")



## kubernetesの利用

nginx podを作成して、LoadBalancerで外部に公開してみます。

```
# kubectl create -f nginx.yaml
```

workerノードが存在しないため、podはPending状態となりますが、しばらくすると自動的にworkerノードが追加され、Podが起動します。

```
# kubectl get pods
NAME                        READY     STATUS    RESTARTS   AGE
my-nginx-77f56b88c8-fsf27   0/1       Pending   0          2m
my-nginx-77f56b88c8-vd2gg   0/1       Pending   0          2m

# kubectl get node
NAME                                          STATUS     ROLES     AGE       VERSION
master-469d989e-b865-11e8-bee9-025cd8439484   Ready      master    17m       v1.10.2
master-469d98c6-b865-11e8-bee9-025cd8439484   Ready      master    17m       v1.10.2
master-469d98e4-b865-11e8-bee9-025cd8439484   Ready      master    17m       v1.10.2
worker-b086758a-b867-11e8-85a1-0661c054e624   NotReady   worker    7s        v1.10.2

# kubectl get pods
NAME                        READY     STATUS    RESTARTS   AGE
my-nginx-77f56b88c8-fsf27   1/1       Running   0          5m
my-nginx-77f56b88c8-vd2gg   1/1       Running   0          5m
```

Podが作成されるとGUI上でComputeリソースの利用状況を確認することが可能です。

![Kobito.jfKZVu.png](https://qiita-image-store.s3.amazonaws.com/0/27668/2d2d90f9-9577-06cf-b5e5-93af7664b046.png "Kobito.jfKZVu.png")


Smart Cluster上では予めnginxのIngress Controllerが構成されているため、Ingressを利用することも可能です。
Ingressに利用することができるFQDNは```vke cluster show [クラスター名]```で確認することが可能です。

```
$ vke cluster show my1st-cluster | grep Address
Address:                my1st-cluster-82f8f410-b864-11e8-bee9-025cd8439484.3cf52fc8-bc7d-4755-983a-bbdca41a768d.vke-user.com
```

```ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   name: my-vke-ingress
   annotations:
     nginx.org/rewrites: "serviceName=my-nginx rewrite=/"

spec:
  rules:
  - host: my1st-cluster-82f8f410-b864-11e8-bee9-025cd8439484.3cf52fc8-bc7d-4755-983a-bbdca41a768d.vke-user.com
    http:
     paths:
      - path: /nginx
        backend:
          serviceName: my-nginx
          servicePort: 80
```

```
$ kubectl create -f ingress.yaml
$ kubectl get svc -o wide
NAME         TYPE           CLUSTER-IP   EXTERNAL-IP                                                                                                     PORT(S)        AGE       SELECTOR
kubernetes   ClusterIP      10.0.0.1     <none>                                                                                                          443/TCP        21m       <none>
my-nginx     LoadBalancer   10.0.0.232   my-nginx.my1st-cluster-82f8f410-b864-11e8-bee9-025cd8439484.3cf52fc8-bc7d-4755-983a-bbdca41a768d.vke-user.com   80:30405/TCP   6m        run=my-nginx
```


## Connectionの作成

ClusterのActionメニューから「New Network Connection」を選択します。

![Kobito.KICwnB.png](https://qiita-image-store.s3.amazonaws.com/0/27668/eb528484-7e94-483b-9548-219137dfaeae.png "Kobito.KICwnB.png")

ピアリング先のVPCに関する情報(アカウントID、VPC ID、VPC CIDR、VPC Region)を入力します。

![Kobito.ImkoGi.png](https://qiita-image-store.s3.amazonaws.com/0/27668/1288b978-f74d-2fbe-d231-4ac326697581.png "Kobito.ImkoGi.png")

Clusterのネットワークタブを確認すると、Statusが「Pending aceptance」状態になります。

![Kobito.gCxnz6.png](https://qiita-image-store.s3.amazonaws.com/0/27668/874925e7-0522-af61-f8fd-b5bb6ad0660d.png "Kobito.gCxnz6.png")

AWS ConsoleのVPCダッシュボードの「ピアリング接続」で確認すると指定したVPCに対してClusterのVPCからピア接続のリクエストが承諾待ちの状態になっています。

![Kobito.CIeoSE.png](https://qiita-image-store.s3.amazonaws.com/0/27668/9d51b987-83d7-9864-f91e-a250e3e317c8.png "Kobito.CIeoSE.png")

ピア接続を承諾して、ルートテーブルにCluster向けのスタティックルートを追加します。

![Kobito.yWJlKf.png](https://qiita-image-store.s3.amazonaws.com/0/27668/d055c41d-4a6d-86ea-04eb-8e8ee713910c.png "Kobito.yWJlKf.png")

![Kobito.AlqfsD.png](https://qiita-image-store.s3.amazonaws.com/0/27668/228eca6b-db22-2e98-6128-d0b76a9cecf4.png "Kobito.AlqfsD.png")

Clusterの管理画面ではNetworkが「Active」状態になり、クラスター上のPodから接続したVPC内のリソースへのアクセスが可能になります。

![Kobito.6wiEyo.png](https://qiita-image-store.s3.amazonaws.com/0/27668/1673c959-4cdf-b5f2-849d-3c35bb3cf66b.png "Kobito.6wiEyo.png")