LoginSignup
1

More than 1 year has passed since last update.

GCP AnthosでAWS EKSを管理する

Last updated at Posted at 2022-01-26

はじめに

こんにちは@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.PNG

Anthos2.PNG

①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のデプロイがされ、管理可能となります。

スクリーンショット 2022-01-27 003813.png

実行結果

$ 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.

実行後コンソールを確認すると、登録されていた

スクリーンショット 2022-01-27 020005.png

作業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側で認識するようになりました

スクリーンショット 2022-01-27 021520.png

まとめ:思ったよりも時間がかかったが、慣れればなんとか?

同じようなことをAzureの統合管理サービスであるAzureArcでも実施しましたが
ほぼほぼ同じか、それ以上には時間を使った印象です。
Anthosと外部リソースの連携手順は複数ページにまたがるので、理解のしにくさはあるのかなと思ったり
【Azure】Amazon EKS をジャンプスタートを使って Azure Arc に追加してみた

おまけ:権限エラーではまった

なかなかロードが終わらないので、一度キャンセル

スクリーンショット 2022-01-27 014013.png

左のクラスタのボタンをクリックすると登録自体はされていた
が、コンソール右側でエラー表示されていた。。

スクリーンショット 2022-01-27 015145.png

ちゃんと、トラブルシューティング(ログ分析)のサイトも用意されていました

指示に従って実行

$ 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 エラーであることがわかりました。
サービスアカウントの権限を強くすることで解決しました。
結構親切でした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1