https://github.com/traptitech/manifest
k8s manifests ☸ for traP services
https://github.com/traptitech/manifest
argocd k8s kubernetes
Last synced: about 1 year ago
JSON representation
k8s manifests ☸ for traP services
- Host: GitHub
- URL: https://github.com/traptitech/manifest
- Owner: traPtitech
- Created: 2023-05-21T04:33:00.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2025-06-12T10:46:44.000Z (about 1 year ago)
- Last Synced: 2025-06-12T11:47:16.945Z (about 1 year ago)
- Topics: argocd, k8s, kubernetes
- Language: Go
- Homepage:
- Size: 2.47 MB
- Stars: 5
- Watchers: 6
- Forks: 4
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# manifest
Kubernetes manifestファイル群
mainブランチへの変更は、ArgoCDによって自動的に本番環境へ反映されます。
## 書き始める前に
GitHub Actionsでのyamlのバリデーションがありますが、各自のエディタに以下のような拡張機能をインストールし、補完を頼りながら書くと良いでしょう。
### VSCode
ref: [Kubernetesエンジニア向け開発ツール欲張りセット2022](https://zenn.dev/zoetro/articles/9454a6231a1273#vscode-extensions)
[YAML - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml) をインストールし、以下を `.vscode/settings.json` に追加
```json
{
"yaml.schemas": {
"kubernetes": [
"*.yml",
"*.yaml"
]
}
}
```
CRD(Custom Resource Definition)の補完は知らない
誰か知ってたら助けて
### IntelliJ IDEA Ultimate
[Kubernetes - IntelliJ IDEs Plugin | Marketplace](https://plugins.jetbrains.com/plugin/10485-kubernetes)
`Languages & Frameworks > Kubernetes` より、CRD定義のURLを追加すると、CRDの補完も効くようになります
e.g. `https://raw.githubusercontent.com/argoproj/argo-cd/master/manifests/crds/application-crd.yaml`
## 書き方
各ディレクトリ(アプリ)には `kustomization.yaml` が置いてあり、ここを起点として kustomize によって読み込まれます。
また、各ディレクトリ(アプリ)は `./applications/application-set.yaml` を起点として読み込まれます。
具体的なリソースの書き方は、[Deployments | Kubernetes](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) のような公式ドキュメントや、既存アプリの書き方を参考にしてください。
### 既存アプリにリソースを追加・削除・編集する場合
1. 編集したいリソースのyamlを追加・削除・編集します。
2. リソースを追加・削除した場合、各ディレクトリの `kustomization.yaml` の `resources` フィールドの更新を忘れないようにすること。
### アプリ自体を新しく追加する場合
1. 新しくディレクトリを1階層目に作り、リソースを書いていきます。
2. `./新しいディレクトリ名/kustomization.yaml` から書いたリソースを適切に参照します。
## Secretの追加・編集方法
公開鍵暗号方式なので、Secretの追加・値の上書きは誰でも可能です。
Secretは[sops](https://github.com/mozilla/sops#encrypting-using-age)と[age](https://github.com/FiloSottile/age)で暗号化しています。
暗号化されたSecretは[ksops kustomize plugin](https://github.com/viaduct-ai/kustomize-sops#argo-cd-integration-)を通してArgoCDによって読まれます。
### 前準備
以下が必要になるので、インストールしましょう。
- age: https://github.com/FiloSottile/age#installation
- sops: https://github.com/mozilla/sops#1download
- Ubuntu: `wget`/`curl`などで`.deb`を引っ張ってきて`sudo apt install ./sops_x.x.x_amd64.deb` でインストール
### 新規Secretの追加
1. Secretを書く。
```yaml
apiVersion: v1
kind: Secret
metadata:
name: my-secret
annotations:
# kustomizeによってSecret名にhash suffixを付けさせる設定
# Secretの中身が変更されたとき、自動リロードが可能になる
# kustomize設定のnameReferenceで、Secretを読む側のフィールドを参照する必要あり
kustomize.config.k8s.io/needs-hash: "true"
stringData:
my-secret-key: "my-super-secret-value"
```
2. Secretをsopsで暗号化する: `./encrypt-secret.sh secret.yaml`
- ファイルの中身が暗号化されて置き換わります
3. `ksops.yaml` から以下のようにファイルを参照する。
```yaml
apiVersion: viaduct.ai/v1
kind: ksops
metadata:
name: ksops
annotations:
config.kubernetes.io/function: |
exec:
path: ksops
# ここを編集
files:
- ./secrets/secret.yaml
```
4. 次の行を `kustomization.yaml` に追加する。
```yaml
generators:
- ksops.yaml
```
### 既存Secretの編集
既存Secretの値だけを上書きしたい場合、次のスクリプトで編集できます。
- `./set-secret.sh filename key data`
- filenameにはファイル名
- keyにはstringData以下のキー名
- dataには上書きしたいデータ
Secret全体を一旦復号化して編集したい場合は、次のスクリプトで編集できますが、もちろん復号のための鍵が無いとできません。
誤ってコミットすることを防ぐため、ファイルシステム上で復号化はされず、エディター上で編集します。
エディターを閉じると自動的に再度暗号化されます。
- `./edit-secret.sh filename`
### 鍵の追加 / 削除方法
当然復号化できる鍵を1つ以上持っていないと(つまりadminでないと)できません。
1. `.sops.yaml` の `age` フィールドの公開鍵一覧(comma-separated)を更新
2. すべてのSecretファイルに対して、`./updatekeys.sh filename` を実行
- `secrets` ディレクトリ以下に存在するので `find . -type f -path '*/secrets/*' | xargs -n 1 ./updatekeys-secret.sh` とすると楽
NOTE: 鍵を削除する場合、中身は遡って復号化できることに注意
鍵が漏れた場合はSecretの中身も変えないといけません
## Restore from Backup
万が一 master のホストが壊れたなどの理由で、k8sの状態が全部吹き飛んだ場合に、バックアップからから回復する方法です。
現在のリソースをチェック出来る場合はチェック: `$ kubectl get --all-namespaces all`
何も無ければ以下を行い、クラスタの状態をバックアップから回復してください。
このリポジトリの `./backup` 以下に、master ノードの SQLite の状態のバックアップを取るスクリプトが置かれています。
`/var/lib/rancher/k3s/server` 以下を tar.gz として保存し、Google Cloud Storage へバックアップしています。
これから回復するには、 https://docs.k3s.io/datastore/backup-restore の手順に従ってください。
tar.gz の中身から `db` ディレクトリと `token` ファイルを取り出し、元の `/var/lib/rancher/k3s/server` 以下に配置したあと、k3s (server) を起動してください。
## Bootstrap
クラスタ自体の構築記録です。
クラスタが吹き飛んだ場合、以下に沿って構築します。
1. Ansibleを実行してk3sクラスタを構築
- [SysAd/tokyotech.org: traP Infrastructure as Code - tokyotech.org - traP Git](https://git.trap.jp/SysAd/tokyotech.org)
- master (k3s-server) を構築
- **バックアップが存在する場合**、この時点で k3s (server) をストップ、上の方法でリストアし、以下のステップは行わないでよい
- Ansible 内の `k3s_token` の値を書き換える
- worker (k3s-agent) を構築
2. ArgoCDをインストール
- `kubectl create ns argocd`
- `kustomize build ./argocd --enable-alpha-plugins --enable-exec | kubectl apply -n argocd -f -`
- 心配な場合は、`kustomize build` の結果を一時ファイルに保存したり、`kubectl apply --validate=strict --dry-run=server -n argocd -f -` を代わりに使いDry-runで確かめたりすると良い
3. sopsにより暗号化されたSecretの復号化の準備
- `age-keygen -o key.txt`
- Public keyを `.sops.yaml` の該当フィールドに設定
- `kubectl -n argocd create secret generic age-key --from-file=./key.txt`
- `./argocd/argocd-repo-server.yaml` から参照されています
- `rm key.txt`
4. Port forwardしてArgoCDにアクセス
- `kubectl port-forward svc/argocd-server -n argocd 8124:443`
- sshしている場合はlocal forward e.g. `ssh -L 8124:localhost:8124 remote-name`
- localhost:8124 へアクセス
- Admin password: `kubectl get secret -n argocd argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 --decode && echo`
5. ArgoCDのUIから `applications` アプリケーションを登録
- SSH鍵を手元で生成して、公開鍵をGitHubのこのリポジトリ (manifest) に登録
- 必要な場合は先にknown_hostsを登録 (GitHubのknown_hostsはデフォルトで入っている)
- URLはSSH形式で、秘密鍵をUIで貼り付けてリポジトリを追加
- アプリケーションを追加 (path: `applications`)
- Syncを行う
6. cd.trap.jp にアクセスできるようになるはず
- ArgoCDアプリケーションがsyncされた後はargocd serviceのポートは443番から80番になるので注意
- local forwardでのアクセスを続けたい場合は `kubectl port-forward svc/argocd-server -n argocd 8124:80`