Ingress와 Secret & ConfigMap

inuit·2025년 4월 12일

All about 쿠버네티스

목록 보기
8/21
post-thumbnail

최근 업데이트일 2024-11-07

쿠버네티스: Ingress

실습 동영상 따라하며 배우는 쿠버네티스

외부 트래픽을 내부 Service에 라우팅하는 Ingress와 환경변수를 관리하는 ConfigMap과 Secret 등의 쿠버네티스 리소스에 대해서 알아보자.

Ingress

클러스터 외부의 트래픽이 내부 Service로 들어오도록 라우팅을 제어하는 API 객체

  • HTTP나 HTTPS를 통해 클러스터 내부의 서비스를 외부로 노출하기 위해 사용한다.
    • 웹 기반 Service의 외부 URL 제공
    • 트래픽 로드밸런싱
    • SSL 인증서(HTTPS의 암호화 기능) 처리
    • Virtual hosting 지정
  • 각 서비스마다 외부 포트를 열어야 하는 NodePort나 클라우드에서만 지원되는 유료 Conroller인 LoadBalancer에 비해 하나의 진입점으로 여러 서비스를 관리할 수 있다.
  • Ingress는 L7 (애플리케이션 계층)에서 작동한다. (HTTP/HTTPS만 대상)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: myapp.com
    http:
      paths:
      - path: /login
        pathType: Prefix
        backend:
          service:
            name: login-service
            port:
              number: 80
  tls:
  - hosts: myapp.com
    secretName: my-tls-secret
  • host와 path에 따라 트래픽을 특정 서비스로 라우팅한다.
    • 경로 기반 라우팅: /login은 login 서비스로, /api는 api 서비스로 라우팅한다.
    • 호스트 기반 라우팅: api.example.com, web.example.com 등을 각각 분리한다.
  • apiVersion: networking.k8s.io/v1 지정
    • spec.rules.http.paths.path에 각각의 path 지정
    • path.backend.service에 name과 연결시킬 port 지정
    • path.pathType: Prefix 지정

Ingress는 자체적으로 요청을 수신 및 처리하진 않고, Ingress Controller 컴포넌트가 요청을 실제로 처리한다.


Ingress Controller

실제로 Ingress 리소스를 감시하고, 해당 규칙에 따라 라우팅을 처리하는 컴포넌트

  • Ingress yaml 파일을 실제로 실행하더라도 Ingress Conroller가 설치되어 있어야 동작한다.
  • Ingress Conroller를 Service로 배포하여 외부로 노출해야 해당 Ingress가 라우팅하는 Service를 거쳐 실제 Pod로 보내준다.
  • 여러 Service에 대한 라우팅 규칙을 한 리소스에 정의할 수 있으며, host/path 기준으로 각각 분기된다.
  • 클라우드 환경이 아닌 bare-metal 환경에서는 LoadBalancer가 없기 때문에 NGINX Ingress Controller를 직접 설치한다.
    • NGINX Ingress를 local에 설치 시 Bare-metal 버전 다운로드하여 사용한다.
  • 외부와 연결하려면 공인 IP를 포트포워딩 해야 한다.
    • yaml로 인증서와 SessionAffinity도 등록 가능하다.

Ingress에서 HTTPS 트래픽을 처리하려면 TLS 인증서가 필요하며, 이 인증서는 Kubernetes의 Secret 리소스를 통해 관리된다.


Secret

컨테이너가 사용하는 passwd, auth token, ssh key같은 보안 정보를 저장하여 민감한 정보를 안전하게 저장하고 관리하는 리소스

