ファイルから生成された秘密をKubernetesで更新するにはどうすればよいですか?


96

を使用してシークレットを作成しましたkubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt

値を更新したい場合-どうすればよいですか?

回答:


241

これはうまくいくはずです:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -

21
yamlとapplyコマンドへの出力の巧妙な使用が好きです。+1
ケビンマンセル2017

10
k8sの最新バージョンでは、CLI警告を回避するためにに提供--save-configする必要がありkubectl create secretます。
デビッドハウス

fyi、最近(2019年9月)のtls secretで機能する構文:証明書kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -はプレーンテキストでした。
ldg

63

シークレットを削除してすぐに再作成できます。

kubectl delete secret production-tls
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt

これらのコマンドをスクリプトに入れました。最初の呼び出しで、(まだ)存在する秘密についての警告が表示されますが、これは機能します。


3
シークレットが削除されている間、ポッドはどうなりますか?
BrunoJCM

4
@BrunoJCM実行ポッドは、env変数を介してシークレットを取得するか、ボリュームとしてマウントされるかに関係なく、影響を受けません。シークレットがないときにポッドを開始した場合、エラーが発生します。したがって、Janosの回答が望ましい方法です。
PJMeisch

2
はい、わかりました。使用applyすることはもっと理にかなっています。
BrunoJCM

私が忘れていたので、これは私にとってはうまくいきませんでした--namespace=kube-system
Souradeep Nanda

デフォルトではない場合はもちろん、シークレットを追加する名前空間に依存します。もちろん、名前空間引数を追加する必要があります。
PJMeisch

8

また、あなたはまた、使用することができるjq=か、|=その場で秘密を更新するために、オペレータが。

TLS_KEY=$(base64 < "./tls.key" | tr -d '\n')
TLS_CRT=$(base64 < "./tls.crt" | tr -d '\n')
kubectl get secrets production-tls -o json \
        | jq '.data["tls.key"] |= "$TLS_KEY"' \
        | jq '.data["tls.crt"] |= "$TLS_CRT"' \
        | kubectl apply -f -

kubectl create secret generic --dry-runアプローチほどエレガントでも単純でもないかもしれませんが、技術的には、このアプローチは値を削除/再作成するのではなく、本当に値を更新しています。また、利用可能なjqおよびbase64(またはopenssl enc -base64)コマンドが必要です。tr末尾の改行をトリミングするために一般的に利用可能なLinuxのユーティリティです。

参照してください。ここでの詳細についてはjq、更新作業|=


1

上記のDevyの回答に返信できなかったので、削除して再作成するとレコード内の余分な情報が失われる可能性がある所有権が保持されるため、これが好きです。変数が補間されていないのにホエーをすぐに理解できない新しい人々のためにこれを追加します。

TLS_KEY=$(base64 < "./tls.key" | tr -d '\n')
TLS_CRT=$(base64 < "./tls.crt" | tr -d '\n')
kubectl get secrets production-tls -o json \
        | jq ".data[\"tls.key\"] |= \"$TLS_KEY\"" \
        | jq ".data[\"tls.crt\"] |= \"$TLS_CRT\"" \
        | kubectl apply -f -

これにより、kubectlの 'patch'メソッドを使用しようとしましたが、これも機能しているようです。

kubectl \
        patch \
        secret \
        production-tls \
        -p "{\"data\":{\"tls.key\":\"${TLS_KEY}\",\"tls.crt\":\"${TLS_CRT}\"}}"

私のニーズを最もよく満たした答えをDevyに感謝します。


0

より具体的なケースでは、証明書を更新して古い証明書を削除する必要があるネームスペースを指定する必要がある場合があります。

**For deletion of the cert **
kubectl delete secret -n `namespace`

**For creation of new cert to specific namespace **
kubectl create secret {your-cert-name} --key /etc/certs/{name}.com.key --cert /etc/certs/{name}.com.crt -n {namespace} ```

0

私はこれを使いました、そしてそれは魅力のように働きました:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

docker-server = https://index.docker.io/v1/docker場合)

詳細:https : //kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-by-providing-credentials-on-the-command-line

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.