1Password Operator を使って k8s の Secret を安全に扱う
1Password Connect Kubernetes Operator を使うと、1Password の保管庫に保存された値を k8s の Secret リソースに同期することができます
先人の記事が詳しいです
1Password Connect Kubernetes Operator は Helm でも導入できます
code:console
$ helm install connect \
1password/connect \
--set-file connect.credentials=1password-credentials.json \
--set operator.create=true \
--set operator.token.value=$OPERATOR_TOKEN \
--set operator.autoRestart=true \
-n 1password \
--create-namespace
Injector もあるらしい
1Password のアイテムを k8s から参照する
1Password にシークレットを放り込む
「API資格情報」でも「パスワード」でも動きました
https://scrapbox.io/files/63ae96cde0d4a5001d4748b2.png
<item key> は任意文字列、マニフェストから参照するときに指定する
OnePasswordItem リソースを作る
code:secret.yaml
apiVersion: onepassword.com/v1
kind: OnePasswordItem
metadata:
name: <secret-name>
spec:
itemPath: "vaults/<vault-id-or-name>/items/<item-id-or-name>"
<secret-name> が k8s リソース名になります
<vault-id-or-name> および <item-id-or-name> は保管庫およびアイテムの ID または名前で指定します
ID は 1Password のデバッグ機能から確認できます
デバッグ機能は「設定」→「上級」→「デバッグツールを表示」から有効化できます
https://scrapbox.io/files/63ae8aad33e10e001d747dd5.png
アイテムの3点リーダーのメニューで「アイテムUUIDをコピー」すると出てくるのがアイテム ID です
https://scrapbox.io/files/63ae8b4b98d003001ea34a38.png
Secret が作られるか確認する
code:console
$ kubectl -f ./secret.yaml
$ kubectl get secret <secret-name>
Deployment から Secret を参照する
code:deployment.yaml
env:
- name: API_KEY
valueFrom:
secretKeyRef:
name: <secret-name>
key: <item-key>
トラブルシューティング
OnePasswordItem リソースを作成しても Secret が作られない
1Password のアイテムのラベルを確認してみてください
https://scrapbox.io/files/63ae87de4fc5db001d9886df.png
画像では value となっている部分です
このラベルは k8s の命名規則に従う必要があるので /[-._a-zA-Z0-9]+/ 形式になっているか確認します
日本語環境ではここが「パスワード」とか「資格情報」になる場合があり、カスタムフィールドを増やしてそこに格納する必要があります