让我们尝试使用Terraform + Ansible在GCE上进行『自主管理的Kubernetes』配置

这篇文章是关于使用Terraform + Ansible来半自动地建立Google Compute Engine (GCE)上的Self-managed Kubernetes的配置,作为Project Calico的示例。

虽然已经有很多关于使用Ansible构建k8s集群的文章,并且也有一个很棒的工具叫做kubespray可供准备。但是多数文章都是关于在树莓派上构建集群的,很少有关于在GCP上手动创建集群的情况。因此,我决定挑战自己尝试搭建集群。

    (自分も、Raspberry piでの構築をしてみたかったのですが、Raspberry piの在庫切れで手に入らず、、、。)

简而言之

以下为最终代码:
– HirokiYoshida837/k8s-gcp-tf:使用Terraform在GCP上部署k8s集群的基础设施。
– HirokiYoshida837/k8s-kubeadm-ansible:使用Ansible和kubeadm设置k8s集群。

构图如下图所示。

Frame 1.png

1. 在Terraform中进行基础设施建设。

这一次我们只是为了学习而进行,按照以下方针进行构建。

    • 手元の開発用PCから terraform plan -> terraform apply まで行う

 

    • tfstateの保存も手元のPC内とする

Terraform Provisioners は使用せず、インフラ構築の範囲に留める。インスタンス自体のプロビジョニングはAnsibleで行う

在Terraform中,主要需要准备的基础设施如下所示。您可以根据自己的喜好适当选择操作系统、实例大小、数量和区域等参数。

    • VPC、VPCサブネット

 

    • Kubernetesクラスタ用ホスト

controller node 1台 (今回はHA構成にはしない)
worker node 2台

Ansible実行用ホスト
Ansible実行用のService Account

以下是使用这些策略创建的terraform文件。

    HirokiYoshida837/k8s-gcp-tf: Provisioning k8s cluster’s infrastructure on GCP with Terraform

请创建并执行一个拥有必要权限的服务账户。

使用Ansible和kubeadm来构建k8s集群。

这次我们将根据以下的方针来构建集群。

    • Ansibleを実行するホストは、GCP内のサーバー(クラスタとは別サブネット)

 

    • Ansible実行用/対象ホストへのSSH接続はServiceAccountを使う

 

    • GCPのDynamic Inventory等は使用しない(将来的にはRaspberry Piで同じことがしたかったので、環境によらないPlaybookとしたかった)

 

    CRIはDockerを使用する(特に理由はないので、好きなものに変更してもOK。今後を考えるとcri-oの方がよいと思う。)

因此,我创建的Playbook文件在这里。

    HirokiYoshida837/k8s-kubeadm-ansible: setup k8s cluster’s with Ansible nad kubeadm

尝试运行应用程序。

只需使用适当的部署方式创建并运行服务就可以了。请随意尝试。

注意事项和未来的任务

关于Terraform的相关事项

Terraformのファイル・ディレクトリ構成が難しい。

モジュールは今回は大きく、 IAM関連、 VM関連、 VPC関連として分割してみた。どういう分け方にするのかはビジネスモデルに合わせて考えるべきなのかもしれない。
モジュールの分割、依存関係(各モジュールファイルからのoutput等)がいまいち理解できず苦労した。
Files and Directories – Configuration Language | Terraform by HashiCorp

terraform plan, terraform apply の実行環境を整備したい

実際は terraform plan内容のレビューや diff確認を GitHubのPR上等ですべき。
今回は適当に手元で実行するようにしていたが、CI/CDのpipelineの中でCloud Build内で terraformを実行する例はかなり良かった。
参考資料
Terraform、Cloud Build、GitOps を使用してインフラストラクチャをコードとして管理する  |  Cloud アーキテクチャ センター  |  Google Cloud
TerraformとCloud BuildでGCP向けのIaC環境を作成してみた

相关的面面俱到

Terraform provisionersとAnsible

公式ドキュメントにもあるように、provisionersは最終的な手段であり、できるだけ使うべきではない。管理が複雑になりIaCで大切な冪等性が確保しづらい。
Provisioners | Terraform by HashiCorp

kubesprayの存在

