쿠버네티스에서는 외부에서 쿠버네티스 클러스터에 접속하는 방법을 서비스라고 한다.
외부 사용자가 쿠버네티스에 접속하여 파드를 이용하려면 서비스를 사용하여야 한다.
NodePort
외부에서 쿠버네티스 클러스터의 내부에 접속하는 가장 쉬운 방법은 노드포트 서비스를 이용하는 것으로 노드포트 서비스를 설정하면 모든 워커노드의 특정 포트를 열고 여기로 오는 요청을 노트포트 서비스로 전달하고 노드포트에서는 해당 파드로 요청을 전달한다.
오브젝트 스펙을 활용한 NodePort 서비스 생성
실습을 위해 docker hub에 등록되어 있는 echo-hname 이미지를 이용하여 파드를 생성한다.
오브젝트 스펙이 정의되어 있는 yaml 파일을 사용해 kubectl create로 노드포트 서비스를 생성한다.
nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: np-svc
spec:
selector:
app: np-pods
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
type: NodePort
kind를 서비스로 지정하고 type을 Nodeport로 지정한다.
nodeport로 지정한 30000 port로 요청이 오면 쿠버네티스 클러스터에 생성한 파드의 80 port를 요청하여 반환하게 된다.
클러스트의 워커노드 IP를 확인하고 웹 브라우저로 해당 IP:30000번으로 접속하여 외부에서 접속되는지 확인한다.
expose로 NodePort 서비스 생성
expose 명령어로도 노드포트 서비스를 생성 가능하다.
exposer 명령어를 사용해 서비스로 내보낼 아까 생성한 디플로이먼트 np-pods를 지정하고 타입을 NodePort로 지정한다.
서비스가 파드로 보내줄 연결 포트를 80번으로 지정한다.
오브젝트 스펙으로 생성할때는 포트를 30000번으로 지정했으나 expose를 사용하면 포트를 지정할 수 없고 30000~32767
번에서 임의로 지정된다.
Ingress
노드포트 서비스는 포트를 중복 사용할 수 없기때문에 1개의 노드포트에 하나의 디플로이먼트만 적용된다.
여러개의 디플로이먼트가 있을때는 그 수만큼 노드포트 서비스를 구동해야 하므로 쿠버네티스에서는 이런 경우에 인그레스를 사용한다.
인그레스는 고유한 주소를 통해 사용 목적에 따라 다른 응답을 제공한다. 즉 사용자가 접속하는 경로에 따라 다른 결과값을 제공한다.
인그레스를 사용하려면 인그레스 컨트롤러가 필요하며 다양한 인그레스 컨트롤러가 있지만 실습에서는 쿠버네티스에서 프로젝트로 지원하는 NGINX 인그레스 컨트롤러를 사용한다.
1. 사용자는 노드마다 설정된 노드포트를 통해 노드포트 서비스로 접속하며 이때 노드포트 서비스를 NGINX 인그레스 컨트롤러로 구성한다.
2. NGINX 인그레스 컨트롤러는 사용자의 접속 경로에 따라 적합한 클러스터 IP 서비스로 경로를 제공한다.
3. 클러스터 IP 서비스는 사용자를 해당 파드로 연결해 준다.
실습으로 먼저 디플로이먼트 2개를 배포한다. (in-hname-pod, in-ip-pod)
NGINX 인그레스 컨트롤러를 설치한다. 쿠버네티스 github에서 제공하는 파일로 많은 종류의 오브젝트 스펙이 포함된다.
해당 yaml 파일을 다운받아 사용한다.
https://github.com/kubernetes/ingress-nginx
GitHub - kubernetes/ingress-nginx: Ingress-NGINX Controller for Kubernetes
Ingress-NGINX Controller for Kubernetes. Contribute to kubernetes/ingress-nginx development by creating an account on GitHub.
github.com
인그레스 컨트롤러의 파드 배포가 확인되면 요구사항에 맞게 설정하기 위해 경로와 작동을 파일로 설정 가능하다.
ingress-config 파일로 인그레스 설정을 등록한다.
ingress-config.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: // ~.~.~.~:port 접속은 hname-svc-default 서비스와 연결된 파드로 넘김
backend:
serviceName: hname-svc-default
servicePort: 80
- path: /ip // ~.~.~.~:port/ip 접속은 ip-svc 서비스와 연결된 파드로 넘김
backend:
serviceName: ip-svc
servicePort: 80
- path: /your-directory
backend:
serviceName: your-svc
servicePort: 80
NGIX 인그레스 컨트롤러 생성 및 인그레스 설정이 완료됐으므로 외부에서 NGINX 인그레스 컨트롤러에 접속할 수 있게
노드포트 서비스로 아까 생성한 NGINX 인그레스 컨트롤러를 외부로 노출한다.
ingress.yaml
apiVersion: v1
kind: Service // kind를 서비스로 설정
metadata:
name: nginx-ingress-controller //기존에 생성한 NGINX 인그레스 컨트롤러 파드
namespace: ingress-nginx
spec:
ports:
- name: http // http 처리를 위해 30100 port로 들어온 요청을 80 port로 전달
protocol: TCP
port: 80
targetPort: 80
nodePort: 30100
- name: https // https 처리를 위해 30101 port로 들어온 요청을 https의 port인 443번으로 전달
protocol: TCP
port: 443
targetPort: 443
nodePort: 30101
selector:
app.kubernetes.io/name: ingress-nginx
type: NodePort
네임스페이스가 default가 아니기 때문에 -n 옵션을 사용하여 ingress-nginx를 네임스페이스로 지정해 조회한다.
expose 명령어로 아까 생성한 in-hname-pod, in-ip-pod를 설정한 서비스로 노출한다.
웹 브라우저로 구동 확인
'Cloud > Docker & Kubernetes' 카테고리의 다른 글
쿠버네티스의 서비스 (HPA) (0) | 2023.05.18 |
---|---|
쿠버네티스의 서비스 (LoadBalancer) (0) | 2023.05.17 |
Dockerfile로 이미지 생성 (0) | 2023.04.21 |
쿠버네티스 노드 유지보수 (0) | 2023.04.20 |
쿠버네티스 파드 생성 (0) | 2023.04.20 |