본문 바로가기
INFRA/DevOps

[k8s] Secret

by BTC_비웃는사나이 2023. 1. 25.

Secret이란?

  • Container가 사용하는 password, auth token, ssh key와 같은 중요한 정보를 저장
  • 민감한 구성 정보를 base64로 인코딩해서 한 곳에 모아서 관리
  • Secret 데이터 전달 방법
    • Command-line Argument
    • Environment Variable
    • Volume Mount
  • Available command에 따라 들어가는 옵션이 달라짐
    • docker-registry : create a secret for use with a Docker registry
    • generic : create a secret from a local file, directory or literal value
    • tls : create a TLS secret
  • type
    • Opaque : 임의의 사용자 정의 데이터
    • kubernetes.io/service-account-token : service account token
    • kubernetes.io/dockercfg : 직렬화 된(serialized) ~/.dockercfg 파일
    • kubernetes.io/dockerconfigjson : 직렬화된 ~/.docker/config.json 파일
    • kubernetes.io/basic-auth : 기본 인증을 위한 자격 증명 (credential)
    • kubernetes.io/ssh-auth : SSH를 위한 자격 증명
    • kubernetes.io/tls : TLS 클라이언트나 서버를 위한 데이터
    • bootstrap.kubernetes.io/token : bootstrap token data
  • Secret etcd에 암호화 하지 않은 텍스트로 저장되므로 secret value가 커지면 메모리 용량을 많이 사용하게 됨
  • Secret의 최대 크기는 1MB

<이미지 출처 : [따배쿠] 11. Kubernetes Secret >

 

Secret 생성

  • secret으로 보관할 nginx config 파일 생성
vi 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;
    }
}

 

  • secret 생성
kubectl create secret generic ttabae-secret --from-literal=INTERVAL=2 --from-file=./genid-web-config/

 

  • secret 확인
kubectl get secrets

NAME                  TYPE                                  DATA   AGE
default-token-qhsqj   kubernetes.io/service-account-token   3      58m
ttabae-secret         Opaque                                2      43m
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 secret ttabae-secret -o yaml

apiVersion: v1
data:
  INTERVAL: Mg==
  nginx-config.conf: c2VydmVyIHsKICAgIGxpc3RlbiAgIDgwOwogICAgc2VydmVyX25hbWUgIHd3dy5leGFtcGxlLmNvbTsKCiAgICBnemlwIG9uOwogICAgZ3ppcF90eXBlcyB0ZXh0L3BsYWluIGFwcGxpY2F0aW9uL3htbDsKCiAgICBsb2NhdGlvbiAvIHsKICAgICAgICByb290ICAgL3Vzci9zaGFyZS9uZ2lueC9odG1sOwogICAgICAgIGluZGV4ICBpbmRleC5odG1sIGluZGV4Lmh0bTsKICAgIH0KfQo=
kind: Secret
metadata:
  creationTimestamp: "2022-06-14T04:58:00Z"
  name: ttabae-secret
  namespace: default
  resourceVersion: "4854"
  uid: 52bfcec0-0d2a-431e-9edc-246bd2f1445d
type: Opaque

 

Secret 사용

  • secret을 사용할 pod 생성
cat genid-env-secret.yaml

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: {}
kubectl create -f genid-env-secret.yaml
curl 192.168.178.193
                                                           
+--------------------+
| Gilda Doyle        |
| 726 New First Rd   |
| Raleigh, NC  27611 |
| (919) xxx-xxxx     |
+--------------------+

 

  • secret을 volume으로 선언한 pod 생성 및 확인
vi genid-volume-secret.yaml

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
kubectl create -f genid-volume-secret.yaml
kubectl get pods

NAME                  READY   STATUS    RESTARTS   AGE
genid-env-secret      2/2     Running   0          7m13s
genid-volume-secret   2/2     Running   0          23s

 

  • base64로 인코딩 된 정보를 application에서는 디코딩 하여 사용하는 것을 확인
kubectl exec -it genid-volume-secret -c web-server -- /bin/bash
cat /etc/nginx/conf.d/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;
    }
}
df -h

Filesystem      Size  Used Avail Use% Mounted on
overlay          29G  4.2G   25G  15% /
tmpfs            64M     0   64M   0% /dev
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/root        29G  4.2G   25G  15% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           7.7G  4.0K  7.7G   1% /etc/nginx/conf.d       //마운트 확인 가능
tmpfs           7.7G   12K  7.7G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           3.9G     0  3.9G   0% /proc/acpi
tmpfs           3.9G     0  3.9G   0% /proc/scsi
tmpfs           3.9G     0  3.9G   0% /sys/firmware
ls -l /etc/nginx/conf.d/

total 0
lrwxrwxrwx 1 root root 24 Jun 14 06:46 nginx-config.conf -> ..data/nginx-config.conf

 

참고 : [따배쿠] 11. Kubernetes Secret

'INFRA > DevOps' 카테고리의 다른 글

[k8s] Pod Scheduling  (1) 2023.02.06
[K8s] Multi-master - HA Kuberenetes cluster 운영  (0) 2023.01.30
[K8s] ConfigMap  (0) 2023.01.16
[k8s] Canary Deployment  (0) 2023.01.09
[K8s] Annotation  (0) 2023.01.03

댓글