[kubernetes]-hostNetwork 사용하여 모듈배포 하기

푸르둥개·2025년 11월 18일

작성이유
Ingress 가 아닌 host 의 network ( public IP) 을 사용하여 80. 443 을 직접 바인팅 하는 방법을 정리 하는 문서 임.

HostNetwork 의 동작 원리

  • hostNetwork: true는 Pod가 노드의 네트워크 스택과 동일한 네트워크를 사용하게 만듭니다. 이 설정을 통해 Pod가 노드의 IP 주소 및 포트를 직접 사용하여 외부 네트워크와 통신할 수 있습니다

    • 노드에 공인 IP 할당: 클라우드 제공자의 설정을 통해 노드에 공인 IP를 설정해야 합니다 ( Cloud 관리자 )

    • Pod의 포트 바인딩: hostNetwork: true를 통해 노드의 공인 IP와 포트를 사용하도록 구성합니다. ( 모듈 담당자)

중요!!

  • hostNetwork 의 80.443 포트 바인딩은 다중모듈에서 사용할수 없음 ( 서버와 같은 구조 )

    • 가급적 ingress 를 사용 할 것!!

YAML 작성 예시

  • deployment.yaml
    • hostNetwork: true 적용
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hostnetwork
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true # HostNetwork 활성화
      dnsPolicy: ClusterFirstWithHostNet # 클러스터 내/외부 DNS 동시 지원
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80 # 80포트 오픈
            - containerPort: 443 # 443포트 오픈
          volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf
      volumes:
        - name: nginx-config
          configMap:
            name: nginx-config
  • dnsPolicy: ClusterFirstWithHostNet : 클러스터 내부와 외부 DNS 환경을 동시에 지원하려는 경우 적합

hostNetwork: true와 DNS 정책

  • hostNetwork: true가 활성화된 Pod는 클러스터의 네트워크와 독립적으로 노드의 네트워크를 직접 사용합니다.
  • 기본적으로 hostNetwork: true인 Pod는 노드의 DNS 설정(/etc/resolv.conf)을 그대로 사용하게 됩니다.
  • 이를 보완하기 위해 dnsPolicy: ClusterFirstWithHostNet를 사용하면, Pod가 노드 네트워크를 사용하더라도 클러스터 내부 DNS 서버(CoreDNS)를 통해 이름을 해석할 수 있습니다.
  • configMap.yaml
    • SSL 인증서 폴더는 host 와 volume Mount 하거나, image 에 직접 넣어서 사용 할 것!
# Main Nginx configuration
worker_processes auto;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # Log formats
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # Gzip compression
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # Server blocks
    server {
        listen 80;
        server_name example.com;

        # Redirect HTTP to HTTPS
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name example.com;

        # SSL Certificates
        ssl_certificate /etc/nginx/ssl/example.com.crt;
        ssl_certificate_key /etc/nginx/ssl/example.com.key;

        # SSL Settings
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }

        # Custom error page (optional)
        error_page 404 /404.html;
        location = /404.html {
            root /usr/share/nginx/html;
        }
    }
}
profile
DevOps업무중, 개발팀과 운영팀이 알아두면 좋은 정보를 공유합니다.

0개의 댓글