ArgoCDでGitHubのユーザ情報を使ってログインできるようにする

はじめに

宣言的なContinuous DeploymentのためにGitOpsという形で Kubernetes上のアプリケーションを管理してくれるツールがArgoCDです。 今回は、kindを使ってローカルで試していきます。

今回は以下のような流れでやっていきます

  1. 公式のマニフェストを使ってArgoCDの導入をする
  2. Adminユーザでログインしてみる
  3. githubでログインしてみる
  4. Adminユーザのログインをdisabledにする

使用したツールのバージョン等は以下の通りです。

$ 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-localhostlocalhostの場合、証明書の検証を無視することができます。 本来はここはきちんとした証明書を設定することが望ましいです。

ログイン画面が出てくると思うので 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.clientSecretargocd-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-cmadmin.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のCLIgithubのユーザ情報を使って認証する

githubのユーザ情報でCLIを認証するのは、以下のコマンドで可能です。

argocd login localhost:8080 --sso

ちなみに、TLS無効にした状態だとなぜかログイン出来なかったので TLSを有効にすればログインすることができました。

備忘録: .NET 5の開発環境をUbuntu 20.04にセットアップしてみた

なぜか.NETを使うことになったので 開発環境の構築をメモしておく。

今回はUbuntu 20.04なので、以下の流れで行った。

  1. aptで.NETのSDKをインストールする
  2. .NETのCLIを使ってリポジトリを初期化する
  3. VSCode拡張機能を入れる

インストールした.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が出している拡張機能を追加した。

marketplace.visualstudio.com

インストール後にツールのダウンロードなどが走った記憶があるが定かではない。 ただ、初期状態のまま、何かを設定することなく、補完ができるようになり、すぐに開発が進められるようにはなった。 便利だ。

補完やシンタックスハイライトはもちろん、ジャンプ機能などもしっかり動き 保存時フォーマットなども設定を弄ることなく動作する。 特に設定に躓くことはなかった。

リポジトリ構成はデフォルトのままでファイル1枚しか弄ってないので困ることはなかったが この後どうなるかはわからない。 弄ることがあったらメモとして残しておきたい。

まとめ

初めて.NETを触ることになったが、linux上で動かしたい思いもあり、今回はUbuntu上に開発環境を構築した。 リポジトリを作って1枚のファイルにベタに書いているだけだが 特に躓くところはなかったので良かった。

運用面での不安は少しあるが、開発という意味では大きく問題はないかもしれない。 メモとして残しておく。

ビルド周りは調べてなかったが以下のページに載っているようだ。 あとで見るが、OSごとにランタイムが変わるのだろうか?.NET周りは初めてなので何もわからない。

docs.microsoft.com

Writing A Compiler In Goを読んだ

Writing A Compiler In Goを読んだ。 この本は、Go言語で作るインタプリタ の続編で 前作で作ったTree-walking インタプリタで動作するmonkeyという言語を コンパイルして、バイトコードを吐き出し、それをVM上で動かすようにする、というのが最終的な目標になる。 lexer, parserなどは前作で作ったものを用いることになる。

この本の中身については、他の人が書いた記事を見るとよく分かると思うので ここにリンクを貼っておく。この記事では、僕が読もうとしたきっかけなどを書こうと思う。

この本を読もうと思ったきっかけは、そもそも前作であるインタプリタの実装が興味深いものだったからである。 前作では、説明も実直に書かれており、テストを書いてから実装を作るという流れを一貫して行っていて読みやすい上に、 実装の過程で、小まめに動くようになったことについて、著者と喜びを分かち合えるような本になっている。

上記ブログでいくつか紹介されており、そのうち読みたいなぁと思っていたが 英語版しか出版されていないこともあり、手が遠のいていたが ちょっと手を動かして書いてみたいなと思って、この本を手を取ってみた。

この本も前作同様に、説明は細やかで、テストを書いてから実装を作るという流れは変わっていない。 また、この本では、コンパイラとそれが吐き出すバイトコードおよび、それを実行するVMの設計と実装を行っていくが レキサやパーサについては、前作で作ったものを流用するため、それには注意が必要である。(最終的なソースコードgithubとかで配布してたので、そこから拝借することはできるはず) タイトルにもあるとおり、Goですべてを書いていくため、コードが読みやすいのも嬉しい。

また、個人的な話として前作のインタプリタの発展で destructuringを少し実装していたので それもちょっと遊びで実装したが、面白かった。コードとしてはここに置いてある。

面白かったので記事として書いておいた。 興味があったら読んでみてほしい。

compilerbook.com