ArgoCDでGitHubのユーザ情報を使ってログインできるようにする
はじめに
宣言的なContinuous DeploymentのためにGitOpsという形で Kubernetes上のアプリケーションを管理してくれるツールがArgoCDです。 今回は、kindを使ってローカルで試していきます。
今回は以下のような流れでやっていきます
使用したツールのバージョン等は以下の通りです。
$ kind version kind v0.12.0 go1.16.3 linux/amd64 $ kubectl version Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", GitCommit:"c285e781331a3785a7f436042c65c5641ce8a9e9", GitTreeState:"clean", BuildDate:"2022-03-16T15:58:47Z", GoVersion:"go1.17.8", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.4", GitCommit:"e6c093d87ea4cbb530a7b2ae91e54c0842d8308a", GitTreeState:"clean", BuildDate:"2022-03-06T21:32:53Z", GoVersion:"go1.17.7", Compiler:"gc", Platform:"linux/amd64"} $ argocd version argocd: v2.3.3+07ac038 BuildDate: 2022-03-30T01:46:59Z GitCommit: 07ac038a8f97a93b401e824550f0505400a8c84e GitTreeState: clean GoVersion: go1.17.6 Compiler: gc Platform: linux/amd64 FATA[0001] Failed to establish connection to localhost:8080: dial tcp 127.0.0.1:8080: connect: connection refused # ↑はport-forwardを切ってる時にArgoCDのCLIがArgoCDのサーバにアクセスしようとしてエラーになっています。
1. 公式のマニフェストを使ってArgoCDの導入をする
まずはGetting Started通りに、ArgoCDを導入します。 今回は導入だけでなく、UIの認証周りの確認も行いたいので coreのみのyamlは使いません。
以下のようなコマンドを叩いて導入します。
kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
apply後、以下のようなログが出力されました。(これは1回実行したあとにブログ用に叩いたので、unchanged/configuredになっているものがあります)
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io unchanged customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io configured customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io unchanged serviceaccount/argocd-application-controller unchanged serviceaccount/argocd-applicationset-controller unchanged serviceaccount/argocd-dex-server unchanged serviceaccount/argocd-notifications-controller unchanged serviceaccount/argocd-redis unchanged serviceaccount/argocd-server unchanged role.rbac.authorization.k8s.io/argocd-application-controller unchanged role.rbac.authorization.k8s.io/argocd-applicationset-controller unchanged role.rbac.authorization.k8s.io/argocd-dex-server unchanged role.rbac.authorization.k8s.io/argocd-notifications-controller unchanged role.rbac.authorization.k8s.io/argocd-server unchanged clusterrole.rbac.authorization.k8s.io/argocd-application-controller unchanged clusterrole.rbac.authorization.k8s.io/argocd-server unchanged rolebinding.rbac.authorization.k8s.io/argocd-application-controller unchanged rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller unchanged rolebinding.rbac.authorization.k8s.io/argocd-dex-server unchanged rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller unchanged rolebinding.rbac.authorization.k8s.io/argocd-redis unchanged rolebinding.rbac.authorization.k8s.io/argocd-server unchanged clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller unchanged clusterrolebinding.rbac.authorization.k8s.io/argocd-server unchanged configmap/argocd-cm unchanged configmap/argocd-cmd-params-cm unchanged configmap/argocd-gpg-keys-cm unchanged configmap/argocd-notifications-cm configured configmap/argocd-rbac-cm unchanged configmap/argocd-ssh-known-hosts-cm unchanged configmap/argocd-tls-certs-cm configured secret/argocd-notifications-secret unchanged secret/argocd-secret unchanged service/argocd-applicationset-controller unchanged service/argocd-dex-server unchanged service/argocd-metrics unchanged service/argocd-notifications-controller-metrics unchanged service/argocd-redis unchanged service/argocd-repo-server unchanged service/argocd-server unchanged service/argocd-server-metrics unchanged deployment.apps/argocd-applicationset-controller unchanged deployment.apps/argocd-dex-server unchanged deployment.apps/argocd-notifications-controller unchanged deployment.apps/argocd-redis unchanged deployment.apps/argocd-repo-server unchanged deployment.apps/argocd-server unchanged statefulset.apps/argocd-application-controller unchanged networkpolicy.networking.k8s.io/argocd-application-controller-network-policy configured networkpolicy.networking.k8s.io/argocd-dex-server-network-policy unchanged networkpolicy.networking.k8s.io/argocd-redis-network-policy unchanged networkpolicy.networking.k8s.io/argocd-repo-server-network-policy configured networkpolicy.networking.k8s.io/argocd-server-network-policy unchanged
ArgoCDのアプリケーション郡の起動を確認します。
$ kubectl get pod -n argocd NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 14h argocd-applicationset-controller-687dc49cc5-t88q4 1/1 Running 0 69m argocd-dex-server-5cd54c6fb7-zsgtz 1/1 Running 0 69m argocd-notifications-controller-5776f9b489-fw86l 1/1 Running 0 69m argocd-redis-65c877b7bb-bjnmn 1/1 Running 0 69m argocd-repo-server-d766f5fdd-h7zbv 1/1 Running 0 69m argocd-server-68bb47f477-zdrk5 1/1 Running 0 69m
podが全てRunningになっていれば大丈夫です。
導入はこれで終わりです。
2. Adminユーザでログインしてみる
Adminユーザでログインしてみます。
まずはport-forwardでkind上のServiceにアクセスできるようにします。
kubectl port-forward svc/argocd-server -n argocd 8080:443
https://localhost:8080
にアクセスしてみましょう。
証明書のエラーでアクセスできない場合は、Chromeの場合、chrome://flags/#allow-insecure-localhost
で
localhostの場合、証明書の検証を無視することができます。
本来はここはきちんとした証明書を設定することが望ましいです。
ログイン画面が出てくると思うので
usernameを admin
で
passwordは以下のコマンドで出力されたものを使います。
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
とりあえずこれでブラウザからはログイン出来ました。
次はCLIからもログインしてみます
$ argocd login localhost:8080
ユーザ名とパスワードを入力するとログインできました。
3. GitHubのユーザ情報を使ってログインする
ArgoCDの設定を変更してGitHubのユーザ情報を使ってログインできるようにしてみます。また、RBACの設定も追加してみます。 まず、初めに GitHubでOAuth applicationを作ります。
https://github.com/settings/applications/new このURLから作成してください。
今回はport-forwardでlocalhostとしてアクセスするので
Authorization callback URL
の値は http://localhost:8080
としました。
client IDとclient secretの値はこのあと使うのでメモしておいてください。
今回はConfigMapを直接いじります。
kubectl edit -n argocd configmap argocd-cm
dex.configとurlの設定を追加しました。
clientIDの値は先程生成したclient IDにしてください。
$dex.github.clientSecret
は argocd-secret
というSecretに入っている値で展開されます。
公式からコピペしてきたのでコメントにも書いてあるのですが
別のSecretからも展開できるので運用上は別のSecretに分けておいたほうが管理が楽かもしれません。
apiVersion: v1 data: + dex.config: | + connectors: + - type: github + id: github + name: GitHub + config: + clientID: xxxxxxxxxxxxxxxxxxxxxxxx + clientSecret: $dex.github.clientSecret # Alternatively $<some_K8S_secret>:dex.github.clientSecret + orgs: + - name: your-organization + url: https://localhost:8080 kind: ConfigMap metadata: labels: app.kubernetes.io/name: argocd-cm app.kubernetes.io/part-of: argocd name: argocd-cm namespace: argocd
$dex.github.clientSecretの値の展開ができるようにそちらも編集します。 以下のコマンドから編集します。
kubectl edit -n argocd secret argocd-secret
以下のような変更を加えました。
apiVersion: v1
data:
... # 省略
+ dex.github.clientSecret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==
... # 省略
kind: Secret
metadata:
labels:
app.kubernetes.io/name: argocd-secret
app.kubernetes.io/part-of: argocd
name: argocd-secret
namespace: argocd
type: Opaque
RBAC(Role Based Access Control)の設定もしておきます。
以下のコマンドからargocd-rbac-cm
ConfigMapを編集します。
kubectl edit -n argocd configmap argocd-rbac-cm
argocd-rbac-cm
に以下のような設定を追加しました。
apiVersion: v1 data: + policy.csv: | + g, your-orgs:your-team, role:admin kind: ConfigMap metadata: labels: app.kubernetes.io/name: argocd-rbac-cm app.kubernetes.io/part-of: argocd name: argocd-rbac-cm namespace: argocd
これでひとまずGitHubのユーザ情報を使ってログイン出来るようになっているはずです。
自動的に設定の変更が反映されて https://localhost:8080
にアクセスしてみましょう。
ログインしてる場合はログアウトしてください。
LOGIN VIA GITHUB
みたいなボタンが見えると思うので
ボタンをクリックするとログイン出来ます。
4. Adminユーザを無効にする
今回は、ひとまず使いそうにない、Adminユーザのログインを無効化してみます。
argocd-cm
に admin.enabled: "false"
を追加しました。
これで Adminユーザが無効になり、ログイン画面からフォームが消えて
LOGIN VIA GITHUB
のボタンだけが表示されるようになります。
終わりに
ArgoCDのGetting Startedをベースに GitHubのユーザ情報を利用してArgoCDのUIにログインできるようにしてみました。
ログインしてUIから触れる状態になったので 今度は、実際にアプリケーションをデプロイして試します。
おまけ. TLSを無効にしてみる
argocd-serverのTLSを無効にしてみます。
argocd-cmd-params-cm
に以下の設定を追加します。
data:
+ server.insecure: "true"
これで無効にできるようです。 ちなみに、argocd-serverのyaml見ると、このConfigMapの値を参照しているのがわかります。
おまけ. argocdのCLIをgithubのユーザ情報を使って認証する
githubのユーザ情報でCLIを認証するのは、以下のコマンドで可能です。
argocd login localhost:8080 --sso
備忘録: .NET 5の開発環境をUbuntu 20.04にセットアップしてみた
なぜか.NETを使うことになったので 開発環境の構築をメモしておく。
今回はUbuntu 20.04なので、以下の流れで行った。
インストールした.NETのバージョンは以下の通りである。
- 5.0.400
aptで.NETのSDKをインストールする
下記のページを参考にインストールした。 この点で詰まることはなかった。
Ubuntu に .NET をインストールする - .NET | Microsoft Docs
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb sudo apt-get update; \ sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-5.0
.NETのCLIを使ってリポジトリを初期化する
前段のSDKのセットアップでCLIが使えるようになっているので 以下にコマンドを叩けばリポジトリの初期化ができた。
dotnet new console
ついでにNuGetで依存管理を行うようなので そちらの設定も追加しておく。以下のコマンドで設定が追加できる。
dotnet new nugetconfig
依存を追加するには以下のようなコマンドを使うようだ。 NuGetは単体でCLIが提供されていそうなのだが これは.NET側に統合されたインターフェースなのだろうか?便利だ。
dotnet add package <package> --version <version>
VSCodeに拡張機能を入れる
VSCodeに拡張機能を入れて開発しやすくしたいと思い以下のMicrosoftが出している拡張機能を追加した。
インストール後にツールのダウンロードなどが走った記憶があるが定かではない。 ただ、初期状態のまま、何かを設定することなく、補完ができるようになり、すぐに開発が進められるようにはなった。 便利だ。
補完やシンタックスハイライトはもちろん、ジャンプ機能などもしっかり動き 保存時フォーマットなども設定を弄ることなく動作する。 特に設定に躓くことはなかった。
リポジトリ構成はデフォルトのままでファイル1枚しか弄ってないので困ることはなかったが この後どうなるかはわからない。 弄ることがあったらメモとして残しておきたい。
まとめ
初めて.NETを触ることになったが、linux上で動かしたい思いもあり、今回はUbuntu上に開発環境を構築した。 リポジトリを作って1枚のファイルにベタに書いているだけだが 特に躓くところはなかったので良かった。
運用面での不安は少しあるが、開発という意味では大きく問題はないかもしれない。 メモとして残しておく。
ビルド周りは調べてなかったが以下のページに載っているようだ。 あとで見るが、OSごとにランタイムが変わるのだろうか?.NET周りは初めてなので何もわからない。
Writing A Compiler In Goを読んだ
Writing A Compiler In Goを読んだ。 この本は、Go言語で作るインタプリタ の続編で 前作で作ったTree-walking インタプリタで動作するmonkeyという言語を コンパイルして、バイトコードを吐き出し、それをVM上で動かすようにする、というのが最終的な目標になる。 lexer, parserなどは前作で作ったものを用いることになる。
この本の中身については、他の人が書いた記事を見るとよく分かると思うので ここにリンクを貼っておく。この記事では、僕が読もうとしたきっかけなどを書こうと思う。
- Written A Compiler In Go を読んだ - 技術備忘記
- Writing A Compiler In Goを読んだ - 逆さまにした
- Writing An Interpreter In Goを読んだ | Taichi Nakashima
この本を読もうと思ったきっかけは、そもそも前作であるインタプリタの実装が興味深いものだったからである。 前作では、説明も実直に書かれており、テストを書いてから実装を作るという流れを一貫して行っていて読みやすい上に、 実装の過程で、小まめに動くようになったことについて、著者と喜びを分かち合えるような本になっている。
上記ブログでいくつか紹介されており、そのうち読みたいなぁと思っていたが 英語版しか出版されていないこともあり、手が遠のいていたが ちょっと手を動かして書いてみたいなと思って、この本を手を取ってみた。
この本も前作同様に、説明は細やかで、テストを書いてから実装を作るという流れは変わっていない。 また、この本では、コンパイラとそれが吐き出すバイトコードおよび、それを実行するVMの設計と実装を行っていくが レキサやパーサについては、前作で作ったものを流用するため、それには注意が必要である。(最終的なソースコードはgithubとかで配布してたので、そこから拝借することはできるはず) タイトルにもあるとおり、Goですべてを書いていくため、コードが読みやすいのも嬉しい。
また、個人的な話として前作のインタプリタの発展で destructuringを少し実装していたので それもちょっと遊びで実装したが、面白かった。コードとしてはここに置いてある。
面白かったので記事として書いておいた。 興味があったら読んでみてほしい。