[Retry, k8s] 19. 서비스 API - 인그레스(Ingress) (1)
카테고리: KUBERNETES
태그: kubernetes
[Retry, k8s] 19. 서비스 API - 인그레스(Ingress) (1)
네트워크 트래픽은 외부로부터 내부로 유입되는 트래픽을 인그레스(Ingress), 내부에서 외부로 나가는 트래픽을 이그레스(Egress)로 구분한다.
시작하기 전 “MetalLB 내용” https://revenge1005.github.io/kubernetes/ch04-05/#-metallb 확인…
🔔 인그레스(Ingress)
k8s의 인그레스는 인그레스 API 오브젝트와 인그레스 컨트롤러로 구성된다.
-
인그레스 API 오브젝트는 인그레스 API 오브젝트는 클러스터 외부에서 내부 서비스로 접근하기 위한 원하는 상태를 기술하는 것이고, 실제로 수행하는 것은 인그레스 컨트롤러라고 부르는 클러스터 내부에서 동작하는 파드로 파드이지만, 클러스터 외부에서 들어오는 요청을 인그레스에 정의된 규칙들을 기반으로 서비스 파드로 전달한다.
-
기존 NodePort 등의 서비스는 Layer 4까지의 요청만을 처리하므로 네트워크 요청에 대한 세부적인 처리 로직을 구현하기 어렵다.
-
하지만 인그레스는 Layer 7까지의 요청을 처리할 수 있으며, 외부로부터 들어오는 요청에 대한 로드 밸런싱, TLS/SSL 인증처리, 특정 HTTP 경로나 도메인의 라우팅 등을 자세하게 정의할 수 있다.

🔔 인그레스(Ingress)의 대표적인 기능
-
기존의 로드밸런서나 리버스 프록시를 대체, 공개 URL과 애플리케이션 매핑
-
복수의 도메인 이름을 가지고 가상 호스트 기능
-
클라이언트의 요청을 여러 파드에 분산
-
SSL/TSL 암호화 통신 HTTPS
-
세션 어피니티
🔔 공개 URL과 애플리케이션의 매핑
- 사용자 입장에서는 하나의 URL이지만 내부적으로 애플리케이션이 적절히 분리되어 있어 마이크로 서비스 처럼 애플리케이션을 분할하고 느슨하게 연결함으로써 각 모듈의 변경에 의한 영향을 최소화할 수 있고 개발 생산성에도 유리하다.
🔔 인그레스(Ingress) 종류
(1) 클러스터 외부 로드 밸런서를 사용한 인그레스 (GKE 인그레스, 그 외 여러가지)
- GKE 처럼 클러스터 외부 로드 밸런서를 사용한 인그레스의 경우 인그레스 리소스 생성만으로 로드 밸런서의 가상 IP가 할당되고, 로드 밸런서가 NodePort를 통해 트래픽을 전송한다.

(2) 클러스터 내부 인그레스용 파드를 배포하는 인그레스 (Nginx 인그레스)
- “클러스터 내부 인그레스용 파드를 배포하는 인그레스 패턴”은 인그레스용 파드에 대해 LoadBalancer 서비스를 생성하고, 인그레스용 파드가 L7 수준의 처리를 수행한 후 파드 IP 주소로 트래픽을 전송한다.

