가급적 컨테이너 이미지는 재사용 가능하게 만드는게 좋다.

동일한 이미지는 개발/스테이징/운영 환경에 사용될 수 있어야 한다.

동일한 이미지가 애플리케이션과 서비스 전반에 걸쳐 사용하기에 충분하도록 범용적이면 더 좋다.

새로운 환경과 개발에 따른 이미지 재구성은 

테스트와 버전관리가 높아 복잡해지며, 그만큼 위험성이 높아진다.

Configmap은 작업 부하에 대한 설정 정보를 제공하는데 사용되며, Secret는 민감한 정보, 즉 자격증명, 인증서, 암호등과 같은 항목으로 쓰일수 있다.

Configmap

파드의 실행전 Configmap 이 파드와 결합되는것.

즉, Configmap 만 설정하면 많은 어플리케이션에서 컨테이너 이미지와 파드 정의 자체를 재사용이 가능하다.

파드 내 디스크에는 my-config.txt 라는 샘플 데이터 파일 생성한다. 

parameter1 = value1
parameter2 = value2

 my-config.txt  파일을 이용하여 configmap 을 생성하고 키/값 쌍 추가. (추가된 값은 명령줄에 리터럴 값으로 표시됨)

# kubectl create configmap my-config \
--from-file=my-config.txt \
--from-literal=extra-param=extra-value \
--form-literal=another-param=another-value

생성된 configmap yaml 파일은 다음과 같다.

# kubectl get configmaps my-config -o yaml
apiVersion: v1
data:
  another-param: another-value
  extra-param: extra-value
  my-config.txt: |
    parameter1 = value1
    parameter2 = value2
kind: ConfigMap
metadata:
  creationTimestamp: 2018-07-17T04:43:08Z
  name: my-config
  namespace: default
  resourceVersion: "832158"
  selfLink: /api/v1/namespaces/default/configmaps/my-config
  uid: e7371ac9-897b-11e8-8f64-52540093ac15

Configmap 사용

  • 파일시스템 (filesystem) : pod에 configmap 을 마운트 할수 있다. 키 이름에 따라 각 항목의 파일이 생성됨, 해당 파일의 내용은 값으로 설정.
  • 환경변수 (environment variable) : configmap 을 사용해 환경변수의 값을 동적으로 설정.
  • 명령줄인수 (command-line argument) :쿠버네티스는 configmap 값을 기반으로 컨테이너에 대한 명령줄을 동적으로 생성하도록 지원.

위의 3가지를 적용한 Configmap 매니페스트

apiVersion: v1
kind: Pod
metadata:
  name: kuard-config
spec:
  containers:
  - name: test-container
    image: gcr.io/kuar-demo/kuard-amd64:1
    imagePullPolicy: Always
    command:
    - "/kuard"
    - "$(EXTRA_PARAM)" //명령줄인수는 환경변수를 기반
    env:
    - name: ANOTHER_PARAM
      valueFrom:  //환경변수를 valueFrom 으로 지정, configmap 과 해당 configmap에 사용할 데이터 키 참조.
        configMapKeyRef:
          name: my-config
          key: another-param  //configmap와 해당 configmap에 사용할 데이터 키 참조.
    - name: EXTRA_PARAM
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: extra-param
    
    volumeMounts: //볼륨마운트를 사용하여 /config 에 마운트할 위치 지정.
    - name: config-volume
      mountPath: /config

  volumes:  //파드내에 새로운 볼륨생성.
  - name: config-volume
    configMap:
     name: my-config
  restartPolicy: Never

# kubectl apply -f kuard-config.yaml
# kubectl port-forward kuard-config 8080

위의 설정으로 Configmap 생성된 볼륨인 /config 개체를 확인할수 있으며, 개별 Configmap 항목과 연관된 파일의 생성을 확인 할 수 있다.


암호, 보안토큰등 민감한 유형의 개인키가 포함될 수 있으며, 이런 민감한 정보 및 데이터를 포괄적으로 시크릿이라 부른다.

쿠버네티스는 기본적으로 시크릿 데이터의 저장과 처리를 지원한다.

시크릿은 민감한 데이터를 하나로 묶지 않고 미지 자체에 저장하는것을 지양하며, 이정보를 시크릿에 저장하여 정보를 제공한다.

시크릿은 파드 매니페스트와 쿠버네티스 API 의 명시적 선언을 통해 파드에 제공된다.

시크릿은 기본 운영체제에서 제공하는 기본적인 격리 기능을 활용한다.

시크릿은 데이터베이스나 서비스로 로그인하기위한 자격증명 또는 토큰등이 될수 있다.

시크릿은 리소스 정의 파일에 평문을 포함하지 않으며, 민감한 정보를 저장하는 방법을 제공한다.

시크릿은 파드에 마운트될수 있으며 파일처럼 내용에 접근할 수 있다.

그 외 환경변수를 통해 시크릿을 제공한다.

Secret 생성

시크릿은 쿠버네티스 API 또는 Kubectl 명령을 사용하여 생성한다.

시크릿은 하나 이상의 데이터 요소를 키/값 쌍으로 유지한다.

시크릿을 생성하는 첫번재 단계는 저장하려는 원시 데이터를 획득하는 것이다.

어플리케이션의 TLS 키 및 인증서는 다음 명령으로 실행해 다운로드 한다.

# curl -o https://storage.googleapis.com/kuar-demo/kuard.crt
# curl -o https://storage.googleapis.com/kuar-demo/kuard.key

 다운로드 된 파일을 사용해 시크릿을 생성 할 수 있다.

