Secret 이해에서 설명한 시크릿의 종류 중에 TLS, Docker 레지스트리, Basic, SSH 시크릿을 생성하는 방법을 알본다.

 

1. TLS

인그레스 등에서 사용하는 TLS 인증서를 시크릿으로 생성할 때 사용하는 시크릿 타입이다. 데이터 스키마로는 tls.crt 와 tls.key 를 가진다. 매니페스트에 직접 시크릿 값을 지정할 수도 있지만, 인증서 비밀키와 인증서 파일로 지정하는 것이 일반적이다.

샘플로 사용하기 위한 자체 서명 인증서를 아래 커맨드로 생성한다.

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout ~/tls.key -out ~/.tls.crt -subj "/CN=sample1.example.com"

아래 커맨드로 key 파일과 인증서 파일 경로를 지정하여 tls 타입 인증서를 생성한다.

$ kubectl create secret tls --save-config tls-sample \
> --key ~/tls.key --cert ~/.tls.crt

 

2. Docker 레지스트

도커 허브 같은 도커 레지스트리의 private 저장소를 사용중이라면, 이미지를 업로드/다운로드 하기 위해 인증이 필요하다. k8s 에서는 이러한 인증 정보를 저장하기 위해 docker-registry 타입의 시크릿을 사용한다. .dockerconfigjson 데이터 스키마를 가지는 시크릿이다.

매니페스트로도 생성할 수 있지만, 형식이 특수하기 때문에 일반적으로 kubectl 로 직접 생성한다.

$ kubectl create secret docker-registry --save-config sample-registry-auth \
  --docker-server=REGISTRY_SERVER \
  --docker-username=REGISTRY_USER \
  --docker-password=REGISTRY_USER_PASSWORD \
  --docker-email=REGISTRY_USER_EMAIL

 

값으로는 자신이 사용하는 저장소와 계정정보를 넣으면 된다. 아래 커맨드로 시크릿을 조회해보면 dockerconfig json 문자열 자체가 base64 인코딩되어있다. 따라서 매니페스트에 작성하는 것 보다는 kubectl 로 작성하거나, 매니페스트로 저장하고 생성하고 싶다면 --dry-run -o yaml 하여 리다이렉트한 파일을 만들어 apply 하는 것이 좋다.

$ kubectl get secrets sample-registry-auth -o json | jq '.data'
{
  ".dockerconfigjson": "eyJhdXRocyI6eyJSRUdJU1RSWV9TRVJWRVIiOnsidXNlcm5hbWUiOiJSRUdJU1RSWV9VU0VSIiwicGFzc3dvcmQiOiJSRUdJU1RSWV9VU0VSX1BBU1NXT1JEIiwiZW1haWwiOiJSRUdJU1RSWV9VU0VSX0VNQUlMIiwiYXV0aCI6IlVrVkhTVk5VVWxsZlZWTkZVanBTUlVkSlUxUlNXVjlWVTBWU1gxQkJVMU5YVDFKRSJ9fX0="
}

$ kubectl get secrets sample-registry-auth -o json | jq -r '.data[".dockerconfigjson"]' | base64 --decode
{"auths":{"REGISTRY_SERVER":{"username":"REGISTRY_USER","password":"REGISTRY_USER_PASSWORD","email":"REGISTRY_USER_EMAIL","auth":"UkVHSVNUUllfVVNFUjpSRUdJU1RSWV9VU0VSX1BBU1NXT1JE"}}}

 

docker-registry 시크릿을 실제 이미지를 다운받는 파드에서 사용하려면, 파드 매니페스트의 spec.imagePullSecrets[] 에 시크릿을 지정해주면 된다. 파드에는 여러 컨테이너가 존재할 수 있으므로(멀티 컨테이너 파드) imagePullSecrets 도 배열로 지정한다.(컨테이너 각각에 시크릿을 설정하는 방법은 없다.)

apiVersion: v1
kind: Pod
metadata:
  name: sample-pull-secret
spec:
  containers:
    - name: secret-image-container
      image: REGISTRY_NAME/secret-image:latest
  imagePullSecrets:
    - name: sample-registry-auth

멀티 컨테이너에서 각각의 이미지 저장소가 다르다면, 아래와 같은 매커니즘으로 시크릿을 탐색한다.

  1. kubelet이 이미지 pull
  2. imagePullSecrets에 등록된 Secret들을 순서대로 모두 시도
  3. 해당 레지스트리에 매칭되는 인증 정보가 있으면 성공

또 다른 방법은, Secret 1개에 여러 레지스트리 인증정보를 집어넣는 것이다. 아래처럼 지정된 형식의 json 구조에 인증정보를 저장해 두고, Secret 생성시 .dockerconfigjson 이라는 key 로 지정하여 생성하면 된다.

// dockerconfigjson 파일 내용
{
  "auths": {
    "registry-a.example.com": {
      "auth": "dXNlcjpwYXNz"
    },
    "registry-b.example.com": {
      "auth": "dXNlcjI6cGFzczI="
    }
  }
}

 

아래 커맨드로 Secret 을 생성한다.

$ kubectl create secret --save-config sample-multi-registry-secret \
  --type=kubernetes.io/dockerconfigjson \
  --from-file=.dockerconfigjson=./dockerconfigjson

 

3. Basic

id, password 기반의 인증인 경우에 적합한 시크립 타입이다. username, password 데이터 스키마를 지정해야 한다.

kubectl 로 생성시 --type kubernetes.io/basic-auth 와 --from-literal 로 인증정보를 지정하여 생성하거나, 아래와 같은 매니페스트로 생성한다.

apiVersion: v1
kind: Secret
metadata:
  name: sample-basic-auth
type: kubernetes.io/basic-auth
data:
  username: cm9vdA== # root
  password: cm9vdHBhc3N3b3Jk # rootpassword

 

4. SSH

비밀키로 인증하는 시스템인 경우 SSH 인증용 스키마를 가진 ssh-auth 타입 시크릿을 사용한다. ssh-privatekey 라는 데이터 스키마를 사용하는 타입이다. 비밀키 파일이 크기 때문에 일반적으로 kubectl 로 --from-file 옵션으로 비밀키 파일을 지정하여 생성한다. 마찬가지로 매니페스트 파일로 생성하여 apply 하려면 --dry-run -o yaml 리다이렉션 하여 사용한다.

아래 커맨드를 이용하여 샘플 키를 생성하고 이를 기반으로 SSH 시크릿을 생성한다.

$ ssh-keygen -t rsa -b 2048 -f sample-key -C "sample"

$ kubectl create secret generic --save-config sample-ssh-auth \
> --type kubernetes.io/ssh-auth \
> --from-file=ssh-privatekey=./sample-key
secret/sample-ssh-auth created

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,