Kubernetes에서 NodePort 서비스는 클러스터 외부에서 Pod에 직접 접근하는 방법 중 하나
웹 애플리케이션 배포: NodePort 서비스를 사용하여 웹 애플리케이션을 클러스터 외부에 노출할 수 있음 이를 통해 사용자가 해당 웹 애플리케이션에 접속할 수 있음
데이터베이스 액세스: 데이터베이스 Pod에 대한 액세스를 필요로 하는 애플리케이션의 경우, NodePort 서비스를 사용하여 데이터베이스 Pod에 액세스할 수 있음
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
kubectl get svc
http://<Node-IP>:30000
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql
image: mysql:latest
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
ports:
- containerPort: 3306
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
app: mysql
type: NodePort
ports:
- name: mysql
port: 3306
targetPort: 3306
nodePort: 30000 # 원하는 NodePort 번호를 지정합니다.
mysql -h <node-ip> -P <node-port> -u root -p
위의 명령어에서 는 MySQL 데이터베이스가 실행 중인 노드의 IP 주소를, 는 NodePort 서비스에 지정한 포트 번호를 사용.
클러스터 외부에서 MySQL 데이터베이스에 접근할 수 있음
주의
클러스터 외부에서 NodePort를 통해 Pod에 액세스할 수 있지만 보안상 이유로 NodePort를 직접 노출하지 않는 것이 좋음
Ingress Controller를 사용하여 노출하거나, LoadBalancer 서비스를 사용하여 노출
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm install nginx-ingress ingress-nginx/ingress-nginx
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /my-service
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
해당 Ingress 리소스는 example.com/my-service 경로로 들어오는 요청을 my-service라는 Kubernetes 서비스로 라우팅
$ kubectl apply -f my-ingress.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/name: ingress-nginx
Ingress Controller를 위해 노드포트를 노출하는 서비스
$ kubectl get svc -n ingress-nginx
LoadBalancer 서비스
클라우드 제공업체에서 제공하는 로드밸런서를 사용하여 클러스터 외부에서 Pod에 접근하는 방법
LoadBalancer 생성시, 클러스터 외부에서 로드밸런서의 IP 주소를 사용하여 Pod에 접근할 수 있음
Ex) GCP, AWS, Azure 등의 CSP에서 제공하는 LoadBalancer service 이용
Ingress
Ingress는 클러스터 외부에서 HTTP(S) 프로토콜로 Pod에 접근할 수 있도록 하는 Kubernetes 리소스Ingress는 로드밸런서와 함께 사용되며, 클라이언트 요청에 따라 적절한 Pod로 라우팅하는 규칙을 정의
Ingress를 사용하면 다양한 HTTP(S) 프로토콜 기반의 서비스를 지원할 수 있음
ClusterIP 서비스와 포트 포워딩
ClusterIP 서비스를 사용하여 Pod를 내부 IP 주소를 사용하여 접근할 수 있음
클러스터 외부에서는 이 내부 IP 주소에 직접 접근할 수 없으므로, 포트 포워딩을 사용하여 클러스터 외부에서도 해당 IP 주소로 접근할 수 있음
이 방법은 보안상 취약점이 존재, Production 환경에서는 권장되지 않음
Kubernetes API Server Proxy
Kubernetes API Server Proxy를 사용하여 Pod에 직접 접근할 수 있음
간단한 방법 중 하나이지만, API Server Proxy를 사용하면 Pod의 IP 주소와 포트 번호를 직접 알아야 하기 때문에 구성이 복잡해질 수 있다.