--- title: "K3s + Cloudflare Zero Trustな環境をuser dataでシュッと建てる" date: "2022-08-16T09:07:18+0900" tags: ["kubernetes", "cloudflare", "argocd", "k3s"] --- 個人のKubernetes環境でベストな形というのを結構ずっと探っている。やりたいこととしてはIaCできちんと管理した形でK8sを運用したい、というのと、クラウドに建てるので、ローカルからセキュアにK8s APIを叩きたい、というあたり。昨年は [kops と Argo CD でプライベート Kubernetes を建てる - chroju.dev/blog](http://chroju.dev/blog/kops_argo_cd_private_k8s_cluster) というのを書いたりしたのだが、結構重量級の環境になってしまった故、その後断念している。 最近 [K3s](https://k3s.io/) を用いることである程度形になった。K3sはワンバイナリで動作する軽量なK8s実装であり、非常に扱いやすい。またK8s APIを遠隔から実行するにあたっては [Cloudflare Zero Trust](https://www.cloudflare.com/ja-jp/products/zero-trust/) を用いることにしてみた。 現在、この環境をEC2 + user dataを使って `terraform apply` 一発で建てる仕組みを使い始めたので、少しまとめておきたい。 ## K3s https://k3s.io/ Kubedrnetes (K8s) から諸々の機能を省いて、メモリフットプリントを半分にした実装。名前もKubernetes = 10文字の半分なので5文字でK3s、ということらしい。Rancherが元々開発していたもので、2020年にCNCF入りしている。 最も簡単なインストール方法としては `curl -sfL https://get.k3s.io | sh -` を実行することだが、あまりスクリプトでのインストールが好きではないので、直接バイナリを落としてきて使っている。バイナリダウンロードによるインストール方法も[Docsに言及があり](https://rancher.com/docs/k3s/latest/en/installation/install-options/)、systemd周りの設定を自力でやらなくてはならないぐらいで、特別煩雑な手順にはならない。 ```bash # Install k3s curl -Ls https://github.com/k3s-io/k3s/releases/download/${k3s_version}/k3s -o /usr/local/bin/k3s chmod +x /usr/local/bin/k3s ln -s /usr/local/bin/k3s /usr/local/bin/kubectl cat > /etc/systemd/system/k3s.service <Image from Gyazo Tunnelを使うにあたっては、先にTunnelを作成しておき、cloudflaredには接続するTunnelの情報を書いたJSONと、接続に必要なSecretなどが書かれたYAMLを読み込ませる形になる。TunnelはTerraformで構築できるので、先にTeraformで構築した後、必要な情報をTerraform `templatefile` に埋め込んでuser dataを作成している。 ```bash # Install cloudflared for kubectl (Kubernetes API) curl -Ls https://github.com/cloudflare/cloudflared/releases/download/${cloudflared_version}/cloudflared-linux-amd64.deb -o /tmp/cloudflared.deb dpkg -i ./tmp/cloudflared.deb mkdir -p /root/.cloudflared cat > /root/.cloudflared/${cloudflare_tunnel.kubectl.id}.json < /root/.cloudflared/config.yaml < /tmp/argo-cd-helm-chart.yaml <