{"id":24929863,"url":"https://github.com/traptitech/manifest","last_synced_at":"2025-06-13T20:04:59.554Z","repository":{"id":178766522,"uuid":"643412418","full_name":"traPtitech/manifest","owner":"traPtitech","description":"k8s manifests ☸ for traP services","archived":false,"fork":false,"pushed_at":"2025-06-12T10:46:44.000Z","size":2594,"stargazers_count":5,"open_issues_count":11,"forks_count":4,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-06-12T11:47:16.945Z","etag":null,"topics":["argocd","k8s","kubernetes"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/traPtitech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-05-21T04:33:00.000Z","updated_at":"2025-06-12T10:46:46.000Z","dependencies_parsed_at":"2023-09-22T04:49:18.712Z","dependency_job_id":"cfd8ac93-ef7a-40c0-a83b-e216864df639","html_url":"https://github.com/traPtitech/manifest","commit_stats":null,"previous_names":["traptitech/manifest"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/traPtitech/manifest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/traPtitech%2Fmanifest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/traPtitech%2Fmanifest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/traPtitech%2Fmanifest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/traPtitech%2Fmanifest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/traPtitech","download_url":"https://codeload.github.com/traPtitech/manifest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/traPtitech%2Fmanifest/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259712376,"owners_count":22900035,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["argocd","k8s","kubernetes"],"created_at":"2025-02-02T13:52:06.147Z","updated_at":"2025-06-13T20:04:59.530Z","avatar_url":"https://github.com/traPtitech.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# manifest\n\nKubernetes manifestファイル群\n\nmainブランチへの変更は、ArgoCDによって自動的に本番環境へ反映されます。\n\n## 書き始める前に\n\nGitHub Actionsでのyamlのバリデーションがありますが、各自のエディタに以下のような拡張機能をインストールし、補完を頼りながら書くと良いでしょう。\n\n### VSCode\n\nref: [Kubernetesエンジニア向け開発ツール欲張りセット2022](https://zenn.dev/zoetro/articles/9454a6231a1273#vscode-extensions)\n\n[YAML - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml) をインストールし、以下を `.vscode/settings.json` に追加\n\n```json\n{\n   \"yaml.schemas\": {\n      \"kubernetes\": [\n         \"*.yml\",\n         \"*.yaml\"\n      ]\n   }\n}\n```\n\nCRD(Custom Resource Definition)の補完は知らない\n誰か知ってたら助けて\n\n### IntelliJ IDEA Ultimate\n\n[Kubernetes - IntelliJ IDEs Plugin | Marketplace](https://plugins.jetbrains.com/plugin/10485-kubernetes)\n\n`Languages \u0026 Frameworks \u003e Kubernetes` より、CRD定義のURLを追加すると、CRDの補完も効くようになります\ne.g. `https://raw.githubusercontent.com/argoproj/argo-cd/master/manifests/crds/application-crd.yaml`\n\n## 書き方\n\n各ディレクトリ（アプリ）には `kustomization.yaml` が置いてあり、ここを起点として kustomize によって読み込まれます。\nまた、各ディレクトリ（アプリ）は `./applications/application-set.yaml` を起点として読み込まれます。\n\n具体的なリソースの書き方は、[Deployments | Kubernetes](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) のような公式ドキュメントや、既存アプリの書き方を参考にしてください。\n\n### 既存アプリにリソースを追加・削除・編集する場合\n\n1. 編集したいリソースのyamlを追加・削除・編集します。\n2. リソースを追加・削除した場合、各ディレクトリの `kustomization.yaml` の `resources` フィールドの更新を忘れないようにすること。\n\n### アプリ自体を新しく追加する場合\n\n1. 新しくディレクトリを1階層目に作り、リソースを書いていきます。\n2. `./新しいディレクトリ名/kustomization.yaml` から書いたリソースを適切に参照します。\n\n## Secretの追加・編集方法\n\n公開鍵暗号方式なので、Secretの追加・値の上書きは誰でも可能です。\n\nSecretは[sops](https://github.com/mozilla/sops#encrypting-using-age)と[age](https://github.com/FiloSottile/age)で暗号化しています。\n暗号化されたSecretは[ksops kustomize plugin](https://github.com/viaduct-ai/kustomize-sops#argo-cd-integration-)を通してArgoCDによって読まれます。\n\n### 前準備\n\n以下が必要になるので、インストールしましょう。\n\n- age: https://github.com/FiloSottile/age#installation\n- sops: https://github.com/mozilla/sops#1download\n   - Ubuntu: `wget`/`curl`などで`.deb`を引っ張ってきて`sudo apt install ./sops_x.x.x_amd64.deb` でインストール\n\n### 新規Secretの追加\n\n1. Secretを書く。\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n   name: my-secret\n   annotations:\n      # kustomizeによってSecret名にhash suffixを付けさせる設定\n      # Secretの中身が変更されたとき、自動リロードが可能になる\n      # kustomize設定のnameReferenceで、Secretを読む側のフィールドを参照する必要あり\n      kustomize.config.k8s.io/needs-hash: \"true\"\nstringData:\n   my-secret-key: \"my-super-secret-value\"\n```\n\n2. Secretをsopsで暗号化する: `./encrypt-secret.sh secret.yaml`\n   - ファイルの中身が暗号化されて置き換わります\n3. `ksops.yaml` から以下のようにファイルを参照する。\n\n```yaml\napiVersion: viaduct.ai/v1\nkind: ksops\nmetadata:\n   name: ksops\n   annotations:\n      config.kubernetes.io/function: |\n         exec:\n           path: ksops\n\n# ここを編集\nfiles:\n   - ./secrets/secret.yaml\n```\n\n4. 次の行を `kustomization.yaml` に追加する。\n\n```yaml\ngenerators:\n   - ksops.yaml\n```\n\n### 既存Secretの編集\n\n既存Secretの値だけを上書きしたい場合、次のスクリプトで編集できます。\n\n- `./set-secret.sh filename key data`\n   - filenameにはファイル名\n   - keyにはstringData以下のキー名\n   - dataには上書きしたいデータ\n\nSecret全体を一旦復号化して編集したい場合は、次のスクリプトで編集できますが、もちろん復号のための鍵が無いとできません。\n誤ってコミットすることを防ぐため、ファイルシステム上で復号化はされず、エディター上で編集します。\nエディターを閉じると自動的に再度暗号化されます。\n\n- `./edit-secret.sh filename`\n\n### 鍵の追加 / 削除方法\n\n当然復号化できる鍵を1つ以上持っていないと（つまりadminでないと）できません。\n\n1. `.sops.yaml` の `age` フィールドの公開鍵一覧(comma-separated)を更新\n2. すべてのSecretファイルに対して、`./updatekeys.sh filename` を実行\n   - `secrets` ディレクトリ以下に存在するので `find . -type f -path '*/secrets/*' | xargs -n 1 ./updatekeys-secret.sh` とすると楽\n\nNOTE: 鍵を削除する場合、中身は遡って復号化できることに注意\n鍵が漏れた場合はSecretの中身も変えないといけません\n\n## Restore from Backup\n\n万が一 master のホストが壊れたなどの理由で、k8sの状態が全部吹き飛んだ場合に、バックアップからから回復する方法です。\n\n現在のリソースをチェック出来る場合はチェック: `$ kubectl get --all-namespaces all`\n何も無ければ以下を行い、クラスタの状態をバックアップから回復してください。\n\nこのリポジトリの `./backup` 以下に、master ノードの SQLite の状態のバックアップを取るスクリプトが置かれています。\n`/var/lib/rancher/k3s/server` 以下を tar.gz として保存し、Google Cloud Storage へバックアップしています。\n\nこれから回復するには、 https://docs.k3s.io/datastore/backup-restore の手順に従ってください。\ntar.gz の中身から `db` ディレクトリと `token` ファイルを取り出し、元の `/var/lib/rancher/k3s/server` 以下に配置したあと、k3s (server) を起動してください。\n\n## Bootstrap\n\nクラスタ自体の構築記録です。\nクラスタが吹き飛んだ場合、以下に沿って構築します。\n\n1. Ansibleを実行してk3sクラスタを構築\n   - [SysAd/tokyotech.org: traP Infrastructure as Code - tokyotech.org - traP Git](https://git.trap.jp/SysAd/tokyotech.org)\n   - master (k3s-server) を構築\n   - **バックアップが存在する場合**、この時点で k3s (server) をストップ、上の方法でリストアし、以下のステップは行わないでよい\n   - Ansible 内の `k3s_token` の値を書き換える\n   - worker (k3s-agent) を構築\n2. ArgoCDをインストール\n   - `kubectl create ns argocd`\n   - `kustomize build ./argocd --enable-alpha-plugins --enable-exec | kubectl apply -n argocd -f -`\n     - 心配な場合は、`kustomize build` の結果を一時ファイルに保存したり、`kubectl apply --validate=strict --dry-run=server -n argocd -f -` を代わりに使いDry-runで確かめたりすると良い\n3. sopsにより暗号化されたSecretの復号化の準備\n   - `age-keygen -o key.txt`\n   - Public keyを `.sops.yaml` の該当フィールドに設定\n   - `kubectl -n argocd create secret generic age-key --from-file=./key.txt`\n      - `./argocd/argocd-repo-server.yaml` から参照されています\n   - `rm key.txt`\n4. Port forwardしてArgoCDにアクセス\n   - `kubectl port-forward svc/argocd-server -n argocd 8124:443`\n   - sshしている場合はlocal forward e.g. `ssh -L 8124:localhost:8124 remote-name`\n   - localhost:8124 へアクセス\n   - Admin password: `kubectl get secret -n argocd argocd-initial-admin-secret -o jsonpath=\"{.data.password}\" | base64 --decode \u0026\u0026 echo`\n5. ArgoCDのUIから `applications` アプリケーションを登録\n   - SSH鍵を手元で生成して、公開鍵をGitHubのこのリポジトリ (manifest) に登録\n   - 必要な場合は先にknown_hostsを登録 (GitHubのknown_hostsはデフォルトで入っている)\n   - URLはSSH形式で、秘密鍵をUIで貼り付けてリポジトリを追加\n   - アプリケーションを追加 (path: `applications`)\n   - Syncを行う\n6. cd.trap.jp にアクセスできるようになるはず\n   - ArgoCDアプリケーションがsyncされた後はargocd serviceのポートは443番から80番になるので注意\n   - local forwardでのアクセスを続けたい場合は `kubectl port-forward svc/argocd-server -n argocd 8124:80`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftraptitech%2Fmanifest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftraptitech%2Fmanifest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftraptitech%2Fmanifest/lists"}