[K8S] Kubernetes Node Port Service

행복한 콩🌳·2023년 4월 13일
0

K8S

목록 보기
1/3

Kubernetes Node Port Service

Kubernetes에서 NodePort 서비스는 클러스터 외부에서 Pod에 직접 접근하는 방법 중 하나

사용 예시

  • 일반적으로 외부에서 접근해야하는 서비스 제공 시 사용
  • 웹 서버, 데이터 베이스, 캐시 서버 등을 위한 서비스 노출 시 사용

웹 애플리케이션 배포: NodePort 서비스를 사용하여 웹 애플리케이션을 클러스터 외부에 노출할 수 있음 이를 통해 사용자가 해당 웹 애플리케이션에 접속할 수 있음

데이터베이스 액세스: 데이터베이스 Pod에 대한 액세스를 필요로 하는 애플리케이션의 경우, NodePort 서비스를 사용하여 데이터베이스 Pod에 액세스할 수 있음

사용 법

클러스터 외부에서 웹 애플리케이션 엑세스 방법

  1. Service 정의
    Service는 일반적으로 클러스터 내에서 Pod를 노출시키는 리소스
    Service를 생성 시, spec.type을 NodePort로 설정해주면 노출시키는 서비스 타입으로 NodePort를 선택
    아래 yaml 파일에서 type을 NodePort로 사용
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080
  1. spec.ports.port를 설정
    설정된 Service는 ClusterIP와 함께 생성됨, Kubernetes 클러스터 내에서 ClusterIP를 통해 서비스에 접근할 수 있음
    (기본적으로 30000~32767 범위의 포트를 사용합니다. 하지만 이 범위는 변경할 수 있음)
    NodePort 확인
kubectl get svc
  1. 클러스터 외부에서 노드의 IP 주소 및 NodePort를 사용하여 Pod에 액세스함.
    예를 들어, 만약 클러스터에 3개의 노드가 있고, NodePort가 30000이라면, 다음과 같이 Pod에 액세스할 수 있음
http://<Node-IP>:30000

클러스터 외부에서 MySQL 데이터베이스 엑세스 방법

  • DB가 구동 중인 Pod에 대한 노드 포트 유형의 서비스 생성, Pod에 할당된 포트와 일치하는 NodePort를 지정
  1. MySQL db가 실행중인 파드를 생성
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
  1. MySQL 데이터베이스에 대한 NodePort 서비스 생성
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  type: NodePort
  ports:
    - name: mysql
      port: 3306
      targetPort: 3306
      nodePort: 30000 # 원하는 NodePort 번호를 지정합니다.
  1. 클러스터 외부에서 MySQL 데이터베이스에 접근하기 위해, 노드의 IP 주소와 NodePort를 사용
mysql -h <node-ip> -P <node-port> -u root -p

위의 명령어에서 는 MySQL 데이터베이스가 실행 중인 노드의 IP 주소를, 는 NodePort 서비스에 지정한 포트 번호를 사용.
클러스터 외부에서 MySQL 데이터베이스에 접근할 수 있음

주의

클러스터 외부에서 NodePort를 통해 Pod에 액세스할 수 있지만 보안상 이유로 NodePort를 직접 노출하지 않는 것이 좋음
Ingress Controller를 사용하여 노출하거나, LoadBalancer 서비스를 사용하여 노출

Ingress Controller를 사용하여 NodePort를 노출하는 방법

  1. Ingress Controller 설치
    Helm Chart 추가하여 Nginx Ingress Controller 설치
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm install nginx-ingress ingress-nginx/ingress-nginx
  1. Ingress 리소스 생성
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 서비스로 라우팅

  1. Ingress 리소스를 적용합니다.
$ kubectl apply -f my-ingress.yaml
  1. Ingress Controller를 위한 노드포트 서비스 리소스 생성
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를 위해 노드포트를 노출하는 서비스

  1. 노드포트 서비스의 IP와 포트 번호 확인
$ kubectl get svc -n ingress-nginx
  1. 브라우저에서 노트포트에 접속

NodePort 방법 외에 K8S Cluster 외부에서 Pod로 직접 접근하는 방법

  1. LoadBalancer 서비스
    클라우드 제공업체에서 제공하는 로드밸런서를 사용하여 클러스터 외부에서 Pod에 접근하는 방법
    LoadBalancer 생성시, 클러스터 외부에서 로드밸런서의 IP 주소를 사용하여 Pod에 접근할 수 있음
    Ex) GCP, AWS, Azure 등의 CSP에서 제공하는 LoadBalancer service 이용

  2. Ingress
    Ingress는 클러스터 외부에서 HTTP(S) 프로토콜로 Pod에 접근할 수 있도록 하는 Kubernetes 리소스Ingress는 로드밸런서와 함께 사용되며, 클라이언트 요청에 따라 적절한 Pod로 라우팅하는 규칙을 정의
    Ingress를 사용하면 다양한 HTTP(S) 프로토콜 기반의 서비스를 지원할 수 있음

  3. ClusterIP 서비스와 포트 포워딩
    ClusterIP 서비스를 사용하여 Pod를 내부 IP 주소를 사용하여 접근할 수 있음
    클러스터 외부에서는 이 내부 IP 주소에 직접 접근할 수 없으므로, 포트 포워딩을 사용하여 클러스터 외부에서도 해당 IP 주소로 접근할 수 있음
    이 방법은 보안상 취약점이 존재, Production 환경에서는 권장되지 않음

  4. Kubernetes API Server Proxy
    Kubernetes API Server Proxy를 사용하여 Pod에 직접 접근할 수 있음
    간단한 방법 중 하나이지만, API Server Proxy를 사용하면 Pod의 IP 주소와 포트 번호를 직접 알아야 하기 때문에 구성이 복잡해질 수 있다.

profile
매일매일 조금씩 모여 숲이 되자🐣

0개의 댓글