k8s configmap 사용하기

# 젠킨스 빌드 후 버전 정보를 configmap(key-value 데이터 저장하는 오프젝트)을 통해
# 운영 중인 k8s pod 에 전달하려고 한다.

# 우선 pod 또는 deployment(pod 와 replica를 생성하고 제어하는)에
# configmap 볼륨(volumes)을 추가한다.
# 마운트(volumeMounts)를 설정하면 파일로 사용할 수 있다.
# 환경변수(env)를 설정하면 환경변수 값으로 설정돼 사용할 수 도 있다.

# ysoftman-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: ysoftman-test
  name: ysoftman-test-deployment
spec:
  replicas: 1
  revisionHistoryLimit: 0
  selector:
    matchLabels:
      app: ysoftman-test-deployment
  template:
    metadata:
      labels:
        app: ysoftman-test-deployment
    spec:
      containers:
        - name: ysoftman-test
          image: ysoftman.test.com/ysoftman/ysoftman-test
          imagePullPolicy: Always
          ports:
            - containerPort: 443
            - containerPort: 8080
          command: ["./ysoftman-test", "-myopt1=test"]

          # 파일로 configmap 을 사용할 경우
          # 컨테이너에 /configmap 로 configmap 을 마운트
          volumeMounts:
          - name: configmap
            mountPath: "/configmap"
            readOnly: true
          # 환경변수로 설정해 사용할 경우
          env:
              # configmap 로부터 가져와 다음 환경변수이름으로 저장된다.
            - name: ysoftman-version-env
              valueFrom:
                configMapKeyRef:
                  # ysoftman-configmap 을 참조한다.
                  name: ysoftman-configmap
                  # ysoftman-configmap 의 ysoftman-version.json 키의 값을 가져온다.
                  key: ysoftman-version.json
      # configmap 이 있는 볼륨
      volumes:
          # 컨테이너 /configmap 에 마운트될 볼륨 이름
        - name: configmap
          configMap:
            # configmap 이름
            name: ysoftman-configmap


# 적용
kubectl apply -f k8s/ysoftman-deployment.yaml


# 젠킨스 빌드 후 k8s configmap 에 버전 정보 저장
# ysoftman-configmap-template.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: ysoftman-test
  name: ysoftman-test-configmap
data:
  # key : value 로 데이터 설정
  ysoftman-key1: 123
  ysoftman-key2: "lemon_juice"
  
  # value 내용이 많다면
  # x.x 처럼 파일 이름처럼 키이름 설정하고
  # | (literal 스타일로 멀티라인 지정) 지시자�로 value 를 명시하면
  # 컨테이너에서 마운트해 파일로 접근할 수 있다.
  ysoftman.version: |
    aaa = "lemon"
    bbb = 123

  # 내용이 json 인 경우
  ysoftman-version.json: |
    {
      "VersionName":"v1.0.0",
      "VersionTime":"2020-09-01_14:30:10_KST"
    }

  # 버전값 부분을 sed 로 바꿀 수 있도록 유니크한 스트링으로 명시
  ysoftman-version2.json: |
    {
      "VersionName":"__versionname__",
      "VersionTime":"__versiontime__"
    }



# 실제 버전값은 젠킨스의 환경변수로 가지고 있기 때문에
# sed 로 버전값 부분을 변경해서 실제로 적용할 파일을 생성한다.
vn="v1.0.1"
vt="2020-09-02"
sed -e "s/__versionname__/${vn}/g" -e "s/__versiontime__/${vt}/g" < ysoftman-template.yaml > ysoftman-configmap.yaml

# 적용
kubectl apply -f k8s/ysoftman-configmap.yaml

# configmap 업데이트되면 kubelet(k8s 노드에서 동작하는 에이전트)이
# configmap 동기화시간+캐시시간 이후에 pod 에 반영된다.
# 결과 확인
# 이제 pod shell 로 들어가면
# 다음 위치에 파일이 존재한다.
/configmap/ysoftman-version.json

# 환경 변수로도 설정돼 있다.
echo $ysoftman-version-env

# configmap 데이터를 업데이트 하면 볼륨 마운트된 파일 자동으로 갱신되지만
# 환경변수는 deployment 의 env 값 설정 부분을 다시 수행(pod restart)
# 해야 하기 때문에 파일로 접근하는것이 좋다.

# 참고

comments:

댓글 쓰기