Fargate for EKSでチュートリアル「Kubernetesダッシュボードのデプロイ」を試してみた

「Fargate for EKS」を使用して、AWSドキュメントに用意されているチュートリアル「Kubernetesダッシュボードのデプロイ」を試してみました。
2020.03.16

みなさん、こんにちは!
AWS事業本部の青柳@福岡オフィスです。

re:Invent 2019で発表された「Fargate for EKS」を使って、AWSドキュメントに用意されているチュートリアルを試してみました。

チュートリアル: Kubernetes ウェブ UI (ダッシュボード) のデプロイ - Amazon EKS

ほぼほぼチュートリアルの手順通りに進めることができましたが、1点だけ注意すべき点がありました。
以下の流れの中でご説明します。

Kubernetesダッシュボードのデプロイ

準備

各種ツールを最新に更新しておきます。
今回使用したのは以下のバージョンです。

$ eksctl version
0.15.0

$ aws --version
aws-cli/1.18.21 Python/3.6.7 Linux/4.4.0-18362-Microsoft botocore/1.15.21

$ kubectl version --client --short
Client Version: v1.17.0

eksctl を使ってEKSクラスター環境を作成します。

$ eksctl create cluster \
    --name eks-test \
    --fargate

--fargate オプションを付けることで、PodをFargateで実行するために必要な「Fargateプロファイル」が作成されます。
また、--node-type などの「ノードグループ」関連のオプションを指定していませんので、EC2インスタンスベースのワーカーノードは作成されません。

つまり、完全にFargateのみのEKSクラスターとなります。

ステップ1: Kubernetesメトリクスサーバーをデプロイする

ダッシュボードを作成する前に、クラスター内のリソース使用状況データを集約するコンポーネントである「Kubernetesメトリクスサーバー」をEKSクラスター上にデプロイします。

まず、メトリクスサーバーのダウンロードURLと最新バージョン番号を取得します。

$ DOWNLOAD_URL=$(curl -Ls "https://api.github.com/repos/kubernetes-incubator/metrics-server/releases/latest" | jq -r .tarball_url)
$ DOWNLOAD_VERSION=$(grep -o '[^/v]*$' <<< $DOWNLOAD_URL)

問題なく取得できていれば、各シェル変数には以下のような値が格納されているはずです。

$ echo $DOWNLOAD_URL
https://api.github.com/repos/kubernetes-sigs/metrics-server/tarball/v0.3.6

$ echo $DOWNLOAD_VERSION
0.3.6

これらの情報を使って、メトリクスサーバーのデプロイに必要なファイル群をダウンロードします。

$ curl -Ls $DOWNLOAD_URL -o metrics-server-$DOWNLOAD_VERSION.tar.gz
$ mkdir metrics-server-$DOWNLOAD_VERSION
$ tar -xzf metrics-server-$DOWNLOAD_VERSION.tar.gz --directory metrics-server-$DOWNLOAD_VERSION --strip-components 1

カレントディレクトリに metrics-server-0.3.6 というディレクトリが作成されます。

このディレクトリ内の deploy/1.8+/ 配下に、各種リソースをデプロイするマニフェスト (YAMLファイル) が格納されています。

kubectl apply コマンドを使ってリソースを一気にデプロイします。

$ kubectl apply -f metrics-server-$DOWNLOAD_VERSION/deploy/1.8+/
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created

Namespace kube-system に、メトリクスサーバーのDeploymentがデプロイされ、Podが実行されていることを確認します。

$ kubectl get deployments metrics-server -n kube-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
metrics-server   1/1     1            1           61s

$ kubectl get pods -n kube-system -o wide
NAME                              READY   STATUS    RESTARTS   AGE    IP                NODE                                                         NOMINATED NODE   READINESS GATES
coredns-d784dc748-n4wkm           1/1     Running   0          19m    192.168.106.207   fargate-ip-192-168-106-207.ap-northeast-1.compute.internal   <none>           <none>
coredns-d784dc748-zbjz8           1/1     Running   0          19m    192.168.143.252   fargate-ip-192-168-143-252.ap-northeast-1.compute.internal   <none>           <none>
metrics-server-7fcf9cc98b-7hwmm   1/1     Running   0          103s   192.168.141.9     fargate-ip-192-168-141-9.ap-northeast-1.compute.internal     <none>           <none>

