こんにちは、クラウド事業部の中根です。
Kubernetes未経験だったのですが、業務で利用することになり予習することになりました。
監視ダッシュボード作成という題材をいただいたので、チャレンジしてみました。
自身の備忘録も兼ねて、共有させていただきます。
作業環境の準備
コマンド実行環境作成
CloudShellなど、お好みのコマンド実行環境を作成してください。
今回は再現性重視で、Cloud9で実行します。
名前だけ任意で決め、あとはデフォルトの設定で作成しました。
IAMロールの作成とアタッチ
※Cloud9以外でコマンド実行する方は飛ばしてください
デフォルトのIAM権限だと不十分なので、専用のIAMロールを作成します。
IAMのサービス画面を開き、「ロールを作成」を押下します。
以下の設定をして「次へ」を押下します。
・信頼されたエンティティタイプ:AWSのサービス
・ユースケース:EC2 -> EC2
検索欄に、「AdministratorAccess」 と入力し、AdministratorAccessポリシーにチェックを入れて、「次へ」を押下します。
注意:ここでは簡潔にするためにAdministratorAccess を付与していますが、実運用をする場合は最小権限にします。
ロール名を入力して、「ロールを作成」を押下します。
作成できたら、EC2のサービス画面を開き、インスタンス画面に遷移します。
検索欄に「aws-cloud9」 と入力します。
「aws-cloud9-<作成したCloud9環境名>」で始まるインスタンスを選択し、右上の「アクション」-> 「セキュリティ」 -> 「IAMロールを変更」を押下します。
作成したIAMロールに変更し、「IAMロールの更新」を押下します。
Cloud9コンソールの設定
Cloud9の接続画面に移ります。
右上の歯車マークを押下し、Preferences画面を開きます。
左メニューから、「AWS Settings」 -> 「Credentials」と進み、×にします。
以降、画面下のターミナルを中心に操作していきます。
下記コマンドを実行し、リージョンの設定をしておきます。
AWS_REGION="ap-northeast-1" aws configure set region ${AWS_REGION}
下記コマンドを実行し、先ほどアタッチしたIAMロールが使用されていることを確認します。
EKSクラスター、アプリの構築
各種ツールのインストール
コマンド実行環境に、各種ツールをインストールしていきます。
eksctl
curl -L "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp sudo mv /tmp/eksctl /usr/local/bin
kubectl
※使いたいバージョンに応じてコマンドが変わります。
特定のバージョンを使用したい場合は、ドキュメントを参照し、最初のcurlコマンドを書き換えてください。
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.28.5/2024-01-04/bin/linux/amd64/kubectl chmod +x ./kubectl mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
ここからは便利ツールなので、任意です。
コマンド補完(eksctl、kubectl)
kubectl completion bash > kubectl_completion sudo mv kubectl_completion /etc/bash_completion.d/kubectl eksctl completion bash > eksctl_completion sudo mv eksctl_completion /etc/bash_completion.d/eksctl
kube-ps1
今自分がどのcontext/namespaceで作業しているのかが、ターミナルのプロンプトに表示されます。
いちいちコマンドで確認する手間が省けます。
git clone https://github.com/jonmosco/kube-ps1.git ~/.kube-ps1 cat <<"EOT" >> ~/.bashrc source ~/.kube-ps1/kube-ps1.sh function get_cluster_short() { echo "$1" | cut -d . -f1 } KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short KUBE_PS1_SUFFIX=') ' PS1='$(kube_ps1)'$PS1 EOT
kubectx & kubens
context、namespaceの切り替えコマンドは、デフォルトだと割と長くなります。
これを使うことで短くなり、少し楽になります。
git clone https://github.com/ahmetb/kubectx.git ~/.kubectx sudo ln -sf ~/.kubectx/completion/kubens.bash /etc/bash_completion.d/kubens sudo ln -sf ~/.kubectx/completion/kubectx.bash /etc/bash_completion.d/kubectx cat <<"EOT" >> ~/.bashrc export PATH=~/.kubectx:$PATH EOT
導入したツールを有効化します。
. ~/.bashrc . /etc/profile.d/bash_completion.sh . /etc/bash_completion.d/kubectl . /etc/bash_completion.d/eksctl
クラスターの作成
いよいよ、クラスターを作成してみます。
AWS_REGION=$(aws configure get region) eksctl create cluster \ --name=eks-test \ --version 1.28 \ --nodes=3 --managed \ --region ${AWS_REGION} --zones ${AWS_REGION}a,${AWS_REGION}c
しばらく待ちます。(15分程度)
こんな感じで表示されたらOKです。
クラスターの起動を確認します。
eksctl get cluster
ノードの起動を確認します。
kubectl get node
ステータスがReadyになっていればOKです。
サンプルアプリケーションをデプロイ
作業用のディレクトリとnamespaceを作ります。
mkdir -p ~/environment/manifests/ cd ~/environment/manifests/ kubectl create namespace sample kubens sample # kubensを導入していない方は「kubectl config」コマンドで設定してください。
「~/environment/manifests/」ディレクトリにマニフェストを格納していきます。
ChatGPTにマニフェストを作ってもらいました。
ファイル名は自由ですが、ここでは「sample-deployment.yaml」にしました。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 # Podのレプリカ数を2に設定 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
以下のコマンドでデプロイします。
kubectl apply -f ~/environment/manifests/sample-deployment.yaml
作成したDeploymentとPodがRunningになっていることを確認します。
なっていない場合は、少し待ってから確認してみてください。(1分程度)
kubectl get deployment kubectl get pod
続いて、Serviceを作成します。(ファイル名「sample-service.yaml」)
apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: LoadBalancer ports: - port: 80 targetPort: 80 protocol: TCP selector: app: nginx
ファイルを作成したら、サービスもデプロイします。
kubectl apply -f ~/environment/manifests/sample-service.yaml
serviceも起動確認します。
kubectl get service
このコマンドで出力されたEXTERNAL-IPで、作成したアプリケーション(nginx)にアクセスできます。
ロードバランサーがアクティブになるまでは、アクセスできないことに注意してください。
監視システムの構築
Helmを導入
Helm をインストールします。
Helmは、Kubernetesのパッケージマネージャーです。
一応無くても構築はできますが、これを使うと非常に簡単に構築ができます!
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh source <(helm completion bash)
Prometheusのインストール
Prometheusは、監視・アラート通知ツールです。
クラスター内のPod等のパフォーマンスをリアルタイムで収集分析してくれます。
以下のコマンドを実行します。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install my-prometheus prometheus-community/kube-prometheus-stack
フリーズしたように見えますが、少し待つと、以下のような出力がされます。 インストール後の案内に従って、起動確認もしておきましょう。
Grafanaのインストール
Grafanaは、可視化ツールです。
Prometheusで収集したデータをいい感じに見せてくれます。
以下のコマンドを実行します。
helm repo add grafana https://grafana.github.io/helm-charts helm repo update helm install my-grafana grafana/grafana \ --set service.type=LoadBalancer
以下のような出力がされるので、コマンドを順番に実行します。
まずは1.のコマンドです。
出てきた文字列は、Grafanaへの初期ログインパスワードになります。
kubectl get secret --namespace sample my-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
続いて、2.のコマンドですが、そのまま実行してもうまくいかないと思います。
最後の「ip」を「hostname」にして実行してください。
export SERVICE_IP=$(kubectl get svc --namespace sample my-grafana -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
最後に、GrafanaへログインするためのURLを出力します。
echo http://$SERVICE_IP:80
でてきたURLにアクセスすると、Grafanaのログイン画面が表示されます!
こちらもアクセスできるまで少し時間がかかります。
接続できない場合は以下のコマンドで、my-grafana-XXXのPodがRunningになっていることを確認しましょう。
kubectl get pods
usernameに”admin”、Passwordは、先ほど”kubectl get secret”コマンドで出てきた文字列を入力すると、ログインできます。
ログイン出来たら、左メニュー → Connections → Data sourcesを選択し、”Add data source”ボタンを押下
prometheusを検索し、選択します。
ConnectionにPrometheusへのURLを入力します。
URLのIPアドレス部は、以下のコマンドで確認できます。
kubectl get svc
表示された中から、NAMEの末尾が「kube-prometh-prometheus」をなっている行の、CLUSTER-IPです。
同じ名前で進めていれば、「my-prometheus-kube-prometh-prometheus」の行です。
一番下にスクロールし、Save & Testボタンを押下し、”Successfully queried the Prometheus API.”と出てくればOKです!
ダッシュボードを作ってみる
左メニュー → Dashboards → Create Dashboad → import dashboardと進んでいきます。
今回はGrafana Labsのダッシュボードをつかってみます。
Kubernetes Clusterにアクセスします。
「Copy ID to clipboard」を押下し、ダッシュボードのIDをコピーします。
コピーしたIDを入力し、「Load」します。
データソースには先ほど作成したものを選択し、「Import」を押下します。
一瞬でおしゃれなダッシュボードができました!
自分でカスタマイズしたり、1から作り上げていくこともできます!
お掃除
このままだと料金がかかってしまうので、リソースの削除を行います。
EKS
kubectl delete namespace sample
少し時間がかかります。(1,2分)
eksctl delete cluster --name eks-test
途中で失敗しているときがあるので、CloudFormation上から”eksctl-eks-test-XXX”スタックがすべて削除されていることを確認しましょう。
Cloud9
環境を選択して削除します。
IAMロール
Cloud9にアタッチしていたIAMロールも削除しておきます。