0부터 시작하는 Kubernetes 공부 - Kubernetes의 Secrets

Jaehong Lee·2023년 4월 18일
2
post-thumbnail

참조 : https://velog.io/@pinion7/Kubernetes-%EB%A6%AC%EC%86%8C%EC%8A%A4-Secret%EC%97%90-%EB%8C%80%ED%95%B4-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0-%EC%8B%A4%EC%8A%B5%ED%95%B4%EB%B3%B4%EA%B8%B0

Kubernetes의 Secrets에 대해 알아보자


1. Secrets 이란

ConfigMap & Secret의 필요성

  • 도커의 이미지는 빌드 후 불변의 상태를 갖기 때문에, 설정 옵션을 유연하게 변경할 수 없다

    • 애플리케이션을 개발하거나 배포할 때, 각 환경에 따라 컨테이너 안쪽의 환경 변수와 같은 변화하는 값들을 관리해야 하는데, 이를 위해서 이미지를 생성하는 것은 불편하고, 낭비이다
  • ConfigMap과 Secret을 이용하면, 환경 변수나 설정 값들을 변수로 관리해서 Pod가 생성될 때 값을 넣어준다. 이를 통해 외부에서 값들을 바꿔줄 수 있다


Secret 이란

보안이 중요한 정보를 컨테이너에 주입해야 할 때, 사용하는 쿠버네티스 리소스

쿠버네티스는 기본적으로 Secret의 값을 Base64로 인코딩해서 etcd에 저장한다

  • 따라서, etcd에 접근할 수 있다면 Secret의 값을 읽는건 쉽다
  • 여기서 가장 중요한 것은 RBAC를 이용하여 Secret에 대한 권한을 제어하는 것이다

Secret의 종류

  1. Opaque ( generic ) : 일반적인 용도의 Secret으로, 보안이 중요한 정보를 컨테이너에 전달하는 목적으로도 사용

  2. dockerconfigjson : Docker 이미지 저장소 인증 정보. Private 이미지를 가져올 때는 추가적인 인증 절차를 수행해야 하는데, 해당 인증에 필요한 정보를 Secret에 넣어두고, Pod를 생성할 때 이미지 Pull을 위해 사용할 수 있다

  3. TLS : TLS 인증서 정보를 넣어두어 Pod나 Service가 이를 통해 통신 암호화 수행 가능

  4. service-account-token : ServiceAccount에 대한 인증 정보를 담은 토큰. ServiceAccount가 생성되면, 자동 생성된다


2. Secrets 생성하기

Secrets 명령형 접근법

명령형 접근법을 통해 Secrets을 생성하는 옵션은 ConfigMap을 생성할 때 사용하는 옵션과 동일하다

kubectl create secret < secret 종류 > < secret 이름 >
  • 위와 같은 명령형 접근법으로 Secret 생성 가능하다
--from-literal=<key>=<value>
  • 위 옵션은 명령형 접근법으로 Secret을 생성할 때, Key와 Value를 지정하는 옵션이다. 해당 옵션을 여러번 사용하여 Key-Value 쌍을 추가할 수 있다
--from-file
  • 위 옵션은 필요한 데이터가 포함된 파일의 경로를 지정한다. from file을 통해 만들면, 파일 이름이 Key 값이 된다
[ec2-user@ip-100-0-1-19 hongwork]$ kubectl create secret generic hongpass --from-literal=hong=jaehong --from-literal=jae=jaehong -n hongspace --dry-run -o yaml
W0418 00:10:43.012689  568683 helpers.go:663] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
data:
  hong: amFlaG9uZw==
  jae: amFlaG9uZw==
kind: Secret
metadata:
  creationTimestamp: null
  name: hongpass
  namespace: hongspace
  • 위와 같이 사용할 수 있다. 값들이 base 64로 인코딩 되어 저장된다
  • dry-run 옵션은 가짜로 실행하는 옵션이다. 결과를 클러스터에 반영하는게 아니라, 어떤 결과가 생성되는지 확인하기 위한 옵션이다
  • -o yaml은 출력 결과를 yaml 형식으로 출력하라는 것이다
