VKEとは
VMware Kubernetes Engine(VKE)は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の認証に適合
- 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 を選択できます。
クラスターを作成するAWSのリージョンを選択して、クラスターの名前を決めることができます。
クラスターが作成されると、管理画面上で確認することができます。
Smart Clusterの実体
Smart Clusterのオートスケール機能は、cluster-autoscalerが利用されているようです。また、ネットワーク機能は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が提供する認証を利用してダッシュボードを開くことが可能です。
kubernetes dashboardにはVMware Cloud Serviceによって認証されるため、VMware Cloud Serviceへのログインが必要です。
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リソースの利用状況を確認することが可能です。
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
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」を選択します。
ピアリング先のVPCに関する情報(アカウントID、VPC ID、VPC CIDR、VPC Region)を入力します。
Clusterのネットワークタブを確認すると、Statusが「Pending aceptance」状態になります。
AWS ConsoleのVPCダッシュボードの「ピアリング接続」で確認すると指定したVPCに対してClusterのVPCからピア接続のリクエストが承諾待ちの状態になっています。
ピア接続を承諾して、ルートテーブルにCluster向けのスタティックルートを追加します。
Clusterの管理画面ではNetworkが「Active」状態になり、クラスター上のPodから接続したVPC内のリソースへのアクセスが可能になります。