본문 바로가기

Kubernetes

[Kubernetes] Secret

반응형

ConfigMap과 Secret

 - ConfigMap : 컨테이너 구성 정보를 한곳에 모아서 관리

 - Secret : 컨테이너가 사용하는 password, auth token, ssh key와 같은 중요한 정보를 저장하고 민감한 구성정보를

   base64로 인코딩해서 한곳에 모아서 관리 

 - 민감하지 않은 일반 설정파일 configmap을 사용하고 민감한 데이터는 secret을 사용

 - Secret 데이터 전달 방법

  1. Command-line Agrument

  2. Environment Variable

  3. Volume Mount

Secret 만들기

kubectl create secret <Available Commands> name [flags] [options]

※ Available Commands 로 3개 타입을 사용할 수 있고, 3개 중 1개를 꼭 사용해야함

   또한, Available Commands에 따라 들어가는 옵션이 달라짐

 1. docker-registry : Create a secret for use with a Docker registry

 2. generic : Create a secret from a local file, directory or literal value

 3. tls : Create a TLS secret

 

genid-web-config 디렉토리 내 cat nginx-config.conf 준비 

genid-web-config# cat nginx-config.conf 
server {
    listen   80;
    server_name  www.example.com;

    gzip on;
    gzip_types text/plain application/xml;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

 

generic 타입의 secret를 생성

# kubectl create secret generic ttabae-secret --from-literal=INTERVAL=2 --from-file=./genid-web-config/
secret/ttabae-secret created

# kubectl get secrets 
NAME            TYPE     DATA   AGE
ttabae-secret   Opaque   2      5m42s

 

※ Secret 타입

tyep 의미
Opaque 임의의 사용자 정의 데이터
kubernetes.io/service-account-token 서비스 어카운트 토큰
kubernetes.io/dockercfg 직렬화 된(serialized) ~/.dockercfg 파일
kubernetes.io/dockerconfigjson 직렬화 된 ~/.docker/config.json 파일
kubernetes.io/basic-auth 기본 인증을 위한 자격 증명(credentail)
kubernetes.io/ssh-auth SSH를 위한 자격 증명
kubernetes.io/tls TLS 클라이언트나 서버를 위한 데이터
bootstrap.kubernetes.io/token 부트스트랩 토큰 데이

 

describe와 yaml 형식으로 secret의 정보를 확인해보면 바이트 정보와 인코딩된 정보밖에 확인이 안된다.

대신, pod로 전달될때는 디코딩 되어 전달된다. (민감한 정보에 사용)

# kubectl describe secrets ttabae-secret 
Name:         ttabae-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
INTERVAL:           1 bytes
nginx-config.conf:  218 bytes

# kubectl get secrets ttabae-secret -o yaml 
apiVersion: v1
data:
  INTERVAL: Mg==
  nginx-config.conf: c2VydmVyIHsKICAgIGxpc3RlbiAgIDgwOwogICAgc2VydmVyX25hbWUgIHd3dy5leGFtcGxlLmNvbTsKCiAgICBnemlwIG9uOwogICAgZ3ppcF90eXBlcyB0ZXh0L3BsYWluIGFwcGxpY2F0aW9uL3htbDsKCiAgICBsb2NhdGlvbiAvIHsKICAgICAgICByb290ICAgL3Vzci9zaGFyZS9uZ2lueC9odG1sOwogICAgICAgIGluZGV4ICBpbmRleC5odG1sIGluZGV4Lmh0bTsKICAgIH0KfQo=
kind: Secret
metadata:
  creationTimestamp: "2022-12-21T02:25:53Z"
  name: ttabae-secret
  namespace: default
  resourceVersion: "149454"
  uid: 00168cd8-f63c-4a40-a1dc-5616aa40a357
type: Opaque

Secret 사용하기

 - 정의된 Secret을 Pod의 Cotainer에 전달하는 방법

  1. environment variable로 전달

  2. Command-line Argument로 전달

  3. Volume에 secret을 사용하여 컨테이너 디렉토리에 Mount

 

genid-env-secret.yaml

 - 생성한 secret을 컨테이너 환경변수(env)로 전달

apiVersion: v1
kind: Pod
metadata:
  name: genid-env-secret
spec:
  containers:
  - image: smlinux/genid:env
    env:
    - name: INTERVAL
      valueFrom:
        secretKeyRef:
          name: ttabae-secret
          key: INTERVAL
    name: fakeid-generator
    volumeMounts:
    - name: html
      mountPath: /webdata
  - image: nginx:1.14
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
  volumes:
  - name: html
    emptyDir: {}

 

2초마다 랜덤한 키 파일 생성 확인 가능

# kubectl create -f genid-env-secret.yaml 
pod/genid-env-secret created

# kubectl get pods -o wide
NAME               READY   STATUS    RESTARTS      AGE   IP          NODE                NOMINATED NODE   READINESS GATES
genid-boy          2/2     Running   2 (37m ago)   12h   10.36.0.2   node1.example.com   <none>           <none>
genid-env-secret   2/2     Running   0             6s    10.36.0.3   node1.example.com   <none>           <none>
genid-stone        2/2     Running   2 (36m ago)   12h   10.44.0.1   node2.example.com   <none>           <none>
genid-volume       2/2     Running   2 (36m ago)   12h   10.44.0.2   node2.example.com   <none>           <none>

# curl 10.36.0.3
+----------------------+
| Brianna Williams     |
| 298 West Street Terr |
| Massillon, OH  44646 |
| (216) xxx-xxxx       |
+----------------------+
# curl 10.36.0.3
+-------------------+
| Rocco Summers     |
| 737 Cooper St     |
| Beloit, WI  53511 |
| (608) xxx-xxxx    |
+-------------------+
# curl 10.36.0.3
+-------------------+
| Pauline Aguirre   |
| 731 Rider Blvd    |
| Dayton, OH  45401 |
| (513) xxx-xxxx    |
+-------------------+

 

genid-volume-secret.yaml 

 - 생성한 secret을 컨테이너 volume mount로 전달

apiVersion: v1
kind: Pod
metadata:
  name: genid-volume-secret
spec:
  containers:
  - image: smlinux/genid:env
    env:
    - name: INTERVAL
      valueFrom:
        secretKeyRef:
          name: ttabae-secret
          key: INTERVAL
    name: fakeid-generator
    volumeMounts:
    - name: html
      mountPath: /webdata
  - image: nginx:1.14
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    - name: config
      mountPath: /etc/nginx/conf.d
      readOnly: true
    ports:
    - containerPort: 80
  volumes:
  - name: html
    emptyDir: {}
  - name: config
    secret:
      secretName: ttabae-secret
      items:
      - key: nginx-config.conf
        path: nginx-config.conf

 

동작중인 pod에 접근하여 파일 확인

 - pod에 접근하면 secret의 내용은 디코딩 되어서 텍스트 값으로 확인 할 수 있다.

# kubectl create -f genid-volume-secret.yaml
pod/genid-volume-secret created

# kubectl get pods -o wide
NAME                  READY   STATUS    RESTARTS      AGE     IP          NODE                NOMINATED NODE   READINESS GATES
genid-boy             2/2     Running   2 (41m ago)   12h     10.36.0.2   node1.example.com   <none>           <none>
genid-env-secret      2/2     Running   0             4m24s   10.36.0.3   node1.example.com   <none>           <none>
genid-stone           2/2     Running   2 (40m ago)   12h     10.44.0.1   node2.example.com   <none>           <none>
genid-volume          2/2     Running   2 (40m ago)   12h     10.44.0.2   node2.example.com   <none>           <none>
genid-volume-secret   2/2     Running   0             6s      10.44.0.3   node2.example.com   <none>           <none>

# kubectl exec -it genid-volume-secret -c web-server -- /bin/bash 

root@genid-volume-secret:/# cd /etc/nginx/conf.d/
root@genid-volume-secret:/etc/nginx/conf.d# ls
nginx-config.conf
root@genid-volume-secret:/etc/nginx/conf.d# cat nginx-config.conf 
server {
    listen   80;
    server_name  www.example.com;

    gzip on;
    gzip_types text/plain application/xml;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
root@genid-volume-secret:/etc/nginx/conf.d# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          20G   13G  5.6G  70% /
tmpfs            64M     0   64M   0% /dev
tmpfs           485M     0  485M   0% /sys/fs/cgroup
/dev/sda5        20G   13G  5.6G  70% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           870M  4.0K  870M   1% /etc/nginx/conf.d
tmpfs           870M   12K  870M   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           485M     0  485M   0% /proc/acpi
tmpfs           485M     0  485M   0% /proc/scsi
tmpfs           485M     0  485M   0% /sys/firmware
root@genid-volume-secret:/etc/nginx/conf.d# ls -l
total 0
lrwxrwxrwx 1 root root 24 Dec 21 02:50 nginx-config.conf -> ..data/nginx-config.conf

Secret 데이터 용량 제한

 - Secret etcd에 암호화 하지 않은 텍스트로 저장되므로 secret value가 커지면 메모리 용량을 많이 사용하게 됨

 - secret의 최대 크기는 1MB (configmap도 동일)

 

 

[참고]

- https://www.youtube.com/watch?v=aW2RAVnOHFY

반응형

'Kubernetes' 카테고리의 다른 글

[Kubernetes] Pod Scheduling  (1) 2023.01.26
[Kubernetes] Istio 정리  (0) 2023.01.25
[Kubernetes] ConfigMap  (0) 2022.12.20
[Kubernetes] kubernetes Canary Deployment  (0) 2022.12.17
[Kubernetes] Annotation  (0) 2022.12.17