woonizzooni

Kubernetes - Secret 이용한 환경 설정 본문

Kubernetes

Kubernetes - Secret 이용한 환경 설정

woonizzooni 2020. 11. 5. 14:34

 

ConfigMap과 사용 방법/방식 자체는 거의 동일하다고 봐도 무방함.

"Kubernetes - ConfigMap 이용한 환경설정"

 

 

o 설정값 확인을 위해 환경 구성

  - base64, jwt 명령어 실행 가능한 상태로.. (현재 MacOS 터미널 기준으로 설명)

    $ which base64

      /usr/bin/bas64

    $ brew tap mike-engel/jwt-cli

    $ brew install jwt-cli

 

o Secrets 목록 조회 / 설정값 확인 예시

> 목록 조회
 $ kubectl get secrets
 NAME                   TYPE                                  DATA   AGE
 ...
 newrelic-token-z69sn   kubernetes.io/service-account-token   3      20d

> 내용 확인
 $ kubectl describe secrets newrelic-token-z69sn
 Name:         newrelic-token-z69sn
 Namespace:    default
 Labels:       <none>
 Annotations:  kubernetes.io/service-account.name: newrelic
              kubernetes.io/service-account.uid: 51b55566-44a9-4d38-9534-4dbdae350d65

 Type:  kubernetes.io/service-account-token

 Data
 ====
 ca.crt:     1025 bytes
 namespace:  7 bytes
 token:      eyJhbGciOiJSUz****...


> 디코딩 (실제 값 조회)
 $ kubectl get secrets newrelic-token-z69sn -o jsonpath='{.data.token}' | base64 --decode | jwt decode -

 Token header
 ------------
 {
   "alg": "RS256",
   "kid": "***"
 }

 Token claims
 ------------
 {
   "iss": "kubernetes/serviceaccount",
   "kubernetes.io/serviceaccount/namespace": "default",
   "kubernetes.io/serviceaccount/secret.name": "newrelic-token-z69sn",
   "kubernetes.io/serviceaccount/service-account.name": "newrelic",
   "kubernetes.io/serviceaccount/service-account.uid": "**-44a9-4d38-9534-4d**",
   "sub": "system:serviceaccount:default:newrelic"
 }

 

o 내 컨테이너에 Secert 적용하기

 

1. 대상 정하고 base64로 인코딩 하기

  - 예시를 ~/.aws/credentials 파일을 대상으로 선정

    $ cat ~/.aws/credentials

    [default] 
    aws_access_key_id = ABCDEFG
    aws_secret_access_key = aAbBcCdDeEfFgG

 

    $ cat ~/.aws/credentials | base64 <-- jwt 인코딩은 하지 않고 base64만 하겠음.

    KkKkKkKkKkKk.... <-- 이 값을 대상임

 

  - 하다보니.... 애매(?)한 현상이 생기던데..

     macos에서 base64로 인코딩하면 인코딩된 문자열 마지막에 ‘\n’이 포함되어 있음.

 

    macos의 경우,

      $ echo “my_password” | base64

        Kkkkkk\n <— \n이 포함되어 있음.

    linux에서는,

      $ echo -n “my_password” | base64 -w 0

        Kkkkkk <— \n이 포함되어 있지 않음

 

    이런 경우를 고려한다면 값으로 접근할 때 

    golang의 경우 아래와 같은 처리를 하면 안전할 듯…. (대충 아래와 같이?)

      import b64 "encoding/base64"

        ...

         data := "YmFzZTY0IGVuY29kZWQgc3RyaW5n"

         sDec := b64.StdEncoding.DecodeString(data)

         sDec = strings.TrimRight(sDec, "\r\n"

 

 

2. Secrets 구성

apiVersion: v1
kind: Secret
metadata:
  name: secret-config
  namespace: my-ns 
type: Opaque
data:
   credentials: "KkKkKkKkKk..."

 

3. Workload(Pod, Deployment, ..)에서 Secret 접근/사용하기

(ex1) 파일로 접근

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-app 
  name: my-app 
  namespace: my-ns 
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  ...
  template:
      labels:
        app: my-app 
    spec:
     ...
     containers:
      - image: {{myContainerImage:latest}} 
        name: my-app
        ...
        env:
        - name: REDIS_ADDR
        ....
        volumeMounts:
        - namemysecret
          mountPath/root <-- 홈 위치
        ...
      volumes:
      - namemysecret
        secret:
          secretNamesecret-config
          items:
          - key: credentials
            path: .aws/credentials
          ...
...
(ex2) 환경 변수로 접근

apiVersion: apps/v1 
kind: Deployment 
metadata: 
  labels: 
    app: my-app 
  name: my-app 
  namespace: my-ns 
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: my-app
  ...
  template: 
      labels: 
        app: my-app 
    spec: 
     ...
     containers: 
      - image: {{myContainerImage:latest}} 
        name: my-app
        ...
        env: 
        - name: myCredentials <-- getenv() ...
          valueFrom:
            secretKeyRef:
              name: secret-config 
              key: credentials 
    ...

kubectl exec 쉘 진입 혹은 명령어 입력으로

/root/.aws/credntials 파일이 링크 걸려있거나(마운트 위치),

env명령으로 환경 변수에 적용 내용을 확인해보면 되겠다.

 

 

 

> 파일

> 환경 변수

 

 

[참고]

kubernetes.io/ko/docs/concepts/configuration/secret/

 

Comments