Tools/K8S

Kubernetes Secret

칼쵸쵸 2023. 7. 21. 22:26

기본적인 환경 변수 사용

환경변수는 컨테이너 내에서 설정되는 간단한 키-값 쌍으로, 애플리케이션의 동작을 조정하는 데 유용

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-app-image
      env:
        - name: ENV_VARIABLE_1
          value: "value1"
        - name: ENV_VARIABLE_2
          value: "value2"

위와 같이 ENV_VARIABLE_1 : "value1" 등의 값을 정적 설정을 통해서 사용 가능

kubectl exec -it sample-env --env | grep ENV_VARIABLE_1 으로 확인 가능함

 

아래와 같이 타임존에 대해서 UTC(기본값)을 제외한 다른 값도 변경 가능

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: alpine:latest
      env:
        - name: TZ
          value: "Asia/Seoul"

 

 

파드정보, 컨테이너 정보

fieldRef 파드 내부 또는 파드와 관련된 쿠버네티스 API 오브젝트의 필드 값을 가져와서 환경변수로 설정하는 사용.

이를 통해 쿠버네티스 클러스터의 상태 정보를 환경변수로 쉽게 사용가능

 

valueFrom fieldRef 사용하여 환경변수를 설정하는 예시

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-app-image
      env:
        - name: MY_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace

YAML 파일에서 fieldRef 사용하여 MY_NAMESPACE 환경변수를 설정. (fieldPath 파드의 metadata.namespace 값을 참조)

(컨테이너 정보는 더 이상 기본적으로 제공안함)

(주의사항 : command나 args에서 정의된 환경변수를 사용하려면 ${}이 아니라 $()을 사용해야 한다.)

시크릿