(codredns は、EKSクラスター作成時に自動的にデプロイされるCoreDNSのPodです)

ステップ2: Kubernetesダッシュボードのデプロイ

続いて「Kubernetesダッシュボード」をデプロイします。

「Fargate for EKS」の場合に必要な追加手順

Fargate for EKSの場合、ダッシュボードをデプロイする前に1つ準備が必要です。

Kubernetesダッシュボードは、デフォルトでは kubernetes-dashboard というNamespaceを作成して、そこにデプロイされます。

一方、標準のFargateプロファイルでは、defaultkube-system というNamespaceのみが対象に指定されています。
そのため、Namespace kubernetes-dashboard を指定してPodをデプロイしようとしてもFargateで実行してくれません。
(今回のようにワーカーノードが無いクラスターである場合、行き場のないPodとなってしまい「Pending」状態となってしまいます)

そこで、Namespace kubernetes-dashboard を対象とするFargateプロファイルを追加で作成することにします。

$ eksctl create fargateprofile \
    --name fp-kubernetes-dashboard \
    --namespace kubernetes-dashboard \
    --cluster eks-test

これでKubernetesダッシュボードをFargateにデプロイする準備ができました。

ダッシュボードをデプロイする

GitHubリポジトリにあるマニフェストを直接指定して kubectl apply コマンドを実行します。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc6/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

Namespace kubernetes-dashboard に、ダッシュボードのDeploymentがデプロイされ、Podが実行されていることを確認します。

$ kubectl get deployments -n kubernetes-dashboard
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
dashboard-metrics-scraper   1/1     1            1           78s
kubernetes-dashboard        1/1     1            1           78s

$ kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-6f7544dfb7-sgrqv   1/1     Running   0          87s
kubernetes-dashboard-9bc465948-nh58v         1/1     Running   0          87s

ステップ3: eks-adminサービスアカウントおよびクラスターロールバインディングの作成

ダッシュボードへのアクセスは、役割ベースのアクセス制御 (RBAC) で管理されています。

アクセスするために必要となるServiceAccountとClusterRoleBindingを作成します。

まず、マニフェストを作成します。

eks-admin-service-account.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: eks-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: eks-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: eks-admin
  namespace: kube-system
EOF

マニフェストを適用します。

$ kubectl apply -f eks-admin-service-account.yaml
serviceaccount/eks-admin created
clusterrolebinding.rbac.authorization.k8s.io/eks-admin created

ステップ4: ダッシュボードに接続する

ServiceAccount eks-admin の認証トークンを取り出します。

$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')
Name:         eks-admin-token-x57hp
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: eks-admin
              kubernetes.io/service-account.uid: 8aa27641-660d-11ea-92db-0653a7a223c4

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      <<トークンが表示されます>>

ダッシュボードのエンドポイントはプライベートサブネット側に用意されているため、直接アクセスすることができません。

kubectl proxy コマンドを実行することにより、Kuberbetes APIエンドポイント経由でダッシュボードへアクセスできるようにします。

kubectl proxy

Webブラウザで以下のURLへアクセスします。

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

ダッシュボードのログイン画面が表示されます。
「トークン」を選択して、前の手順で取得したトークン文字列を貼り付けます。

ダッシュボードが表示されました!

KubernetesダッシュボードはKubernetesの各種リソースの状態をモニタリングすることができますが、その他に、簡易的ではありますがリソースの作成なども行えます。

画面右上の「+」をクリックしてみます。

この画面からDeploymentを作成することができます。

「ポッド」メニューで、Deploymentから起動されたPodの一覧を確認することができます。

また、「クラスター」→「ノード」を選択すると、Podを実行するために起動されたFargateの一覧を確認することができます。

さきほど起動したPodの他に、ダッシュボードやメトリクスサーバーのPodを実行しているFargateも表示されています。

おわりに

従来のワーカーノードを使ったEKSを前提としたチュートリアルやサンプルは、今回のように少しの変更でFargate for EKSに適用できる場合もあれば、大幅な変更が必要だったり、そもそもFargate for EKSには適用てきない場合もあります。

他のチュートリアルやサンプルについても、Fargate for EKSで実行できるか試していきたいと思います。