Ingress란
- 서비스 앞에 있는 로드벨런스로 클러스터로 유입된 외부의 트래픽을 적절한 마이크로서비스로 라우팅
- 사용자가 지정한 특정 규칙에 따라 트래픽을 다양한 서비스로 전달하는 Controller
- 대표적으로 2가지의 사용목적이 존재
- Service LoadBalancing
- Canary Upgrade
- 이외에도 https 인증서 관리에도 사용 가능
Ingress의 구성
Ingress Controller
- 클러스터의 인그레스 리소스를 관리 -> Ingress를 실현할 구현체
- 일반적으로 인그레스의 작동은 인그레스 컨트롤러가 인식할 수 있는 특정 어노테이션을 추가하여 정의
- Cloud 환경에서는 각각 제공되는 컨트롤러가 있지만, 자체 운영 중인 클러스터에서는 NGINX을 주로 사용
- 이외에도 Kong ontour, Taefik 등이 존재
Ingress Controller의 구조
Service LoadBalancing
외부에서 쿠버네티스 클러스터 내부에 들어오는 네트워크 요청을 어떻게 처리할 지 정의
별도의 IP LoadBalancing 장비 필요없이 Ingress만 사용
Ingress Controller로 구성한 Service LoadBalancing
Canary Upgrade
- 버전 업데이트 전의 테스트에 사용
- V1, V2를 각각 Service에 연결하고 Ingress를 사용하면 원하는 트래픽 배분에 맞게 분산 가능
Ingress Controller로 구성한 Canary Upgrade
Ingress Controller을 이용한 https 인증서 관리
실습
Ingress Controller 설치
Nginx Controller 설치
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
생성된 Ingress Controller 확인
ingress-nginx 네임스페이스가 생성됨
해당 네임스페이스에 진입하면
Nginx Ingress에 대한 디플로이먼트, 파드, 서비스가 생성됨
실습 진행을 위해 Service의 http와 SSL Nodeport 확인
1. Service Loadbalancing
3개의 Pod/Service 생성
각각의 Pod는 MSA에 기초한 서비스 페이지라고 가정
apiVersion: v1
kind: Pod
metadata:
name: pod-shopping
labels:
category: shopping
spec:
containers:
- name: container
image: kubetm/shopping
---
apiVersion: v1
kind: Service
metadata:
name: svc-shopping
spec:
selector:
category: shopping
ports:
- port: 8080
apiVersion: v1
kind: Pod
metadata:
name: pod-customer
labels:
category: customer
spec:
containers:
- name: container
image: kubetm/customer
---
apiVersion: v1
kind: Service
metadata:
name: svc-customer
spec:
selector:
category: customer
ports:
- port: 8080
apiVersion: v1
kind: Pod
metadata:
name: pod-order
labels:
category: order
spec:
containers:
- name: container
image: kubetm/order
---
apiVersion: v1
kind: Service
metadata:
name: svc-order
spec:
selector:
category: order
ports:
- port: 8080
생성된 Pod 확인
Ingress 생성
생성한 3개의 Pod를 매칭하여 설정
rule
Path | Service Name |
/ | svc-shopping |
/customer | svc-customer |
/order | svc-order |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: service-loadbalancing
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-shopping
port:
number: 8080
- path: /customer
pathType: Prefix
backend:
service:
name: svc-customer
port:
number: 8080
- path: /order
pathType: Prefix
backend:
service:
name: svc-order
port:
number: 8080
생성된 Ingress 확인
Master Node의 IP와 NodePort(30431)로 각 Pod에 접근 확인
해당 IP로 접근하는 트래픽의 요청(Path)에 따라 각기 다른 Service(Pod)에 접근하는 것을 확인 할 수 있다.
2. Canary Upgrade
기존 서비스(V1) Pod/Service 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-v1
labels:
app: v1
spec:
containers:
- name: container
image: kubetm/app:v1
---
apiVersion: v1
kind: Service
metadata:
name: svc-v1
spec:
selector:
app: v1
ports:
- port: 8080
테스트할 새로운 서비스(V2) Pod/Service 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-v2
labels:
app: v2
spec:
containers:
- name: container
image: kubetm/app:v2
---
apiVersion: v1
kind: Service
metadata:
name: svc-v2
spec:
selector:
app: v2
ports:
- port: 8080
생성된 2개의 Pod/Service 확인
기본 Ingress 생성
Host name으로 접근하는 것 또한 확인 하기 위해
host : "www.app.com"으로 설정
해당 도메인으로 접근하면 svc-v1으로 접근하도록 설정
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app
spec:
ingressClassName: nginx
rules:
- host: www.app.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-v1
port:
number: 8080
해당 도메인을 VM의 DNS에 저장
cat << EOF >> /etc/hosts
192.168.56.30 www.app.com
EOF
이 후 도메인을 이용한 접근 확인
Canary test를 위해 svc-v2와 연결할 Ingress 생성
옵션으로 weight : 10을 설정 -> 해당 host로 접근하는 트래픽의 10%를 v2 Pod로 접근되게끔 설정
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: canary-v2
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
ingressClassName: nginx
rules:
- host: www.app.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-v2
port:
number: 8080
트래픽 확인
1초마다 www.app.com에 트래픽을 전송
while true; do curl www.app.com:30431/version; sleep 1; done
정확한 비율은 확인안되지만 간간히 v2가 출력되는 것을 확인
'CICD' 카테고리의 다른 글
Docker와 DockerFile (2) | 2023.04.08 |
---|---|
[Kubernetes] Autoscaler(HPA) (0) | 2022.02.17 |
[Kubernetes] StatefulSet(Controller) (0) | 2022.02.08 |
[Kubernetes] RBAC, Role, RoleBinding(Authorization) (0) | 2022.01.30 |
[Kubernetes] X509 Certs, kubectl, ServiceAccount(Authentication) (0) | 2022.01.30 |
댓글