今回のようにAnsibleでk8sクラスタを構築する方法自体は
kubespray自体がAnsible + kubeadmでのk8sクラスタ構築になっている。(過去はkubeadmを使用していなかったが、v2.3 以降からは使用するように変更されている)
オプションとして指定できる項目も豊富であり、内部のAnsible-Playbookの内容もかなり参考になる。
Caclicoでのネットワークはデフォルトではフルメッシュだが、もroute reflectorsを使用した形式も指定可能。
CNIもFlannel, Calicoが選択可能、ランタイムも 指定可能。HA構成の指定も可能であり、k8s、Ansible自体にそれなりの知見があれば非常に強力。
kubernetes-sigs/kubespray: Deploy a Production Ready Kubernetes Cluster

Ansible-Playbookの自動テスト・CI

Ansibleの学習は、こちらを参考にした。 : インフラCI実践ガイド Ansible/GitLabを使ったインフラ改善サイクルの実現

書籍の中ではPlaybook自体の自動テスト、継続メンテナンスについても触れられている。今回はここまでの整備は実施しなかったが、是非試してみたい。
kubeadmでの構築に関しては、kubesprayのリポジトリの内容自体も大きく参考になる。

Cloud-initとAnsible、初期プロビジョニングの境界

資料を探していると、k8sクラスタ用のセットアップをcloud-initを用いて実施している人もいた。
今回Ansibleで行った初期プロビジョニング自体はcloud-initでも問題なくできそう。 (kubeadm join以前の設定類)
同じインスタンスを継続して管理したい、冪等性を重視したい、等を考慮しながら、適宜作業内容によってcloud-initとAnsibleを使い分けるのが良いのかもしれない。
クラウド環境等であればPacker等で初期イメージを作成して使い回すほうが良さそうにはみえる。workerのkubeletアップデートが必要になった場合、既存のインスタンスをアップデートするのではなく、新しいイメージを作成し、そこから起動 -> kubeadm join -> 古いインスタンスを停止、とすれば比較的安全にできそう。イメージ自体を使い回せるので事前検証も十分にできるはず。

shell/command moduleが必要になる場合の冪等性の確保

参考にした資料の中には、各種設定の変更などを sed を使ってゴリゴリにやってる人もいた。
何度Ansible-Playbookを実行しても結果が変わらないようにする工夫が必要。
kubeadmの操作自体はshell/commandモジュールから操作する必要がありそうなので、工夫しないと冪等性(厳密には違う気がするけど)が確保できない。

Kubernetes相关

kubeadmでのクラスタ構築は意外と簡単

手順にしたがってそのままやるだけなら、ある程度の知識があれば超簡単。k8s公式にもドキュメントがある。
kubernetesの各コンポーネントや、周辺環境についての知識はある程度得られるはず。
実はminikube も内部ではkubeadmを使用している。
より詳しく学びたい、より愛着を持ったクラスタにしたいのであれば、kubernetes-the-hard-wayをやってみよう。

クラスタ自体の管理・アップグレードが厳しそう

各種のトラブルシューティング必要になるので、手ですべて管理するのは厳しそう。(経験しないとトラブルシューティングはできるようにならないと思うが、、、)
どんなものに対しても言えることだが、仮に業務で使うことになる場合、十分に調査してから、構成を検討し、根気よくメンテナンス・情報収集していくことが大事そう。
Kubeadmによるクラスタアップグレード・その光と闇 – Speaker Deck

アプリケーションのデプロイ、管理

今回はサンプルレベルのアプリケーションのデプロイで終わった。
早く自宅でKubernetesクラスタを構築してHelmの使用、ArgoCDの導入までやってウキウキになりたい。

構築したkubernetesクラスタ自体の管理や監視はどうするのか

複数のk8sクラスタがお互いに監視しあう構成の記事を見かけて、非常に面白かった。
セルフホスティングなので管理・監視の手間が増えることを考えると、マネージド・サービスの力強さを改めて感じる。

HA構成について

今回はシングルControllerなので、明らかに単一障害点。
controller はHA構成にしても良かったと思う。この場合は Hostの台数を奇数(etcdの分散合意を機能させるため)にするべき、など色々考慮が必要そう。

谷歌云平台相关

Ansibleを実行するホストから他のホストへどう接続するかにかなり悩んだ。

