Kubernetes Ingress-nginx 설치 및 활용 방법

1. Ingress 개요 및 역할

쿠버네티스 환경에서는 서비스와 파드의 주소는 클러스터 내부 네트워크에서만 접근 가능하며, 외부 애플리케이션은 직접 접근할 수 없습니다. 이를 해결하기 위해 쿠버네티스는 다음과 같은 네트워크 접근 방식을 제공합니다:

  • NodePort
  • LoadBalancer
  • Ingress

Ingress 구성 요소

  • Ingress 컨트롤러: 새로운 Ingress 규칙을 감지하고, 해당 규칙에 따라 Nginx 설정 파일을 생성하여 적용합니다.
  • Ingress 리소스: 실제 서비스를 정의하는 객체로, 각 서비스마다 별도의 YAML 파일을 작성해 등록하면 됩니다.

작동 원리

  1. Ingress 컨트롤러는 Kubernetes API를 통해 동적으로 인그레스 규칙의 변경을 감시합니다.
  2. 규칙에 따라 도메인과 서비스 간 매핑 정보를 분석하고, Nginx 설정 파일을 생성합니다.
  3. 생성된 설정은 컨트롤러가 실행 중인 Pod의 /etc/nginx.conf에 기록됩니다.
  4. 설정 재적용(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-amd641.5registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64
quay.io/kubernetes-ingress-controller/nginx-ingress-controller0.20.0registry.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로 접속하여 테스트합니다.

태그: ingress-nginx kubernetes nginx TLS Service

8월 6일 20:21에 게시됨