
외부 트래픽을 내부 Service에 라우팅하는 Ingress와 환경변수를 관리하는 ConfigMap과 Secret 등의 쿠버네티스 리소스에 대해서 알아보자.
클러스터 외부의 트래픽이 내부 Service로 들어오도록 라우팅을 제어하는 API 객체
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
/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 리소스를 감시하고, 해당 규칙에 따라 라우팅을 처리하는 컴포넌트
Ingress에서 HTTPS 트래픽을 처리하려면 TLS 인증서가 필요하며, 이 인증서는 Kubernetes의 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-auth | username / password 기반의 기본 인증 정보. 일부 Ingress나 HTTP 인증에 사용 가능 |
kubernetes.io/ssh-auth | ssh-privatekey를 포함하는 SSH 접속용 자격 증명. Git 저장소 비공개 접근 등에 사용 |
kubernetes.io/tls | tls.crt, tls.key 형식의 TLS 인증서 정보. Ingress와 HTTPS 통신할 때 사용 |
bootstrap.kubernetes.io/token | kubelet이 클러스터에 조인할 때 사용하는 부트스트랩 토큰. kubeadm join에서 사용됨 |
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
spec.env.valueFrom.secretKeyRef: Secret object 지정해서 Key-Value 일부 사용containers.volumes.secret.secretName: 마운트된 경로에는 각 key가 파일 이름으로, value가 파일 내용으로 심볼릭 링크 형태로 저장Secret은 ConfigMap과 유사하지만 보안 정보 관리하고, 평문이 아닌 base64로 저장된다는 차이점이 있다.
애플리케이션 설정과 같은 기밀이 아닌 데이터를 키-값 쌍으로 저장하기 위한 Kubernetes 리소스
kubectl create configmap [NAME] [—from-file=myfile=file.asd] [—from-literal=key1=value1]# 환경 변수로 일부 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"
spec.env.name에 대한 값을 spec.env.valueFrom.configMapKeyRef에서 지정한 configMapKeyRef.name의 ConfigMap 파일에서 configMapKeyRef.key를 가져온다.spec.envFrom.configMapRef로 configMap 파일을 가져온다.spec.volumes에 name과 configMap을 작성해서 ConfigMap을 볼륨 마운트할 수 있다.configMap.name에 configMap 파일명, configMap.items에 key와 path를 지정해서 가져올 수 있다.