Bagaimana saya bisa memperbarui rahasia di Kubernetes ketika itu dibuat dari sebuah file?

98

Saya telah membuat rahasia menggunakan

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

Jika saya ingin memperbarui nilai - bagaimana saya bisa melakukan ini?

Chris Stryczynski
sumber

Jawaban:

245

Ini harus bekerja:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -
Janos Lenart
sumber
22
Saya suka penggunaan output yang cerdas untuk yaml dan menerapkan perintah. +1
Kevin Mansel
12
Dalam versi terbaru dari k8s, Anda harus memberikan --save-configkepada kubectl create secretuntuk menghindari peringatan CLI.
David House
fyi, sintaks terbaru (Sept 2019) yang berfungsi untuk rahasia tls: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -Sertifikat dalam teks biasa.
ldg
63

Anda dapat menghapus dan segera membuat ulang rahasianya:

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

Saya meletakkan perintah ini dalam skrip, pada panggilan pertama Anda mendapat peringatan tentang (belum) rahasia yang ada, tetapi ini berfungsi.

PJMeisch
sumber
3
apa yang terjadi dengan pod jika rahasianya dihapus?
BrunoJCM
4
Pod yang berjalan @BrunoJCM tidak terpengaruh, tidak peduli apakah pod tersebut mendapatkan rahasia melalui variabel env atau dipasang sebagai volume. Jika sebuah pod yang saya mulai pada saat tidak ada rahasia, mereka akan mengalami error; Oleh karena itu, jawaban Janos adalah cara yang lebih disukai.
PJMeisch
2
Ya, saya mengerti, menggunakan applylebih masuk akal, terima kasih!
BrunoJCM
Ini tidak berhasil untuk saya karena saya lupa--namespace=kube-system
Souradeep Nanda
1
tergantung pada namespace apa yang ingin Anda tambahkan rahasianya, jika bukan default, tentu saja Anda harus menambahkan argumen namespace.
PJMeisch
9

Alternatifnya, Anda juga dapat menggunakan jqs =or |=operator untuk memperbarui rahasia dengan cepat.

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 -

Meskipun mungkin tidak seelegan atau sesederhana kubectl create secret generic --dry-runpendekatannya, secara teknis, pendekatan ini benar-benar memperbarui nilai daripada menghapus / membuatnya kembali. Anda juga akan membutuhkan jqdan base64(atau openssl enc -base64) perintah yang tersedia, tradalah utilitas Linux yang tersedia secara umum untuk memotong baris baru yang tertinggal.

Lihat di sini untuk detail lebih lanjut tentang jqoperator pembaruan |=.

Devy
sumber
1

Karena saya tidak dapat membalas jawaban Devy di atas, yang saya suka karena ini akan mempertahankan Kepemilikan di mana menghapus dan membuat ulang berpotensi kehilangan informasi tambahan dalam catatan. Saya menambahkan ini untuk orang-orang baru yang mungkin tidak segera memahami mengapa variabel mereka tidak diinterpolasi.

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 -

Hal ini membuat saya mencoba menggunakan metode 'patch' dari kubectl, yang sepertinya juga berfungsi.

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

Terima kasih Devy atas jawaban yang paling sesuai dengan kebutuhan saya.

CJ Maahs
sumber
0

Untuk kasus yang lebih spesifik, Anda mungkin perlu menentukan namespace Anda bahwa sertifikat perlu diperbarui dan menghapus yang lama.

**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} ```
JohnBegood
sumber
0

Hanya untuk memperluas jawaban ini saya menemukan bahwa menambahkan '--ignore-not-found' ke penghapusan membantu CICD kami karena tidak akan salah jika rahasianya tidak ada, itu hanya akan melanjutkan dan membuatnya:

kubectl delete secret production-tls --ignore-not-found
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.
Ciaran George
sumber
-1

Saya telah menggunakan yang ini dan itu bekerja dengan sangat baik:

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/ (untuk DockerHub)

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

Itay Ben Shmuel
sumber