(https://kubernetes.io/docs/concepts/configuration/secret/)

쿠버네티스 시크릿(Secret)은 민감한 데이터를 안전하게 저장하고 관리하는 데 사용되는 리소스입니다. 암호, API 토큰, 데이터베이스 비밀번호 등과 같이 애플리케이션에 사용되는 민감한 정보를 안전하게 저장할 때 유용합니다. 시크릿은 Base64 인코딩된 데이터로 저장되기 때문에, 평문으로 노출되는 것을 방지하여 더욱 안전한 환경을 제공합니다.

(My sql 데이터 베이스 접속 정보 등 기밀 정보)

쿠버네티스 시크릿은 크게 두 가지 유형으로 생성될 수 있습니다:

 

1. Opaque: Opaque 시크릿은 가장 일반적인 시크릿 유형입니다. 이 유형은 사용자가 지정한 임의의 키-값 쌍을 저장할 수 있습니다. 값들은 base64로 인코딩되어 저장되므로 보안을 위해서라면 base64로 인코딩된 데이터를 다시 디코딩하는 작업이 필요합니다.

kubectl create secret generic my-opaque-secret --from-literal=key1=value1 --from-literal=key2=value2

2. TLS: TLS 시크릿은 SSL/TLS 인증서와 개인 키를 저장하는 데 사용됩니다. 주로 HTTPS를 지원하는 서비스를 배포할 때 사용되며, 인증서와 키를 쌍으로 저장하고 관리할 수 있습니다.

kubectl create secret tls my-tls-secret --cert=path/to/cert.crt --key=path/to/key.key

3. DockerConfigJSON: 이 유형의 시크릿은 Docker 레지스트리에 대한 인증 정보를 저장하는 데 사용됩니다. Docker 레지스트리에 이미지를 푸시하거나 풀(다운로드)할 때 사용자의 권한을 인증하는 데 필요한 데이터를 포함합니다.

kubectl create secret docker-registry my-docker-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USERNAME --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

4. Generic: Generic 시크릿은 Opaque 시크릿과 비슷하게 임의의 키-값 쌍을 저장하는  사용됩니다. 하지만 Generic 시크릿은 값을 base64 인코딩하지 않기 때문에 사용자가 직접 데이터를 암호화하여 저장해야 합니다.

kubectl create secret generic my-generic-secret --from-literal=key1=value1 --from-file=path/to/file.txt

5. SSH: SSH 시크릿은 SSH 키를 저장하는  사용됩니다. 이는 파드가 SSH 프로토콜을 사용하여 다른 노드에 연결해야   사용될  있습니다.

kubectl create secret generic my-ssh-secret --from-file=ssh-privatekey=path/to/id_rsa --from-file=ssh-publickey=path/to/id_rsa.pub

6. ServiceAccount: ServiceAccount 시크릿은 쿠버네티스 내부에서 사용되는 인증 정보를 포함합니다. 주로 파드(Pod)들이 API 서버와 통신할 사용되는 인증 토큰이 포함되어 있습니다. 이를 통해 파드들은 클러스터 내부의 리소스에 접근할 있습니다.

 -  쿠버네티스가 ServiceAccount를 생성하고 관리하므로 개별적인 명령어로 생성할 필요는 없음

 

7. BootstrapToken: BootstrapToken 시크릿은 쿠버네티스 클러스터의 부트스트랩 토큰을 저장하는 사용됩니다. 부트스트랩 토큰은 쿠버네티스 클러스터에 새로운 노드를 가입시키는 사용되는 인증 정보입니다.

  - 클러스터를 부트스트랩할 때 생성

 

8. Certificate: Certificate 시크릿은 인증서와 개인 키를 저장하는 사용됩니다. 주로 HTTPS 지원하는 서비스나 TLS 기반의 통신을 위해 사용됩니다.

 - TLS 인증서를 생성하여 시크릿으로 저장하는 경우에 사용

 

9. kubernetes.io/service-account-token: 시크릿은 ServiceAccount 관련된 토큰 정보를 저장합니다. ServiceAccount 생성 자동으로 생성되는 시크릿으로, ServiceAccount 연결된 토큰 정보를 제공합니다.

- 쿠버네티스가 각 ServiceAccount에 대해 자동으로 해당 시크릿을 생성

 

시크릿 사용하기

1. 생성

kubectl create secret generic my-secret --from-literal=USERNAME=myusername --from-literal=PASSWORD=mypassword

 

2. 환경변수로 전달 및 파드 생성

- valueFrom: secretKeyRef로 환경변수로 추가 (my-secret-USERNAME 으로 저장된 시크릿 값을 MY_USERNAME 으로 사용)

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: MY_USERNAME
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: USERNAME
    - name: MY_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: PASSWORD

 

시크릿에 저장된 Env 전체를 key value 값으로 가져 올 수도 있다.

여러개의 시크릿을 가져올 경우 접두사를 통해 시크릿을 구별 가능

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    envFrom:
    - secretRef:
        name: my-secret
    prefix: db1_
    - secretRef:
    name: my-secret
    prefix: db2_

 

볼륨으로 마운트 할 수도 있다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/my-secrets
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret

볼륨으로 마운트한 경우 동적으로 시크릿의 변경사항에 대해서 업데이트가 가능해 진다.

kubelet의 --sync-frequency 옵션을 지정해서 기본 업데이트 주가(60초)를 변경 하는것도 가능하다.

대신 pod 기동 시에 환경변수로 사용한 값은 동적으로 변경 할 수는 없다.

 

 

Practice

How many secrets?

How many secrets are defined in the dashboard-token secret?

What is the type of the dashboard-token secret?

controlplane ~ ➜  kubectl get secrets
NAME              TYPE                                  DATA   AGE
dashboard-token   kubernetes.io/service-account-token   3      33s

secrets 1개, data 3개 , service-account-token 시크릿

 

 

Which of the following is not a secret data defined in dashboard-token secret?

1. ca.crt

2. token

3. type

4. namespace

controlplane ~ ✖ kubectl describe secret dashboard-token
Name:         dashboard-token
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-sa
              kubernetes.io/service-account.uid: a2b94097-4526-4fc0-a63b-d978cfec9d9a

Type:  kubernetes.io/service-account-token

Data
====
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Im5JVl9kUDUwbk8ySjZpX2QzX1hjY2ZmWUJVelFfWFZDdE5qSFVsUlFVSmMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRhc2hib2FyZC10b2tlbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkYXNoYm9hcmQtc2EiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhMmI5NDA5Ny00NTI2LTRmYzAtYTYzYi1kOTc4Y2ZlYzlkOWEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpkYXNoYm9hcmQtc2EifQ.Rd30Cqh0YXWRVEIOC_CJjimJmQv-IscD0xJbSwycFIg4DrPko5hS9l50bJip_MUlvyYXKUKt0-5jLOcKm0GiB0BoMgye6uoo0oQ2gS74G84EYK_mvV_jRxdAoaxlW0RlvaOFnCyvWJqnZkNat8hSNzKDeXfp4xc1VvDQKY_7uBqICoULJ9AcZBYwUZRzfZpVFJWg0X5WJTfJOwE9mmId1Jzm3RDTGzyxKI50t7k2sJaSXeVTnh6sc8oUxqHSTalxjzlg3UhphHUSGlUsQOCY6s4YUVAeDzU-IMhpwEYzI5BZBVB7jdOGXZrFXumTkHwRm4zR2R8_WBkVv8_o5poaLQ
ca.crt:     570 bytes

type은 없음

 

 

'Tools > K8S' 카테고리의 다른 글

K8S Ingress & Egress Gateway  (0) 2024.03.25
Kubernetes PV & PVC  (0) 2023.08.12
Kubernetes Deployment  (0) 2023.07.01
Kubernetes ReplicaSet  (0) 2023.07.01
Kubernetes Config  (1) 2023.06.17