네트워크 캠퍼스/쿠버네티스

240531 쿠버네티스(config Map, secret)

gayeon_ 2024. 6. 5. 18:00

config Map, secret

컨테이너에 configmap 관련으로 포함되는 요소

  1. 개발 ConfigMap
  2. 프로덕션 ConfigMap
  3. 보안 관련 정보

 

k8s는 pod생성에 사용되는 YAML파일에 설정 값(MySQL 환경변수)을 작성해야 한다.

 

ConfigMap은 주로 환경변수와 같은 설정값을 외부 파일에 작성할 때 사용한다.

 

secret은 yaml코드 등에 노출시키면 안되는 정보들을 저장하기 위해 사용한다.

 

configmaps와 secrets는 쿠버네티스 내부에 등록되어 있다.

이는 상황에 따라 편리하게 값을 넣어주기 위함이다.

항상 코드로 값을 고쳐주는 것보다 외부에 저장한 값을 넣어주는 것이 효율적이다.

 

 configmaps에 일반적인 정보, secrets에 보안 정보를 보관한다.

 

 

실습

 

 

 

Dockerfile

FROM node:20-slim
EXPOSE 포트번호
COPY app.js .
CMD node app.js

 

 

app.js

var http = require('http');
const envvar = process.env.ENV_VAR

if(!envvar) {
    console.log('ENV_VAR is not available');

    http.createServer(function(req, res) {
        res.setHeader('Content-Type', 'text/plain');
        res.end("ENV_VAR is not available. \n");
    }).listen(포트번호);
} else {
    console.log('ENV_VAR :', envvar);

    http.createServer(function(req, res) {
        res.setHeader('Content-Type', 'text/plain');
        res.end("ENV_VAR :" + envvar + "\n");
    }).listen(포트번호);
}

 

파일 작성 후 

 

 

 

이미지를 빌드한다.

 

 

 

빌드 후 도커허브에 푸시

 

 

 

nodeapi를 띄운 후 k8s-master의주소:포트번호

로 접속하면 위와 같이 ENV_VAR 정보가 적합하지 않다고 나오는 것을 볼 수 있다.

 

 

 

e 옵션으로 환경변수를 제공한 뒤 접속하면

 

 

 

환경변수를 인식해서 값을 보여준다.

 

이 과정을 쿠버네티스에서 또 실습해 볼 것이다.

 

디렉토리 생성 후 위에서 만든 이미지를 기반으로 pod 하나를 생성했다.

 

 

 

내부 통신이 가능한 pod임을 확인

curl로 접속하면 아까와 같이 환경변수가 설정되지 않아 값을 보여주지 못하고 있다.

 

 

 

상세 정보 확인

 

 

 

configmap 생성 후 상세 정보 확인

 

 

 

yaml 파일을 확인하니 configmap에서 이름이 envvar인 object를 사용하겠다고 적혀있었다.

 

 

 

pod를 생성한 뒤

curl로 접속하면 환경변수의 값이 잘 출력된다.

 

 

 

edit으로 configmap의 값을 변경할 수도 있다.

 

 

 

ENV_VAR의 값을 변경한 뒤 저장한다.

 

 

 

변경 확인 후

 

kubectl replace --force -f ./configmap-node-pod.yaml

kubectl exec -it configmap-node -- env | grep -i env

 

강제 재시작을 해야 pod 내부도 변경되어 curl 접속 시 변경된 환경변수 값을 볼 수 있다.

 

 

 

출력 확인

 

 

secret도 configmap처럼 object에 저장해놓고 pod에 주입하는 식으로 사용된다.

 

  • configMap은 key-value 쌍으로 비밀이 아닌 데이터를 저장할 때 사용한다.
  • pod 내에서 꼭 필요한 환경변수나 커맨드라인 파라미터, 구성파일 등이 저장된다.
  • 1메가바이트 이하로만 데이터를 저장할 수 있다.
  • 여러 환경에서 같은 어플리케이션을 활용할 때 설정을 따로 하기 위해 사용한다.
  • configmap은 secret과 동시에 pod에 적용할 수 있다.
  • yaml코드로 선언형, 명령형 작성이 가능하다.
  • 일반 변수처럼 불변속성을 부여해서 한 번 세팅되면 변경 불가능하게 만들 수 있다.

 

