はじめに
こんにちは@sk_130と申します。
本記事は、GCPのAnthosに関する学習履歴になります。
Anthosを理解したい人に役立てばと思います。
今回の記事ではハンズオンを試したのち、EKSのクラスタを接続するところまでやってみます
今回初めてAnthosについて投稿するため、簡単にAnthosとは?をまとめた後に
実際にやったことを整理します。
Anthosとは
Anthosは、Kubernetesをベースにアプリケーションのマルチクラウド対応を実現する新サービス
Google Cloud上ではGoogle Kubernetes Engine(GKE)上で稼働し、オンプレミスではGKEオンプレミス上で稼働
さらにAWS上でも稼働予定のため、Google以外のクラウドサポートが見込まれている
つまり、GCPの統合管理サービスです。
GCP以外のクラウドサービスやオンプレサーバの一括管理ができるサービスです
個人的には統合管理できること+サービスメッシュのマネージドサービスがあることが強いと思っています
AWSもAppMeshというものがあるのですが、これとの比較もやりたいなあ
Anthos Service Mesh とは
複雑なマイクロサービス アーキテクチャ向けのフルマネージド サービス メッシュ。
マイクロサービス アーキテクチャには多くのメリットがありますが、複雑性が増す
さまざまなワークロードで断片化が起きる、といった課題もあります。
Anthos プラットフォームにより、トラフィック管理やメッシュ テレメトリ、
サービス間の通信保護に至るまで、全体的なサービス運用をシンプルにして、
運用チームや開発チームの負担を軽減します。
Anthos Service Mesh は、マイクロサービス アーキテクチャの
複雑な環境を簡単に管理し、マイクロサービスのあらゆるメリットを享受できるようにするための
Google のフルマネージド サービス メッシュです。
補足:サービスメッシュとは
ビジネス機能に沿って複数小さい「マイクロサービス」に分割し、それらを連携してアプリケーションを構築する
細かくサービスを分けることで、障害個所の発見や複数技術で対応可能、スケール・冗長化が容易
開発チームを小さくできる、サービス一つ一つが小さいため把握が容易
サービスの再利用性が高くなる などのメリットがあります。
サービスメッシュとGoogle Cloudサービスメッシュの紹介
私が思うAnthosの利点
上記のAnthos Service Mesh が特徴的だと思っています
フルマネージドでサービスメッシュが用意できる
コンソールで可視化できるので扱いやすい
公式ドキュメントも多いので、学習コストがやや低い
こんな感じで表示されます。
左側の項目にサービスメッシュがあるようにGCP側も推しているのかなと
①Anthos ハンズオンをやってみる
以下の公式のAnthosを試すをやってみる
Cloud Marketplace を使用して Google Cloud で Anthos サンプル デプロイを起動するので
ブラックボックスにはなりますが、サービスメッシュがよくわからない状態でも、どんな感じのことが
Anthosでできるのかがわかります。(上記の画像は以下のサンプル実行の結果になります)
特にはまりどころはなかったです
結構いろいろデプロイされるみたいで、月々5000円弱の費用が発生するので
確認終わったらすぐに消すのがいいと思います。
Anthosのリソースを削除したいときはDeployManagerから削除できます。
②AWS EKSとのクラスタ接続
Anthosを使う目的でもありますが、ほかクラウドサービスのサーバリソースが使えます。
ここではAWSのEKSとの連携をやってみます。
以下の記事を参考にしています。
作業1 : AWS EKSクラスタの作成
Anthosの実行のため、AWSに構築したEC2からEKSを構築しました。
(サーバの接続とかで悩まないようにしたく)
特に今回はEKSの設定もデフォルトでいいかなと思って、細かく設定を与えていません。
クラスタ作成時にインスタンスタイプや台数も決められるため、ちゃんと入れたほうがいいです
eksctlはインストール必要だと思うので以下を参考にインストールしておく
$ eksctl create cluster --name eks-anthos-2
2022-01-26 15:22:04 [ℹ] eksctl version 0.80.0
2022-01-26 15:22:04 [ℹ] using region ap-northeast-1
省略
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 13m
参考:
kubectl のインストール
eksctlのインストール
「eksctl」コマンドを使ったAmazon EKS構築入門
Amazon EKS API サーバーに接続するときに発生する「承認されていないサーバー」のエラーを解決する方法を教えてください
Amazon EKS クラスターに接続できないのはなぜですか?
作業2 : gcp Cloud SDK のインストール
AWS EC2でクラスタを立てたので、gcloudのコマンドが通るように設定する
どのぐらいの手間なのか知りたい気持ちもあって、この作業を実施
awsやazのインストールは結構簡単だったが、gcloudのCLIのインストールはちょっとめんどくさい印象を受けた
以下がとても丁寧な感じです。SDK の初期化などがひと手間多い印象。
Ubuntu 18.04 (WSL) に、Google Cloud SDK をインストールする
作業3 : サービスアカウントの払い出し
GCPにはサービスアカウントという考え方があります。
アプリに属するアカウントで、AWSでいうロールに近いですかね。
それを用意しておきます。以下の権限を付与する必要があります。
(今回はお試しのためowner付与、実は最初編集者の権限付与していてはまりました、一番下に記載)
以下の手順でjsonファイルが発行でき、そのjsonをEC2サーバにSCPしておきます
このとき、jsonファイルの位置を覚えておく必要があります(この後の手順でパス指定する必要がある)
Google Cloud Console の左上から、[IAM と管理] 次に [サービス アカウント] に移動します。
サービス アカウントを選択します。
[キー] で [鍵を追加] を選択し、新しい JSON キーを作成します。
詳しくは以下
作業4 : EKSをAnthosに接続
今回はコンソールで作業をしました。詳しくは以下参照。
EC2側でコマンド実行することでgke-connectのデプロイがされ、管理可能となります。
実行結果
$ gcloud container hub memberships register eks-anthos-2 \
> --context=省略(kubectl config current-contextの実行結果を記載) \
> --service-account-key-file=省略(サービスアカウントで払い出されたjsonファイルのパスを記載) \
> --kubeconfig=~/.kube/config \
> --project=省略
Waiting for membership to be created...
Waiting for membership to be created...done.
Created a new membership [projects/ 省略 for the cluster [eks-anthos-2]
Generating the Connect Agent manifest...
Deploying the Connect Agent on cluster [eks-anthos-2] in namespace [gke-connect]...
Deployed the Connect Agent on cluster [eks-anthos-2] in namespace [gke-connect].
Finished registering the cluster [eks-anthos-2] with the Fleet.
実行後コンソールを確認すると、登録されていた
作業5 : クラスタ認証情報を有効にするためにログインする
ログイン方法自体はいくつかあるが、今回はトークン認証でやってみる
(正確にはGoogle Cloud ID を使用したログインがうまくいかなかったため、、何か設定が足りていない?)
実行結果
$ cat <<EOF > cloud-console-reader.yaml
> kind: ClusterRole
> apiVersion: rbac.authorization.k8s.io/v1
> metadata:
> name: cloud-console-reader
> rules:
> - apiGroups: [""]
> resources: ["nodes", "persistentvolumes", "pods"]
> verbs: ["get", "list", "watch"]
> - apiGroups: ["storage.k8s.io"]
> resources: ["storageclasses"]
> verbs: ["get", "list", "watch"]
> EOF
$ kubectl apply -f cloud-console-reader.yaml
clusterrole.rbac.authorization.k8s.io/cloud-console-reader created
$ KSA_NAME=test-anthos
$ kubectl create serviceaccount ${KSA_NAME}
serviceaccount/test-anthos created
$ kubectl create clusterrolebinding r-test-anthos \
> --clusterrole view --serviceaccount default:${KSA_NAME}
clusterrolebinding.rbac.authorization.k8s.io/r-test-anthos created
$ kubectl create clusterrolebinding c-test-anthos \
> --clusterrole cloud-console-reader --serviceaccount default:${KSA_NAME}
clusterrolebinding.rbac.authorization.k8s.io/c-test-anthos created
$ SECRET_NAME=$(kubectl get serviceaccount test-anthos -o jsonpath='{$.secrets[0].name}')
$ kubectl get secret ${SECRET_NAME} -o jsonpath='{$.data.token}' | base64 --decode
eyJhbGciOiJSUzI1NiIsImtpZCI6ImV4THR2Qjc5a・・・
(省略:ここで書かれるコードをコンソール側にコピーして貼り付けするとログインできる)
払い出されたトークンを使うことで、認証完了
以下のようにサーバリソースをAnthos側で認識するようになりました
まとめ:思ったよりも時間がかかったが、慣れればなんとか?
同じようなことをAzureの統合管理サービスであるAzureArcでも実施しましたが
ほぼほぼ同じか、それ以上には時間を使った印象です。
Anthosと外部リソースの連携手順は複数ページにまたがるので、理解のしにくさはあるのかなと思ったり
【Azure】Amazon EKS をジャンプスタートを使って Azure Arc に追加してみた
おまけ:権限エラーではまった
なかなかロードが終わらないので、一度キャンセル
左のクラスタのボタンをクリックすると登録自体はされていた
が、コンソール右側でエラー表示されていた。。
ちゃんと、トラブルシューティング(ログ分析)のサイトも用意されていました
指示に従って実行
$ for ns in $(kubectl get ns -o jsonpath={.items..metadata.name} -l hub.gke.io/project); do
> echo "======= Logs $ns ======="
> kubectl logs -n $ns -l app=gke-connect-agent
> done
======= Logs gke-connect =======
2022/01/26 16:45:11.836796 dialer.go:264: dialer: dial: connecting to gkeconnect.googleapis.com:443...
2022/01/26 16:45:11.902945 dialer.go:275: dialer: dial: connected to gkeconnect.googleapis.com:443
2022/01/26 16:45:11.902964 tunnel.go:324: serve: opening egress stream...
2022/01/26 16:45:11.903016 tunnel.go:332: serve: registering project_number="省略", connection_id="eks-anthos-2" connection_class="DEFAULT" agent_version="20220121-01-00" ...
2022/01/26 16:45:11.903048 dialer.go:225: Dial successful, current connections: 1
2022/01/26 16:45:12.283225 tunnel.go:381: serve: recv error: rpc error: code = PermissionDenied desc = The caller does not have permission
2022/01/26 16:45:12.283345 dialer.go:277: dialer: dial: connection to gkeconnect.googleapis.com:443 failed after 446.538427ms: serve: receive request failed: rpc error: code = PermissionDenied desc = The caller does not have permission
2022/01/26 16:45:12.312498 dialer.go:207: dialer: connection done: serve: receive request failed: rpc error: code = PermissionDenied desc = The caller does not have permission
2022/01/26 16:45:12.312554 dialer.go:295: dialer: backoff: 1m2.4659913s
E0126 16:45:33.996364 1 reflector.go:131] third_party/golang/kubeclient/tools/cache/reflector.go:99: Failed to list *unstructured.Unstructured: the server could not find the requested resource
実行した結果、PermissionDenied エラーであることがわかりました。
サービスアカウントの権限を強くすることで解決しました。
結構親切でした。