작성이유
Ingress 가 아닌 host 의 network ( public IP) 을 사용하여 80. 443 을 직접 바인팅 하는 방법을 정리 하는 문서 임.
hostNetwork: true는 Pod가 노드의 네트워크 스택과 동일한 네트워크를 사용하게 만듭니다. 이 설정을 통해 Pod가 노드의 IP 주소 및 포트를 직접 사용하여 외부 네트워크와 통신할 수 있습니다
노드에 공인 IP 할당: 클라우드 제공자의 설정을 통해 노드에 공인 IP를 설정해야 합니다 ( Cloud 관리자 )
Pod의 포트 바인딩: hostNetwork: true를 통해 노드의 공인 IP와 포트를 사용하도록 구성합니다. ( 모듈 담당자)
hostNetwork 의 80.443 포트 바인딩은 다중모듈에서 사용할수 없음 ( 서버와 같은 구조 )
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
hostNetwork: true와 DNS 정책
- hostNetwork: true가 활성화된 Pod는 클러스터의 네트워크와 독립적으로 노드의 네트워크를 직접 사용합니다.
- 기본적으로 hostNetwork: true인 Pod는 노드의 DNS 설정(/etc/resolv.conf)을 그대로 사용하게 됩니다.
- 이를 보완하기 위해 dnsPolicy: ClusterFirstWithHostNet를 사용하면, Pod가 노드 네트워크를 사용하더라도 클러스터 내부 DNS 서버(CoreDNS)를 통해 이름을 해석할 수 있습니다.
# 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;
}
}
}