Fargate for EKSでチュートリアル「Kubernetesダッシュボードのデプロイ」を試してみた
みなさん、こんにちは!
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プロファイルでは、default
と kube-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を作成します。
まず、マニフェストを作成します。
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で実行できるか試していきたいと思います。