1. Ingress 개요 및 역할
쿠버네티스 환경에서는 서비스와 파드의 주소는 클러스터 내부 네트워크에서만 접근 가능하며, 외부 애플리케이션은 직접 접근할 수 없습니다. 이를 해결하기 위해 쿠버네티스는 다음과 같은 네트워크 접근 방식을 제공합니다:
- NodePort
- LoadBalancer
- Ingress
Ingress 구성 요소
- Ingress 컨트롤러: 새로운 Ingress 규칙을 감지하고, 해당 규칙에 따라 Nginx 설정 파일을 생성하여 적용합니다.
- Ingress 리소스: 실제 서비스를 정의하는 객체로, 각 서비스마다 별도의 YAML 파일을 작성해 등록하면 됩니다.
작동 원리
- Ingress 컨트롤러는 Kubernetes API를 통해 동적으로 인그레스 규칙의 변경을 감시합니다.
- 규칙에 따라 도메인과 서비스 간 매핑 정보를 분석하고, Nginx 설정 파일을 생성합니다.
- 생성된 설정은 컨트롤러가 실행 중인 Pod의
/etc/nginx.conf에 기록됩니다. - 설정 재적용(
reload)을 통해 동적으로 업데이트되며, 도메인 기반 라우팅이 가능해집니다.
Ingress의 주요 이점
- 동적 서비스 등록: 새 서비스 추가 시 별도의 반응형 프록시 설정 없이, Ingress 리소스만 등록하면 자동으로 반영됩니다.
- 노드 포트 노출 최소화: NodePort 방식은 호스트에 많은 포트를 열어보여 보안상 위험성이 크며, Ingress를 사용하면 단일 포트(80/443)만 외부에 노출하면 됩니다.
2. Ingress-nginx 배포 및 설정
2.1 배포 파일 준비
다음 링크에서 배포 파일을 다운로드합니다:
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy
2.2 필수 구성 요소 설명
namespace.yaml:ingress-nginx라는 별도의 네임스페이스를 생성합니다.configmap.yaml: Nginx 설정 값을 저장하는 ConfigMap입니다. 환경 변수나 설정 파일 형태로 사용 가능합니다.default-backend.yaml: 미등록 도메인 요청 시 기본 응답을 제공하는 서비스입니다 (404 반환).rbac.yaml: Ingress 컨트롤러가 필요한 권한을 관리하는 역할 기반 접근 제어 설정입니다.with-rbac.yaml: Ingress 컨트롤러의 핵심 컴포넌트로, Nginx 설정을 동기화하는 컨테이너를 생성합니다.
2.3 이미지 준비 및 수정
공식 이미지가 중국 지역에서 다운로드되지 않을 수 있으므로, 대체 저장소를 사용해야 합니다.
| 이미지 이름 | 버전 | 대체 주소 |
|---|---|---|
| k8s.gcr.io/defaultbackend-amd64 | 1.5 | registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64 |
| quay.io/kubernetes-ingress-controller/nginx-ingress-controller | 0.20.0 | registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller |
각 노드에서 이미지를 다운로드합니다:
docker pull registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5
docker pull registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0
2.4 YAML 파일 수정
다운로드한 mandatory.yaml 파일 내 이미지 주소를 수정합니다:
sed -i 's#k8s.gcr.io/defaultbackend-amd64#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64#g' mandatory.yaml
sed -i 's#quay.io/kubernetes-ingress-controller/nginx-ingress-controller#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller#g' mandatory.yaml
2.5 서비스 노드 포트 설정
service-nodeport.yaml 파일을 수정하여 외부 접근용 포트를 명시합니다:
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 32080
- name: https
port: 443
targetPort: 443
nodePort: 32443
selector:
app.kubernetes.io/name: ingress-nginx
2.6 배포 실행
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml
2.7 상태 확인
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
3. Ingress 백엔드 서비스 설정
3.1 Nginx 백엔드 서비스 생성
deploy-demon.yaml:
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
spec:
replicas: 5
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: httpd
containerPort: 80
3.2 Ingress 규칙 추가
ingress-myapp.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-myapp
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: myapp.magedu.com
http:
paths:
- path: /
backend:
serviceName: myapp
servicePort: 80
3.3 도메인 해시 설정
/etc/hosts 파일에 다음 항목 추가:
172.33.16.241 myapp.magedu.com
3.4 Tomcat 서비스 추가 및 TLS 설정
Tomcat 서비스 생성:
apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: default
spec:
selector:
app: tomcat
release: canary
ports:
- name: http
port: 8080
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
release: canary
template:
metadata:
labels:
app: tomcat
release: canary
spec:
containers:
- name: tomcat
image: tomcat:7-alpine
ports:
- name: httpd
containerPort: 8080
3.5 TLS 인증서 생성 및 적용
openssl genrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=tomcat.magedu.com"
kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key
3.6 HTTPS Ingress 설정
ingress-tomcat-tls.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat-tls
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- tomcat.magedu.com
secretName: tomcat-ingress-secret
rules:
- host: tomcat.magedu.com
http:
paths:
- path: /
backend:
serviceName: tomcat
servicePort: 8080
변경 사항을 적용 후, https://tomcat.magedu.com로 접속하여 테스트합니다.