🔔 Nginx 인그레스(Ingress) 설치전 주의사항
https://kubernetes.github.io/ingress-nginx/deploy/baremetal/
베어메탈 환경에서는 클라우드 환경과 달리 네트워크 로드 밸런서가 제공되지 않기 때문에 nginx ingress controller를 설치하는 방법이 다르다.
-
베어메탈 환경에서 nginx ingress controller를 설치하는 방법은 크게 두 가지가 있는데, 하나는 MetalLB라는 소프트웨어 네트워크 로드 밸런서를 사용하는 방법이고, 다른 하나는 NodePort, LoadBalancer 또는 HostNetwork와 같은 서비스 타입을 사용하는 방법이다.
-
여기서는 MetalLB를 사용하는 것으로 진행한다.
🔔 Nginx 인그레스(Ingress) 설치
https://github.com/kubernetes/ingress-nginx/blob/main/README.md#readme
https://kubernetes.github.io/ingress-nginx/deploy/
(1) Nginx 인그레스(Ingress) 설치 (MetalLB를 선행 설치해야 함)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml
(2) 설치 확인
kubectl get all -n ingress-nginx
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-admission-create-czb2z 0/1 Completed 0 71s
pod/ingress-nginx-admission-patch-sz6z4 0/1 Completed 2 71s
pod/ingress-nginx-controller-6bdb654777-rqq8l 1/1 Running 0 71s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller LoadBalancer 10.99.113.110 192.168.219.190 80:30694/TCP,443:30928/TCP 71s
service/ingress-nginx-controller-admission ClusterIP 10.100.13.201 <none> 443/TCP 71s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 1/1 1 1 71s
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-6bdb654777 1 1 1 71s
NAME COMPLETIONS DURATION AGE
job.batch/ingress-nginx-admission-create 1/1 14s 71s
job.batch/ingress-nginx-admission-patch 1/1 25s 71s
(3) 테스트용 매니페스트 파일
cat <<EOF > app01.yaml
kind: Deployment
metadata:
name: helloworld-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- image: "strm/helloworld-http"
name: hello-world-container
ports:
- containerPort: 80
selector:
matchLabels:
app: hello-world
---
apiVersion: v1
kind: Service
metadata:
name: helloworld-svc
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 80
nodePort: 31445
selector:
app: hello-world
EOF
cat <<EOF > app02.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
selector:
matchLabels:
app: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- port: 9080
targetPort: 80
EOF
cat <<EOF > app03.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: liberty
spec:
containers:
- image: openliberty/open-liberty:javaee8-ubi-min-amd64
name: open-liberty
ports:
- containerPort: 9080
name: httpport
selector:
matchLabels:
app: liberty
---
apiVersion: v1
kind: Service
metadata:
name: java-svc
spec:
selector:
app: liberty
ports:
- port: 9080
targetPort: 9080
EOF
(4) 인그레스 매니페스트 작성
-
https://kubernetes.io/docs/reference/kubernetes-api/service-resources/ingress-v1/
-
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/
cat <<EOF > ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-ingress
annotations:
kubernetes.io/ingress.class: 'nginx'
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: abc.sample.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: helloworld-svc
port:
number: 8080
- path: /apl2
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 9080
- host: xyz.sample.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: java-svc
port:
number: 9080
EOF
(5) 매니페스트 적용
$ kubectl get all,ingress
NAME READY STATUS RESTARTS AGE
pod/helloworld-deployment-7757b448c4-q2zdd 1/1 Running 0 12m
pod/java-deployment-65f66f77b-gtsgx 1/1 Running 0 12m
pod/nginx-deployment-7f456874f4-2rsn4 1/1 Running 0 12m
pod/nginx-deployment-7f456874f4-kmrf9 1/1 Running 0 12m
pod/nginx-deployment-7f456874f4-vg5pk 1/1 Running 0 12m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/helloworld-svc NodePort 10.103.193.1 <none> 8080:31445/TCP 12m
service/java-svc ClusterIP 10.103.196.241 <none> 9080/TCP 12m
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20m
service/nginx-svc ClusterIP 10.109.159.252 <none> 9080/TCP 12m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/helloworld-deployment 1/1 1 1 12m
deployment.apps/java-deployment 1/1 1 1 12m
deployment.apps/nginx-deployment 3/3 3 3 12m
NAME DESIRED CURRENT READY AGE
replicaset.apps/helloworld-deployment-7757b448c4 1 1 1 12m
replicaset.apps/java-deployment-65f66f77b 1 1 1 12m
replicaset.apps/nginx-deployment-7f456874f4 3 3 3 12m
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/hello-ingress <none> abc.sample.com,xyz.sample.com 192.168.219.190 80 11m
$ kubectl describe ingress
Name: hello-ingress
Labels: <none>
Namespace: default
Address: 192.168.219.190
Ingress Class: <none>
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
abc.sample.com
/ helloworld-svc:8080 (10.46.0.2:80)
/apl2 nginx-svc:9080 (10.40.0.2:80,10.40.0.3:80,10.46.0.3:80)
xyz.sample.com
/ java-svc:9080 (10.46.0.4:9080)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 4m18s (x2 over 4m59s) nginx-ingress-controller Scheduled for sync
(5) 결과 확인
| OS | hosts 경로 |
|---|---|
| 윈도우(windows) | C:\Windows\System32\drivers\etc\hosts |
| 리눅스(Linux) | /etc/hosts |
# hosts 파일에 아래 내용 추가
192.168.219.190 abc.sample.com xyz.sample.com

댓글 남기기