kubectl create secret generic empty-secret
kubectl get secret empty-secret
apiVersion: v1
kind: Secret
metadata:
name: secret-sa-sample
annotations:
kubernetes.io/service-account.name: "sa-name"
type: kubernetes.io/service-account-token
data:
# 사용자는 불투명 시크릿을 사용하므로 추가적인 키 값 쌍을 포함할 수 있다.
extra: YmFyCg==
이미지에 대한 도커 레지스트리 접속 자격 증명을 저장하기 위한 시크릿을 생성하기 위해 사용
kubernetes.io/dockercfg
data 필드가 base64 포맷으로 인코딩된 ~/.dockercfg 파일의 콘텐츠를 값으로 가지는 .dockercfg 키를 포함하고 있는지 확실히 확인해야 한다.
kubernetes.io/dockerconfigjson
data 필드가 .dockerconfigjson 키를 꼭 포함해야 하며 base64로 인코딩되어야 함
apiVersion: v1
kind: Secret
metadata:
name: secret-dockercfg
type: kubernetes.io/dockercfg
data:
.dockercfg: |
"<base64 encoded ~/.dockercfg file>"
kubectl create secret docker-registry secret-tiger-docker \
--docker-username=tiger \
--docker-password=pass113 \
--docker-email=tiger@acme.com
{
"auths": {
"https://index.docker.io/v1/": {
"username": "tiger",
"password": "pass113",
"email": "tiger@acme.com",
"auth": "dGlnZXI6cGFzczExMw=="
}
}
}
기본 인증을 위한 자격 증명을 저장하기 위해 제공된다. 이 시크릿 타입을 사용할 때는 시크릿의 data 필드가 다음의 두 키를 포함해야 한다.
username : 인증을 위한 사용자 이름
password : 인증을 위한 암호 or 토큰
⇒ 두 키에 대한 두 값은 base64로 인코딩된 문자열이다.
⇒ stringData를 사용하여 평문 텍스트 컨텐츠를 제공할 수도 있음
apiVersion: v1
kind: Secret
metadata:
name: secret-basic-auth
type: kubernetes.io/basic-auth
stringData:
username: admin
password: t0p-Secret
apiVersion: v1
kind: Secret
metadata:
name: secret-ssh-auth
type: kubernetes.io/ssh-auth
data:
# 본 예시를 위해 축약된 데이터임
ssh-privatekey: |
MIIEpQIBAAKCAQEAulqb/Y ...
apiVersion: v1
kind: Secret
metadata:
name: secret-tls
type: kubernetes.io/tls
data:
# 본 예시를 위해 축약된 데이터임
tls.crt: |
MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
tls.key: |
MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
kubectl create secret tls web-secret \
--cert=path/to/cert/file \
--key=path/to/cert/file
# File 생성
root@instance-1:~# echo -n 'testuser' > ./username.txt
root@instance-1:~# echo -n 'dkagh123!' > ./password.txt
# secret 생성
root@instance-1:~# kubectl create secret generic user-pass-secret --from-file=./username.txt --from-file=./
password.txt
secret/user-pass-secret created
# 확인
root@instance-1:~# kubectl get secrets user-pass-secret -o yaml
apiVersion: v1
data:
password.txt: ZGthZ2gxMjMh
username.txt: dGVzdHVzZXI=
kind: Secret
metadata:
creationTimestamp: "2021-02-18T11:49:45Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:password.txt: {}
f:username.txt: {}
f:type: {}
manager: kubectl-create
operation: Update
time: "2021-02-18T11:49:45Z"
name: user-pass-secret
namespace: default
resourceVersion: "151756"
uid: 74a627d4-abec-4f62-9ed6-068ca2cc09e1
type: Opaque
## Check
root@instance-1:~# echo ZGthZ2gxMjMh | base64 --decode
dkagh123!
root@instance-1:~# echo dGVzdHVzZXI= | base64 --decode
testuser
root@instance-1:~/kubernetes-sample/secret# echo -n testuser | base64
dGVzdHVzZXI=
root@instance-1:~/kubernetes-sample/secret# echo -n dkagh123! | base64
ZGthZ2gxMjMh
# vi user-pass.yaml
apiVersion: v1
kind: Secret
metadata:
name: user-pass
type: Opaque
data:
username: dGVzdHVzZXI=
password: ZGthZ2gxMjMh
root@instance-1:~/kubernetes-sample/secret# kubectl apply -f user-pass.yaml
secret/user-pass created
root@instance-1:~/kubernetes-sample/secret# kubectl get secrets
NAME TYPE DATA AGE
default-token-v59hc kubernetes.io/service-account-token 3 11d
foo-secret kubernetes.io/tls 2 3d20h
user-pass Opaque 2 5s
# vi secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
restartPolicy: Never
containers:
- name: secret-pod
image: redis
**env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: user-pass
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: user-pass
key: password**
kubectl apply -f secret-pod.yaml
root@instance-1:~/kubernetes-sample/secret# kubectl exec -it secret-env-pod -- bash
root@secret-env-pod:/data#
root@secret-env-pod:/data# echo $SECRET_USERNAME
testuser
root@secret-env-pod:/data# echo $SECRET_PASSWORD
dkagh123!
시크릿 업데이트 후 환경 변수가 자동으로 업데이트 되지 않는다.
⇒ 컨테이너가 환경 변수에서 이미 시크릿을 사용하는 경우, 다시 시작하지 않는 한 컨테이너에서 시크릿 업데이트를 볼 수 없다. 시크릿이 변경될 때 재시작을 트리거하는 Third Party 솔루션이 있으니 참고할 것 !
# vi secret-vol-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-vol-pod
spec:
containers:
- name: secret-vol-pod
image: redis
volumeMounts:
- name: vol-secret
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: vol-secret
secret:
secretName: user-pass
root@instance-1:~/kubernetes-sample/secret# kubectl apply -f secret-vol-pod.yaml
pod/secret-vol-pod created
root@instance-1:~/kubernetes-sample/secret# kubectl get pods secret-vol-pod
NAME READY STATUS RESTARTS AGE
secret-vol-pod 1/1 Running 0 57s
root@instance-1:~/kubernetes-sample/secret# kubectl exec -it secret-vol-pod -- bash
root@secret-vol-pod:/data# cd /etc/foo/
root@secret-vol-pod:/etc/foo# ls
password username
root@secret-vol-pod:/etc/foo# cat username
testuserroot@secret-vol-pod:/etc/foo#
root@secret-vol-pod:/etc/foo# cat password
dkagh123!root@secret-vol-pod:/etc/foo#
root@instance-1:~/kubernetes-sample/secret# kubectl describe secrets user-pass
Name: user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 9 bytes
username: 8 bytes
# vi secret-vol-pod.yaml 을 수정함
apiVersion: v1
kind: Pod
metadata:
name: secret-vol-pod
spec:
containers:
- name: secret-vol-pod
image: redis
volumeMounts:
- name: vol-secret
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: vol-secret
secret:
secretName: user-pass
items:
- key: username
path: my-group/my-username
user-pass 시크릿에는 username과 password가 있다.
⇒ username 시크릿 : /etc/foo/my-group/my-username 아래의 파일에 저장된다.
⇒ password 시크릿 : 생성 X