kubectl create secret < secret 종류 > < secret 이름 > ~~~ --dry-run -o yaml
  • 위와 같이 dry run -o yaml을 이용하여, yaml 파일을 간편하게 생성할 수 있다

Secret 선언형 접근법

data 와 stringData에 대해 알아보자

apiVersion: v1
kind: Secret
metadata:
 name: secret-1
stringData: 
 password: test123
  • Secret을 선언할 때, 인코딩 되지 않은 데이터는 stringData 아래에 설정해야 한다. 만약 ConfigMap과 같이 data 아래에 설정하면, 인코딩 오류가 발생한다
apiVersion: v1
kind: Secret
metadata:
 name: secret-1
data: 
 password: afsSDsdSD
  • 위와 같이 Value를 미리 Base64로 인코딩해주면, data 아래에 설정해도 된다

이러한 Secret이 선언된 매니페스트 파일은 외부에 노출되면 문제가 생긴다. 따라서 Git 레포지토리와 같은 곳에 저장하는데 문제가 생기는데, SealedSecrets를 사용하면 Secret을 보안적으로 취약하지 않게 암호화하여 Git 레포지토리에 저장되게 해준다

  • 이는 추후에 알아보자!

3. Secrets 적용하기

적용 방법은 ConfigMap과 동일하다

envFrom

envFrom은 configMap이나 Secret의 전체 데이터를 적용시킨다

envFrom에는 configMapRef와 secretRef 옵션이 있다

  • configMapRef : 지정한 ConfigMap의 전체 데이터를 한꺼번에 컨테이너에 적용
  • secretRef : 지정한 Secrets의 전체 데이터를 한꺼번에 컨테이너에 적용

해당 옵션 사용 시, 뒤에 나오는 것이 앞에 것을 덮어 씌울 수 있기에 조심하자. 앞에서 선언된 변수를 뒤에서 선언된 변수가 덮어 씌울 수 있다는 의미이다

spec: 
  containers: 
  - name: nginx2 
    image: nginx 
    envFrom: 
    - configMapRef: 
      name: configmaphong 
    - secretRef: 
      name: secrethong
  • 위와 같이, 적용할 컨테이너 밑에 선언해주면 된다

env

env는 valueFrom을 통해 특정 Secret의 특정 Key의 Value 값만 적용시켜 준다

spec: 
  containers: 
  - name: nginx2 
    image: nginx 
    env:
    - name: hong_password 
      valueFrom:
        secretKeyRef: 
          name: secretname 
          key: keyname
  • 위와 같이, 적용할 컨테이너 밑에 선언해주면 된다
  • 컨테이너 내부에 hong_password 환경 변수의 값을 Secret인 secretname의 keyname이라는 Key의 Value 값으로 설정하는 것이다

Volume으로 Mount

ConfigMap과 Secret은 Volume으로 사용 가능하다. 마운트를 하게 되면, 내부의 데이터를 파일 형식으로 Pod에 제공해준다

  • 파일 이름은 Key 값이며, 파일 내용은 Value가 된다
   spec:
      containers:
      - name: nginxhong
        image: nginx
        volumeMounts:
          - mountPath: /user/config
            name: hongconfig
          - mountPath: /user/secret
            name: hongsecret
      volumes:
      - name: hongconfig
        configMap:
          name: name_of_config
      - name: hongsecret
        secret:
          secretName: name_of_secret
  • 위와 같이 Volume 처럼 사용 가능하다
  • volumes에서 각 ConfigMap과 Secrets를 이용하여 volume을 선언하고, volumeMounts에서 컨테이너의 특정 경로에 volume을 마운트하면 된다

ConfigMap에 대한 정보는 아래 링크를 참조하자

profile
멋진 엔지니어가 될 때까지

0개의 댓글