virtual-kubeletをAWS Fargateで試してみた
現在開催中のJapan Container Days 1812の基調講演でvirtual-kubeletなるプロダクトを聞いたので、サクッと試してみました。
virtual-kubeletとは
Kubernetesにおけるkubeletの実装の一つで、podの作成先を他のプラットフォームのAPIに依頼することができるとのこと。これによって、AzureのACIやAWSのFargateなどのサーバレスフレームワークをKubernetesと連携、Kubernetes側で操作できるようになります。
今回の前提条件
以下の環境を前提に解説します。
- AWS Fargateクラスタ
- 最低でもMasterノードをデプロイしたKubernetesクラスタ
- virtual-kubeletを動作させるためのVM (OS: CentOS7)
Get Started!
まず、virtual-kubeletを動作させるVMにGoとawscliを導入します。この導入手順は割愛します。
次にvirtual-kubeletのバイナリをビルドします。
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/
続いてvirtual-kubeletのprovider設定ファイルを作ります。
mkdir -p /etc/kubernetes/ cp providers/aws/fargate.toml /etc/kubernetes/ cat <<EOF > /etc/kubernetes/fargate.toml Region = "<Fargateクラスタのあるリージョン>" ClusterName = "<Fargateクラスタの名前>" Subnets = [<Fargateクラスタの所属するサブネットのカンマ区切りのリスト>] SecurityGroups = ["<タスクにアタッチしたいSG>"] AssignPublicIPv4Address = true ExecutionRoleArn = "" CloudWatchLogGroupName = "" PlatformVersion = "LATEST" OperatingSystem = "Linux" CPU = "20" Memory = "40Gi" Pods = "20" EOF
virtual-kubeletがKubernetesのマスターに接続するためのkubeconfigをここで作成します。
cat <<EOF > /etc/kubernetes/virtual-kubelet.conf <kubeconfigの中身> EOF
最後にsystemdのunitファイルと環境変数ファイルを作ります。
cat <<EOF > /etc/sysconfig/virtual-kubelet # provider name (required) PROVIDER_NAME="aws" # provider config file path (required) PROVIDER_CONFIG="/etc/kubernetes/fargate.toml" # virtual-kubelet port (required) KUBELET_PORT=10250 # other options OPTIONS="--kubeconfig=/etc/kubernetes/virtual-kubelet.conf" EOF cat <<EOF > /usr/lib/systemd/system/virtual-kubelet.service [Unit] Description=Virtual Kubelet [Service] User=root EnvironmentFile=-/etc/sysconfig/virtual-kubelet ExecStart=/usr/bin/virtual-kubelet --provider \$PROVIDER_NAME --provider-config \$PROVIDER_CONFIG \$OPTIONS [Install] WantedBy=multi-user.target EOF
最後にvirtual-kubeletサービスを有効化します。
systemctl daemon-reload systemctl enable virtual-kubelet systemctl start virtual-kubelet
以上で、Kubernetesにvirtual-kubeletというノード名のノードが追加されているはずです。
kubectl get node NAME STATUS ROLES AGE VERSION test-k8s-zpo7woffkomq-master-0 Ready,SchedulingDisabled <none> 11h v1.11.1 test-k8s-zpo7woffkomq-minion-0 Ready <none> 11h v1.11.1 virtual-kubelet Ready agent 9h v1.11.2
試しにvirtual-kubeletでPodが起動するようなDeploymentを作ってみます。
cat <<EOF | kubectl apply -f - apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: httpd name: httpd namespace: default spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: httpd strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: creationTimestamp: null labels: app: httpd spec: containers: - image: httpd imagePullPolicy: Always name: httpd resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 nodeSelector: kubernetes.io/role: agent beta.kubernetes.io/os: linux type: virtual-kubelet tolerations: - key: virtual-kubelet.io/provider operator: Exists - key: azure.com/aci effect: NoSchedule EOF
しばらくするとPodがRunning
になります。
kubectl get pod NAME READY STATUS RESTARTS AGE httpd-7b5896b895-45zh6 1/1 Running 0 44s
Fargate側を確認すると、タスクが起動していることがわかります!