概要
Virtual Kubelet (以降VK)とは MicrosoftがOSSとして開発しているもので、Kubernetesクラスタ外のプラットフォームに対してAPI通信することで仮想的にクラスタ内部にあるかのうように管理できるKubeletを拡張した機能です。
発音としてはバーチャルキューブレットと言っている人が多いようです。
2018年12月にCNCFのSandbox Projectsに加わったことで注目が集まっています。
現在は開発途上のため、プロダクション環境での利用は非推奨です。
嬉しいこと
メリットは大きく3つあると思います。
-
VKの開発者は「ユーザがハードウェアの管理からの開放される」ことが最も大きいメリットと言っています。
例えば、Kubernetesクラスタを運用していて、一時的にリソースの拡張が必要になった時、VKを利用すれば AWS Fargate・Azure Container Instances・AliCloudなどを利用して必要な分だけリソースを拡張することができます。 -
KubernetesのIoTへの応用です。
IoTデバイスはkubeletを動作させられるほどのリソースを持っていないことが多いです。そのような機器にAPIで通信するだけでKubernetesから操作できるようになるというのは大きなメリットになると言えます。実際、MicrosoftはVKのIoTへの応用を考えているようです。 -
これは個人的な意見ですが、一つのKubernetesクラスタから複数のクラウドベンダーに接続することができるようになることで、クラウドベンダーにロックインされなくなるというのも大きなメリットであると思います。
仕組み
KubernetesクラスタにVKのPodがあり、そのPodはKubernetesからはNodeとしても認識されます。そのPod兼Nodeが外部環境とAPI通信をすることでクラスタ外のプラットフォームと接続することができるようになっています。
また、現在はproviderとして連携できるのは以下の通りですが、今後更に増えていくことが予想されます。(クラウドプロバイダーだけでなくVMwareなども対応していくと個人的には嬉しいです。)
providerを個人で作成することもそこまで難しくはないそうです。
- Alibaba Cloud ECI Provider
- Azure Container Instances Provider
- AWS Fargate Provider
- Hyper.sh Provider
- Service Fabric Mesh Provider
実際に使ってみる
※ VKは現在開発段階のものなのでプロダクション環境での利用は非推奨です。
必要な環境
以下の環境が既にある前提で進めます。
- Kubernetesクラスタ
- kubectlコマンド
- Go動作環境(VKはgoで書かれてます)
- Worker NodeにECSFullAccess権限が付与済み
VKのインストール
以下の通り実行すればVKコマンドのインストールは完了です。
複雑なことはやっていないので説明は省略します。
export GOPATH=$HOME/go
mkdir -p $GOPATH/src/github.com/virtual-kubelet
cd $GOPATH/src/github.com/virtual-kubelet
git clone https://github.com/virtual-kubelet/virtual-kubelet
cd virtual-kubelet
make build
mv bin/virtual-kubelet /usr/bin/
※ t2.microではmake build
でrun time errorによりbuildできませんでした。
設定変更
mkdir -p /etc/kubernetes/
cp providers/aws/fargate.toml /etc/kubernetes/
fargate.tomlの必要な部分を書き換えます。
Region = "ap-northeast-1(Fargateクラスタのリージョン)"
ClusterName = "virtual-kubelet-test(Fargateクラスタの名前。指定した名前がなければ作成されます。)"
Subnets = "subnet-1234(Fargateクラスタの所属するサブネット)"
SecurityGroups = "sg-1234(アタッチするSG)"
AssignPublicIPv4Address = true
ExecutionRoleArn = ""
CloudWatchLogGroupName = ""
PlatformVersion = "LATEST"
OperatingSystem = "Linux"
CPU = "20"
Memory = "40Gi"
Pods = "20"
VKの起動
kubelet port の設定(デフォルトでは10250
ですが変更している方は適宜変更してください)
export KUBELET_PORT="10250"
fargate.tomlがあるディレクトリで以下のコマンドを実行
virtual-kubelet --provider aws --provider-config fargate.toml --namespace all
コマンド実行後、以下の通りnodeにvirtual-kubeletがあることが確認できます。
また、AWS Fargate の画面でも指定したクラスタの名前でクラスタが作成されていることが確認できます。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-10-0-1-172.ap-northeast-1.compute.internal Ready controlplane,etcd,worker 5m v1.12.3
ip-10-0-1-177.ap-northeast-1.compute.internal Ready worker 3m v1.12.3
ip-10-0-1-57.ap-northeast-1.compute.internal Ready worker 4m v1.12.3
virtual-kubelet Ready agent 6s v1.11.2
デプロイテスト
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
name: http
protocol: TCP
- containerPort: 443
name: https
dnsPolicy: ClusterFirst
nodeSelector:
kubernetes.io/role: agent
beta.kubernetes.io/os: linux
type: virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Exists
正常に実行できていれば以下の通りpodsがデプロイされていることが確認できます。
また、AWS Fargateの画面でも指定したクラスタにデプロイされていることが確認できます。
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 38s
以上。
参考
公式GitHub
AWS Open Source Blog - Running AWS Fargate with virtual-kubelet