Secret Type설명
Opaque기본 타입으로, 사용자가 자유롭게 key-value를 정의할 수 있는 임의의 보안 데이터. 가장 일반적인 형태.
kubernetes.io/service-account-token특정 서비스 어카운트에 자동으로 바인딩되는 API 인증 토큰. Pod에 자동 주입되어 API 서버에 접근할 수 있게 함.
kubernetes.io/dockercfg.dockercfg 파일 기반의 Docker 레지스트리 인증 정보. (이전 포맷, 구버전)
kubernetes.io/dockerconfigjson최신 포맷의 Docker 인증 정보 (~/.docker/config.json)를 기반으로 한 Secret. 프라이빗 레지스트리 로그인용
kubernetes.io/basic-authusername / password 기반의 기본 인증 정보. 일부 Ingress나 HTTP 인증에 사용 가능
kubernetes.io/ssh-authssh-privatekey를 포함하는 SSH 접속용 자격 증명. Git 저장소 비공개 접근 등에 사용
kubernetes.io/tlstls.crt, tls.key 형식의 TLS 인증서 정보. Ingress와 HTTPS 통신할 때 사용
bootstrap.kubernetes.io/tokenkubelet이 클러스터에 조인할 때 사용하는 부트스트랩 토큰. kubeadm join에서 사용됨
  • Opaque 이외에 표에 정해진 type 필드를 설정해서 Secret의 목적에 따라 구조와 처리를 다르게 할 수 있다.
  • kubectl create secret [{docker-registry, generic, tls}] [NAME] [flags] [options]
    • tls: TLS 인증서용
      • --cert=[path] / --key=[path]
    • docker-registry: 프라이빗 레지스트리 로그인 정보
      • --docker-username=[name] / --docker-password=[ps] / --docker-email=[email]
    • generic: 일반 문자열, 파일 등 보안 데이터
      • --from-literal=[key]=[value] / --from-file=[dir/filename]
# 1. 환경 변수로 전달
env:
- name: DB_USER
  valueFrom:
    secretKeyRef:
      name: my-secret
      key: username

# 2. 볼륨으로 마운트
volumes:
- name: secret-volume
  secret:
    secretName: my-secret

volumeMounts:
- name: secret-volume
  mountPath: "/etc/secret"
  readOnly: true
  • yaml 파일로 Secret을 사용할 때 위 두 가지 방식으로 사용할 수 있다.
    • spec.env.valueFrom.secretKeyRef: Secret object 지정해서 Key-Value 일부 사용
    • containers.volumes.secret.secretName: 마운트된 경로에는 각 key가 파일 이름으로, value가 파일 내용으로 심볼릭 링크 형태로 저장
  • Secret은 base64로 인코딩되어 저장되지만, 이는 단순 인코딩일 뿐 암호화가 아니다.
  • Secret은 기본적으로 etcd에 저장되므로, etcd에 접근 가능한 사용자는 누구나 내용을 볼 수 있다.
  • 실무에서는 KMS로 etcd 암호화하거나, HashiCorp Vault 같은 외부 솔루션과 연동해서 사용한다.

Secret은 ConfigMap과 유사하지만 보안 정보 관리하고, 평문이 아닌 base64로 저장된다는 차이점이 있다.


ConfigMap

애플리케이션 설정과 같은 기밀이 아닌 데이터를 키-값 쌍으로 저장하기 위한 Kubernetes 리소스

  • kubectl create configmap [NAME] [—from-file=myfile=file.asd] [—from-literal=key1=value1]
  • 주요 특징
    • Kubernetes에서 컨테이너에 환경 설정 정보를 전달하기 위해 사용하는 API 오브젝트
    • 컨테이너 설정을 외부에서 관리 가능하게 한다.
    • 애플리케이션 재배포 없이 설정 변경 가능하다.
    • 환경 변수, 커맨드라인, 볼륨 마운트 등 다양한 방식으로 주입 가능하다.
    • Secret과 ConfigMap은 모두 최대 용량이 1MB이다.
# 환경 변수로 일부 key 가져오기
env:
- name: APP_ENV
  valueFrom:
    configMapKeyRef:
      name: app-config
      key: ENV 
      
# 환경 변수로 전체 파일 가져오기 
envFrom:
- configMapRef:
    name: app-config

# 볼륨으로 마운트해서 파일처럼 사용
volumes:
- name: config-volume
  configMap:
    name: app-config
    items:
    - key: config.yaml
      path: config.yaml

volumeMounts:
- name: config-volume
  mountPath: "/etc/config"
  1. spec.env.name에 대한 값을 spec.env.valueFrom.configMapKeyRef에서 지정한 configMapKeyRef.name의 ConfigMap 파일에서 configMapKeyRef.key를 가져온다.
  2. spec.envFrom.configMapRef로 configMap 파일을 가져온다.
  3. spec.volumesname과 configMap을 작성해서 ConfigMap을 볼륨 마운트할 수 있다.
    • configMap.name에 configMap 파일명, configMap.items에 key와 path를 지정해서 가져올 수 있다.
profile
It’s always white night here.

0개의 댓글