Kubernetes 비밀 이해

완료됨

분산 애플리케이션으로 작업할 때 가장 큰 고려 사항 중 하나는 암호, 연결 및 유사한 데이터와 같은 중요한 정보를 관리하는 방법입니다. Kubernetes를 사용하면 비밀이라는 리소스를 사용하여 이 데이터를 보호할 수 있습니다.

비밀 이해

Kubernetes에서 비밀을 사용하면 Pod 및 배포에서 일반 텍스트 형식보다 더 안전한 방식으로 중요한 정보를 저장할 수 있습니다. 비밀은 암호 및 기타 중요한 데이터를 저장하도록 설계되었습니다.

Kubernetes 비밀은 데이터를 base64 형식으로 인코딩합니다. base64는 암호화 알고리즘이 아니지만 Kubernetes는 정보가 인코딩된 것을 볼 수 있으며 이러한 명령 출력 kubectl describe에서 이 정보를 숨길 수 있습니다. 이 프로세스는 일반 텍스트 구성에서는 발생하지 않습니다. 비밀은 항상 클러스터의 다른 워크로드에 중요한 데이터가 추가되지 않도록 단일 네임스페이스로 범위가 지정됩니다.

비밀 형식

비밀에는 다양한 형식이 있습니다. 가장 일반적인 기본 형식은 사용자 정의된 임의 데이터를 포함하는 Opaque입니다. 다른 일반적인 형식은 다음과 같습니다.

  • kubernetes.io/service-account-token: 서비스 계정 토큰을 정의하며, 새 서비스 계정이 만들어질 때 자동으로 만들어집니다.
  • kubernetes.io/basic-auth: 기본 인증을 위한 자격 증명입니다.
  • kubernetes.io/tls: 예를 들어 수신 리소스 내에서 HTTPS 연결을 제공하는 데 사용되는 TLS 클라이언트 또는 서버 데이터입니다.

자세한 내용은 공식 Kubernetes Secrets 설명서를 참조하세요.

비밀 만들기 및 사용

공식 Kubernetes 비밀 설명서에 따르면 다음과 같은 세 가지 방법으로 비밀을 사용할 수 있습니다.

  • Pod 또는 배포 내에 있는 컨테이너의 볼륨에 파일로 탑재됩니다.
  • Pod 또는 배포 사양에서 환경 변수로 참조됩니다.
  • Pod 사양의 imagePullSecret 키를 통해 프라이빗 레지스트리에서 이미지를 끌어올 때 Kubelet에서 사용됩니다.

YAML 매니페스트 파일이나 kubectl 명령을 사용하여 다른 Kubernetes 리소스와 마찬가지로 비밀을 만들 수 있습니다. 비밀 사양은 다음과 같습니다.

apiVersion: v1
kind: Secret
metadata:
  name: secret-name
  namespace: secret-namespace
type: Opaque
data:
  key_name: "key value in base64 format"

이 사양을 사용하는 비밀의 경우 비밀을 만들기 전에 값을 인코딩해야 합니다. 일반 텍스트 값을 사용하여 비밀을 만들고 Kubernetes를 통해 자동으로 인코딩할 수 있게 하려면 data대신 stringData를 사용합니다.

apiVersion: v1
kind: Secret
metadata:
  name: secret-name
  namespace: secret-namespace
type: Opaque
stringData:
  key_name: "key value in plain format"

애플리케이션은 인코딩된 값 대신 전달된 값으로 디코딩된 비밀 문자열을 받습니다.

비밀 업데이트

Pod 내에서 볼륨으로 탑재된 모든 비밀은 값이 변경되면 자동으로 업데이트됩니다. 이 변경은 Kubelet 구성으로 인해 즉시 발생하지 않을 수 있지만 자동으로 수행되므로 Pod를 다시 시작할 필요가 없습니다.

비밀이 환경 변수에 바인딩된 경우 자동으로 업데이트되지 않으므로 변경 내용이 적용되려면 Pod를 다시 시작해야 합니다.

지식 점검

1.

Kubernetes 비밀이 일반 텍스트 값보다 안전한 이유는 무엇인가요?

2.

애플리케이션에서 비밀을 어떻게 사용할 수 있나요?

3.

비밀에 base64를 사용하는 방법