불변 설정의 장점

  • api 서버 감시를 생략해 성능을 올릴 수 있다.
  • 입력되는 데이터의 불변을 보장해서 유지보수성을 높일 수 있다.

 

실습

yaml 형식과 json 형식

 

--from-literal로 여러 환경값을 이렇게 저장할 수 있다.

 

 

 

--dry-run로 저장하는 방식

간단히 yaml 코드를 생성해 준다.

 

 

 

yaml 파일 형식을 file로 저장한다.

 

 

 

생성된 configmap을 활용하기 위해 env를 사용할 nginx 이미지의 yaml 파일을 생성했다.

 

 

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: configmap-env-pod
  name: configmap-env-pod
spec:
  containers:
  - image: nginx:1.25.3-alpine
    name: configmap-env-pod
    ports:
    - containerPort: 80
    envFrom:
    - configMapRef:
        name: k8s-env

 

configmap-env-pod.yaml 하단에 추가한 코드

 

 

 

yaml 파일 실행 후 조회

 

 

 

k8s-env에 저장된 key-value를 configmap-env-pod 내부에서 조회가 된다.

 

 

 

불변 속성을 추가하려면 edit으로 파일을 연 뒤

immutable을 true로 변경하면 된다.

 

 

볼륨 마운트로 지정하는 방식 실습

 

파일 복제 후 yaml 수정

 

 

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: configmap-env-pod
  name: configmap-env-pod
spec:
  containers:
  - image: nginx:1.25.3-alpine
    name: configmap-env-pod
    ports:
    - containerPort: 80
    volumeMounts:
    - name: configmap-volume
      mountPath: /etc/config
  volumes:
  - name: configmap-volume
    configMap:
      name: k8s-env

 

k8s-env를 볼륨으로 지정하면 configmap의 정보가 /etc/config 경로로 파일형식으로 마운트된다.

 

 

 

yaml 적용 후 pod 조회

 

 

 

pod 내부에서 조회하니 정확한 값을 볼 수 있었다.

 

 

 

configmap 값을 변경했을 때 pod의 재시작 없이 갱신하는 방법

 

pod와 cofigmap을 먼저 삭제 후 생성해야 한다. (재시작 필요)

 

 

 

조회

 

 

 

값 수정

 

 

 

값 변경 확인

 

 

다중 환경변수 실습

REDIS_PRIMARY_SERVICE_HOST=
REDIS_PRIMARY_SERVICE_PORT=
REDIS_PRIMARY_PORT=
REDIS_PRIMARY_PORT_6379_TCP=
REDIS_PRIMARY_PORT_6379_TCP_PROTO=
REDIS_PRIMARY_PORT_6379_TCP_PORT=
REDIS_PRIMARY_PORT_6379_TCP_ADDR=

 

파일 작성

 

 

 

위 파일로 configmap 생성

 

 

 

파일 복사 후 볼륨마운트

 

 

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: configmap-env-pod
  name: configmap-env-pod
spec:
  containers:
  - image: nginx:1.25.3-alpine
    name: configmap-env-pod
    ports:
    - containerPort: 80
    volumeMounts:
    - name: redis-volume
      mountPath: /opt/redis/config
  volumes:
  - name: redis-volume
    configMap:
      name: redis-configmap

 

파일 내용 중 볼륨마운트 부분 수정

 

 

 

파일 수정 후 다시 pod 생성

 

 

 

컨테이너 내부 볼륨경로 조회

 

 

 

cat으로 파일의 원본데이터 출력 가능