GCPのコンソール画面上から、自分のアカウントでSSH -> 他ホストにSSHでjumpみたいなことを試したりしたが、エラーが出ることがありハマった。
コンソール画面から入るときにつかうSSHキーの期限は5分ほどなので、一時的に他のホストにはいれてしまうのが問題だった。最終的に、プロジェクトのsshキーを使用しないように設定変更してSAのOS Loginで接続するようにした。この辺りがややこしかった。インスタンス自体に権限を与えたほうが良かったもしれない。この辺りは詳しい人に相談してみたい。
Cloud-initでユーザ作成などをやればよかったかも。

SAの鍵を GCP Secret Manager にいれてTerraform実行ホストから渡す、みたいなことをしてみた。

適切なやり方なのかは十分に調べられていない。

总结

虽然我并没有做什么特别新颖的事情,但之前几乎没有接触过Terraform和Ansible。这次,我从头开始实践了一遍,对我来说收获非常大。尤其是创建Ansible-Playbook,难度适中(如果想要更复杂的话,可以随意增加)。通过查看Kubespray等工具的内部结构,我对它们的工作原理有了一定的了解,这对我来说非常重要。

另外,关于k8s,我也对其内部结构和实现感兴趣,并且借此机会与朋友开展学习会,进行轮读和实践等活动。

如果你在年末年初有空的话,请务必尝试自己搭建一个k8s集群并且畅快地笑一笑吧。

请提供参考资料

    • kubeadmを使用したクラスターの作成 | Kubernetes

 

    • 公式ドキュメント

Self-managed Kubernetes in Google Compute Engine (GCE)

CNIに使用したCalicoが作成した資料。この手順に従えばkubeadmで簡単にクラスタが作成できる。今回の操作のほとんどはこの資料をベースに作成。今回のtf x ansible化の前に、これを手で実施して内容を把握した。

kubernetes-sigs/kubespray: Deploy a Production Ready Kubernetes Cluster

Ansible x kubeadm でクラスタを構築するツール kubespray のリポジトリ。playbookの書き方などを一部参考にした。
今回やったことは全部 kubesprayでもできる。

Kubernetesクラスタ構築を例に既存の作業をAnsible化するポイント / initialize kubeadm by ansible – Speaker Deck
zaki-lknr/initialize-kubeadm-ansible: kubeadmでk8sクラスタデプロイするAnsible Playbook

[Kubernetes] kubeadmを使ってCentOSへk8sクラスタをデプロイしてみた (firewalld有効版) – zaki work log

Playbookの作成にあたって、多く参考にさせていただいた。
こちらのリポジトリでは、CRIやCNIの選択も可能になっている。

Deploy a Kubernetes Cluster using Ansible – buildVirtual

Ansibleでk8s構築をしている記事。一部を参考にした。

GCPで基本に戻って始める実践 Infrastructure as code再入門#1 | VISASQ TECH BLOG

1~4を全体の流れの参考にさせていただいた。
terraformでGCPのプロビジョニングを行い、Dynamic Inventoryを使ってAnsibleからの実行対象ホストを取得されていた。

How to configure OS Login in GCP for Ansible | There is no magic here

AnsibleでCloudIAPを使ってSSH接続する | GRIPHONE ENGINEER’S BLOG

OSログイン辺りの調査で参考にした。

k8s on RaspberryPiでHAクラスタ構築
我が家のおうちKubernetesの成長記録 | IIJ Engineers Blog

おうちで「おうち Kubernetes インターン」を実施しました | CyberAgent Developers Blog

k8sをRaspberry pi等に構築している記事。
全体の構成、作業の流れの把握に参考にさせていただいた。

ansible/workshops: Training Course for Ansible Automation Platform

workshops/README.ja.md at devel · ansible/workshops

RedHat公式のAnsibleチュートリアル。日本語もあります。

インフラCI実践ガイド Ansible/GitLabを使ったインフラ改善サイクルの実現 | 中島 倫明, 佐々木 健太郎, 北山 晋吾, 齊藤 秀喜, 羽深 修 | コンピュータ・IT | Kindleストア | Amazon

Ansibleの基礎や考え方の元に。非常に参考になりました。

CalicoによるKubernetesピュアL3ネットワーキング – Yahoo! JAPAN Tech Blog

Calicoなど、CNIプラグインについて非常にわかりやすく、かつ詳しく解説されている

TerraformとCloud BuildでGCP向けのIaC環境を作成してみた

Terraform実行環境について。

广告
将在 10 秒后关闭
bannerAds