Skip to main content

Secret


Secret

apiVersion: v1
kind: Secret
metadata:
name: <name>
namespace: <namespace>
type: Opaque
# true로 설정하 kube-apiserver가 자동 업데이트를 위한 감시를 하지 않기 때문에 성능 향상을
# 기대할 수 있습니다면
immutable: false
data:
<key>: <base64value>

Pod와 연결


  • Secret과 Pod는 같은 namespace에 있어야 합니다
  • mount된 Secret이 업데이트 되면 해당 파일도 자동으로 업데이트 됩니다
  • subPath를 사용한 경우 업데이트 되지 않습니다
  • env로 설정한 경우 업데이트 되지 않습니다

Secret을 volumes로 사용

apiVersion: v1
kind: Pod
metadata:
name: <name>
namespace: <namespace>
spec:
containers:
- volumeMounts:
- name: <volumeName>
# <mountPath>가 존재하는 경우 덮어씁니다
mountPath: <mountPath>
readOnly: true
volumes:
- name: <volumeName>
secret:
name: <secretName>
# optional: false
# defaultMode: 0644
# items:
# - key: <key>
# path: <path>
apiVersion: v1
kind: Pod
metadata:
name: <name>
namespace: <namespace>
spec:
containers:
- volumeMounts:
- name: <volumeName>
# <mountPath>가 존재하더라도 덮어쓰지 않고 <subPath>만 추가됩니다
mountPath: <mountPath>/<subPath>
subPath: <subPath>
readOnly: true
volumes:
- name: <volumeName>
secret:
name: <secretName>
# optional: false
# defaultMode: 0644
items:
# 선언하지 않으면 key가 path로 사용됩니다
# path와 <subPath>가 일치해야합니다
- key: <key>
path: <subPath>

Secret을 env로 사용

apiVersion: v1
kind: Pod
metadata:
name: <name>
namespace: <namespace>
spec:
containers:
- env:
# export <env>=<value>
- name: <env>
valueFrom:
secretKeyRef:
name: <secretName>
key: <key>
# optional: false
apiVersion: v1
kind: Pod
metadata:
name: <name>
namespace: <namespace>
spec:
containers:
- envFrom:
# export <key>=<value>
- secretRef:
name: <secretName>

imagePullSecrets

apiVersion: v1
kind: Pod
metadata:
name: <name>
namespace: <namespace>
spec:
imagePullSecrets:
- name: <secretName>

Pod가 이미지를 가져올 때 사용할 컨테이너 레지스트리와 인증 정보를 Secret을 통해 설정할 수 있습니다.

kubernetes.io/dockerconfigjson

apiVersion: v1
kind: Secret
metadata:
name: <name>
namespace: <namespace>
type: kubernetes.io/dockerconfigjson
stringData:
.dockerconfigjson: '{"auths":{"<registry>":{"auth":"<base64(username:token)>"}}}'
  • auth: echo -n "<username>:<token>" | base64
  • username
  • password
  • email

ServiceAccount Token

만료되는 토큰 자동 생성(TokenRequest)

apiVersion: v1
kind: Pod
metadata:
name: <name>
namespace: <namespace>
spec:
serviceAccountName: <serviceAccountName>
automountServiceAccountToken: true

위와 같이 automountServiceAccountToken을 true로 설정하면 아래와 같이 TokenRequest를 통해 토큰을 자동으로 생성하여 컨테이너에 마운트합니다

apiVersion: v1
kind: Pod
spec:
containers:
- volumeMounts:
- name: kube-api-access-<hash>
mountPath: /var/run/secrets/kubernetes.io/serviceaccount
readOnly: true
volumes:
- name: kube-api-access-<hash>
projected:
defaultMode: 420 # 0644
sources:
- serviceAccountToken:
path: token
expirationSeconds: 3607
- configMap:
name: kube-root-ca.crt
items:
- key: ca.crt
path: ca.crt
- downwardAPI:
items:
- path: namespace
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace

만료되지 않는 토큰 생성

apiVersion: v1
kind: Secret
metadata:
name: <name> # <serviceAccountName>.service-account-token
namespace: <namespace>
annotations:
kubernetes.io/service-account.name: <serviceAccountName>
type: kubernetes.io/service-account-token

갱신이 필요한 토큰이 아니기 때문에 volumeMountsenv 중 편한 방법을 선택하면 됩니다.

apiVersion: v1
kind: Pod
spec:
containers:
- env:
- name: K8S_ACCESS_TOKEN
valueFrom:
secretKeyRef:
name: <secretName>
key: token