create secret 명령을 사용해 kuard-tls라는 이름의 시크릿을 생성한다.

# kubectl create secret generic kuard-tls \
--from-file=kuard.crt \
--form-filr=kuard.key

kuard-tls 시크릿은 2개의 데이터 요소로 생성되었다.

# kubectl describe secrets kuard-tls

kuard-tls 시크릿이 정상이면 시크릿 볼륨을 사용해 파드에 시크릿을 사용할 수 있다.

Secret 사용

쿠버네티스  REST API 를 직접 호출하는 방법을 알고 있는 어플리케이션은 해당 API를 사용해 시크릿을 사용한다.

그러나 어플리케이션의 목표는 이식성을 유지하는것이므로, 쿠버네티스에서 잘 작동할 뿐만 아니라

그 밖의 플랫폼에서도 변경되지 않는 상태로 실행 되어야 한다.

또한 API서버를 통해 시크릿에 접근하는 대신 시크릿 볼륨을 사용할 수 있다.

시크릿의 데이터 요소는 볼륨 마운트에 정의된 대상의 마운트 포인트에 분리될 파일로 저장된다.

kuard-tls 시크릿은 각 2개의 파일의 데이터 요소를 포함하며 시크릿볼륨을 /tls 에 마운트하면 다음과 같은 파일이 생성된다.

/tls/cert.pem
/tls/key.pem

다음은 kuard-tls 시크릿을 /tls 아래의 kuard 컨테이너에 제공하는 시크릿 볼륨을 설정한다.

apiVersion: v1
kind: Pod
metadata:
  name: kuard-tls
spec:
  containers:
  - name: kuard-tls
    image:
    imagePullPolicy: Always
    volumeMounts:
    - name: tls-certs
      mountPath: "/tls"
      readOnly: true
  volumes:
  - name: tls-certs
    secret:
      secretName: kuard-tls


# kubectl apply -y kuard-secret.yaml
# kubectl port-forward kuard-tls 8443:8443

Image Pull Secret

사설 레지스트리 자격증명의 배포를 자동화 하기 위해 시크릿 API를 활용한다.

image pull secret은 일반 시크릿처럼 저장되지만,

spec.imagePullSecrets 파드 지정 필드를 사용한다.

아래 특별한 유형의 시크릿은  create secret docker-registry 명령을 사용해 생성한다.

# kubectl create secret docker-registry my-image-pull-secret \
--docker-username={{user name}} \
--docker-password={{user password}} \
--docker-email={{user email}}

다음은 파드 매니페스트에서 image pull secret를 참조하여 사설 레지스트리에 접근을 허용한다.

apiVersion: v1
kind: Pod
metadata:
  name: kuard-tls
spec:
  containers:
  - name: kuard-tls
    image:
    imagePullPolicy: Always
    volumeMounts:
    - name: tls-certs
      mountPath: "/tls"
      readOnly: true
  imagePullSecrets:
  - name: my-image-pull-secret
  volumes:
  - name: tls-certs
    secret:
      secretName: kuard-tls

Configmap & Secret  조회

# kubectl get secrets
# kubectl get configmaps
# kubectl get secrets -o yaml
# kubectl get configmaps -o yaml

Configmap & Secret  상세

# kubectl describe configmap {{configmap name}}

Configmap & Secret  생성

컨피스와 시크릿을 생성하는 방법은

kubectl create secret generic 또는 kubectl create configmap 명령을 사용한다.

  • --form-file={{file name}} : 파일 이름과 동일한 시크릿 데이터 키를 사용해 파일에서 적재
  • --from-file={{키}}={{파일이름}} : 명시적으로 지정된 시크릿 데이터 키를 사용해 파일에서 적재
  • --form-file={{디렉토리}} : 파일이름이 수용할 수 있는 키 이름이 지정된 디렉토리의 모든 파일을 적재
  • --form-literal={{키}={{값}} : 지정된 키/값 쌍으로 직접 사용

Configmap & Secret  업데이트

yaml 파일의 경우 직접 수정한 후 

kubectl replace -f {{file name}} 으로 실행하여 업데이트할 수 있다.

이전에 kubectl apply 를 통해 자원을 생성한 경우 kubectl apply -f <file name> 명령으로 사용할 수 있다.


재성성과 업데이트

컨피그맵과 시크릿에 입력값을 디스크의 별도 파일로 저장한 경우

kubectl 을 사용해 매니페스트를 다시 생성한 후 이것을 사용해 객체를 업데이트 할 수 있다.

# kubectl create secret generic kuard-tls \
--from-file=kuard.crt \
--from-file=kuard.key \
--dry-run -o yaml | kubectl replace -f -

위는 기존 시크릿의 이름과 같은 새로운 시크릿을 생성한다.

방금 중지한 경우 쿠버네시트 API 서버는 이미 존재하는 시크릿을 생성한다는 오류 메세지를 표시한다.

이와 다르게 실제 서버에 데이터를 보내지말고 API 서버에 보낸 yaml 을 표준 출력으로 출력하도록 kubectl  에게 지시한다.

그리고 kubectl replace -f  옵션을 사용하여 표준 입력에서 읽도록 지시한다.

이 방법을 사용해 수동으로 데이터를 base64 인코딩을 하지않고 디스크상의 파일로부터 시크릿을 업데이트 할 수 있다.


현재 버전 수정

kubectl edit 편집기를 사용해 수정하는 방법이다.

시크릿또한 edit 편집기로 업데이트가 가능하지만 base64인코딩을 수동을 관리해줘야 하는 번거로움이 있다.

# kubectl edit configmap {{configmap name}}


  • No labels
Write a comment…