Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

전공공부

[K8S - CKA] Configure Secrets in Applications 본문

Study/K8S

[K8S - CKA] Configure Secrets in Applications

monitor 2023. 11. 12. 12:22

1. Secret


암호화를 사용하는 범위

 

ConfigMap 활용하여 MySQL 또는 java 파일 구성 시 Docker의 환경 설정을 지정 할 수 있겠다.

 

예시로 PW, DB_HOST 등의 설정을 구성 할 수 있다. 그러나 아래와 같이 직접적으로 쓸거면 필요가 없다.

 

apiVersion: v1
kind: ConfigMap
metadata: 
 name: app-config
data:
 DB_HOST: mysql

 

자 아래 처럼 사용해보자

 

First, Create Secret

DB_host: mysql
DB_User: root
DB_Password: passwd

 

명령 버전

k create secret generic <secret-name> --from-literal=<key>=<value>

 

--from-literal 옵션 자체가 key-value 쌍을 저장하기 위해서 쓰인다.

 

k create secret generic <secret-name> --from-file=<fileName>

 

또는, 위와 같이 파일에 저장한 옵션을 가지고 와서 가져올 수 있다.

 

Declarative 모드

 

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
data:
  DB_HOST: YWRtaW4=
  PASSWORD: MWYyZDFlMmU2N2Rm

 

음, 그러면 어떻게 인코딩을 했을까?

 

우선 아래 명령어를 쓰면 인코딩이 된다.

echo -n 'mysql' | base64

 

이렇게 지정하면 k describe secret 해도 value 값을 볼 수 없고 직접 값을 보려면

echo -n 'bXlzcWw=' | base64 --decode

 

이렇게 지정을 해야 한다.

 

Second, Configuring POD

 

1. SINGLE ENV 방식

 

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
            optional: false # 기본값과 동일하다
                            # "mysecret"이 존재하고 "username"라는 키를 포함해야 한다
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
            optional: false # 기본값과 동일하다
                            # "mysecret"이 존재하고 "password"라는 키를 포함해야 한다

 

2. ENV 방식

 

apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - secretRef:
          name: mysecret
  restartPolicy: Never

 

3. Volume 방식

 

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      optional: false # 기본값임; "mysecret" 은 반드시 존재해야 함

 

 

2. Secret 추가 정리


실제로 시크릿은 암호화 된 것이 아니고 Base64로 인코딩 된 것이므로 기본 암호를 확인 할 수 있다.

 

ETCD에서 암호화 되어 있지 않다. 허나, REST로 암호화 가능하다.

 

RBAC를 고려해서 역할 별로 접근자를 허용해야 실제로 접근 제어가 가능하다,