파일에서 생성 될 때 Kubernetes에서 비밀을 업데이트하려면 어떻게해야합니까?


97

을 사용하여 비밀을 만들었습니다 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에 출력을 영리하게 사용하고 명령을 적용하는 것이 좋습니다. +1
Kevin Mansel

10
K8S의 최신 버전에서는 제공해야합니다 --save-config받는 kubectl create secretCLI를 경고를 방지하기 위해.
David House

fyi, tls secret에서 작동하는 최근 (2019 년 9 월) 구문 : 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 변수를 통해 비밀을 얻거나 볼륨으로 마운트되었는지 여부에 관계없이 영향을받지 않습니다. 비밀이없는 상태에서 포드 i가 시작되면 오류가 발생합니다. 따라서 Janos의 대답은 선호되는 방법입니다.
PJMeisch

2
예, 사용 apply하는 것이 훨씬 더 의미가 있습니다. 감사합니다!
BrunoJCM

나는 잊었 때문에 나를 위해 작동하지 않는--namespace=kube-system
Souradeep 난다을

비밀을 추가하려는 네임 스페이스에 따라 다르며, 기본 이 아니라면 물론 네임 스페이스 인수를 추가해야합니다.
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접근 방식 만큼 우아하거나 단순하지는 않지만 기술적으로이 접근 방식은 값을 삭제 / 다시 생성하는 것이 아니라 실제로 값을 업데이트하는 것입니다. 또한 사용 가능한 jqbase64(또는 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의 '패치'방법을 사용하려고 시도했지만 작동하는 것 같습니다.

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

자세한 내용 : 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.