[k8s] 시크릿

장동균·2023년 4월 30일

쿠버네티스 입문 (동양북스) 11장을 요약한 내용입니다.

echo 명령어를 통해 encode/decode 수행하기

$ echo cGFzc3dvcmQ= | base64 --decode
password

$ echo dXNlcm5hbWU= | base64 --decode
username

$ echo -n "password" | base64
cGFzc3dvcmQ=

$ echo -n "username" | base64
dXNlcm5hbWU=

secret 파일 예제

# user-pass-yaml.yaml
apiVersion: v1
kind: Secret
metadata:
  name: user-pass-yaml
type: Opaque
data:
  username: dXNlcm5hbWU=
  password: cGFzc3dvcmQ=

중요한 점은 data.username, data.password 필드 값을 설정할 때 base64 인코딩값으로 설정해야 한다는 점이다. 참고로 필드 값에 JSON이나 yaml 파일 이름을 넣을 때도 base64 문자 인코딩값을 설정해야한다.


secret type

타입설명
Opaquekey-value 형식으로 임의의 데이터를 설정할 수 있음 (default)
kubernetes.io/service-account-token쿠버네티스 인증 토큰을 저장함
kubernetes.io/dockercfg도커 저장소 환경 설정 정보를 저장함
kubernetes.io/dockerconfigjson도커 저장소 인증 정보를 저장함
kubernetes.io/basic-auth기본 인증을 위한 자격 증명을 저장함
kubernetes.io/ssh-authSSH 접속을 위한 자격 증명을 저장함
kubernetes.io/tlsTLS 인증서를 저장함
bootstrap.kubernetes.io/token부트스트랩 토큰 데이터 정보를 저장함

파드의 환경 변수로 시크릿 사용하기

apiVersion: apps/v1
kind: Deployment
# ...
spec:
  # ...
  template:
    metadata:
      labels:
        app: secretapp
    spec:
      containers:
      - name: testapp
        image: ${이미지 경로}:latest
        ports:
        - containerPort: 8080
        env:
        - name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: user-pass-yaml
              key: username
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: user-pass-yaml
              key: password
            

SECRET_USERNAME=${user-pass-yaml 파일의 key 값이 username에 해당하는 value}
SECRET_PASSWORD=${user-pass-yaml 파일의 key 값이 password에 해당하는 value}


볼륨 형식으로 파드에 시크릿 제공

apiVersion: apps/v1
kind: Deployment
# ...
spec:
  # ...
  template:
    metadata:
      labels:
        app: secretapp
    spec:
      containers:
      - name: testapp
        image: ${이미지 경로}:latest
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: volume-secret
          mountPath: "/etc/volume-secret"
          readOnly: true
      volumes:
      - name: volume-secret
        secret:
          secretName: user-pass-yaml

/etc/volume-secret 디렉터리를 지정해 시크릿 설정 내용을 파일 형태로 저장한다.
volume-secret이라는 볼륨의 필드 값으로 user-pass-yaml 시크릿을 설정한다.

해당 yaml 파일을 실행하게 되면 /etc/volume-secret 폴더 내부에 password, username 2개의 파일이 생성되고 파일의 내용은 시크릿의 value로 채워진다.

/etc/volume-secret # ls
password username
/etc/volume-secret # cat password
password

환경 변수로 사용하든, 볼륨 형식으로 사용하든 시크릿 내용을 파드 안에서 사용할 때는 base64 문자 디코딩한 값이 사용된다. (때문에 위의 터미널에서 인코딩된 문자열이 노출되는 것이 아니라 password 그대로의 원문이 노출된다.)


프라이빗 컨테이너 이미지를 가져올 때 시크릿 사용하기

보통 컨테이너 이미지를 가져올 때는 대부분 공개된 이미지를 사용한다.
물론 프라이빗 이미지를 사용할 수도 있는데 인증 정보가 필요하다. 로컬 서버라면 프라이빗 컨테이너 이미지 사용 권한을 저장한 후 사용할 수 있지만, 쿠버네티스 클러스터에서는 보안상의 위험이 있기 때문에 그렇게 설정하지 않는다. 인증 정보를 시크릿에 설정해 저장한 후 사용한다.

k8s에서는 kubectl create secret의 하위 명령으로 도커 컨테이너 이미지 저장소용 시크릿을 만드는 docker-registry가 있다.

kubectl create secret docker-registry dockersecret --docker-username=USERNAME --docker-password=PASSWORD --docker-email=EMAIL --docker-server=https://index.docker.io/v1/

도커 컨테이너 이미지 저장소를 직접 설치해서 사용하거나 공식 도커 허브가 아닌 다른 컨테이너 이미지 저장소를 사용한다면 해당 저장소 주소로 --docker-server 옵션값을 변경해야 한다. 그외 USERNAME, PASSWORD, EMAIL 부분은 사용자 정보로 설정해야 한다.

위의 명령어를 통해 만들어지는 secret 파일의 타입은 kubernetes.io/dockerconfigjson이 된다.

해당 시크릿은 다음과 같이 적용한다.

apiVersion: apps/v1
kind: Deployment
# ...
spec:
  # ...
  template:
    metadata:
      labels:
        app: secretapp
    spec:
      containers:
      - name: testapp
        image: ${이미지 경로}:latest
        ports:
        - containerPort: 8080
      imagePullSecrets:
      - name: dockersecret

=> 해당 스펙의 이미지를 pull 할 때 사용할 시크릿 정보들은 dockersecret 파일에 존재한다.

profile
프론트 개발자가 되고 싶어요

0개의 댓글