728x90
MSA (Micro Service Architecture) 로 개발되어 서비스간의 라우팅이 필요한 구조에서는 Ingress 를 사용
Service의 NodePort : 온프레미스 환경에서 사용
Service의 LoadBalancer: 퍼블릭 클라우드 환경에서 사용
Servic는 클러스터 외부로 PORT를 노출하는 기능과 부하분산기능을 수행합니다. 그리고 이점은 Ingress 도 동일합니다. 차이점은 Ingress는 L7이고 Service는 L4라는 점입니다.
1. 노드 포트
2. 파드 생성 (디플로이먼트)
vi web-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
spec:
selector:
matchLabels:
run: web
template:
metadata:
labels:
run: web
spec:
containers:
- image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: IfNotPresent
name: web
ports:
- containerPort: 8080
protocol: TCP
kubectl apply -f web-deployment.yaml
kubectl get deploy
3. 서비스 생성
vi web-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web
namespace: default
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
run: web
type: NodePort
kubectl apply -f web-service.yaml
kubectl get svc
4. 인그레스 생성
vi basic-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: basic-ingress
spec:
rules:
- http:
paths:
backend:
service:
name : web
port:
number: 8080
path: /
pathType: Prefix
kubectl apply -f basic-ingress.yaml
kubectl get ingress
5. 접속
1) 노드포트 [노드IP]:[노드포트]
GKE에서 쿠버네티스를 사용하는 경우 각 노드의 랜덤한 포트에 접근하기 위해 별도로 방화벽 설정을 추가해야 합니다. AWS에서도 마찬가지로 Security Group의 별도의 Inbound 규칙을 추가해야 합니다.
gcloud compute firewall-rules create sun-nodeport-svc --allow=tcp:30650
실제 운영 환경에서 NodePort로 서비스를 외부에 제공하는 경우는 많지 않습니다.
SSL 인증서 적용 라우팅과 같은 복잡한 설정을 서비스에 적용하는 것은 어렵기 때문입니다.
2) 인그레스 [인그레스IP]/[url]
LoadBalancer 타입의 서비스는 서비스를 생성함과 동시에 로드 밸런서를 새롭게 생성해 pod와 연결합니다. Nodeport는 각 노드의 IP를 알아야 pod에 접근할 수 있지만, LoadBalancer 타입의 서비스는 클라우드 플랫폼으로부터 도메인 이름과 IP를 할당받기 때문에 Nodeport보다 쉽게 pod에 접근할 수 있습니다.
단, 로드 밸런서를 동적으로 생성하는 기능을 제공하는 환경에서만 사용할 수 있습니다. AWS, GCP 등과 같은 클라우드 플랫폼 환경에서만 LoadBalancer 타입을 사용할 수 있으며, 가상 환경이나 온프레미스 환경에서는 사용이 어려울 수 있습니다.
온프레미스 환경에서 LoadBalancer 타입의 서비스를 사용하기 위해서는 MetalLB나 오픈스택과 같은 특수한 환경을 직접 구축해야 합니다.
728x90