Ingress && Ingress Controller란?
Ingress는 쿠버네티스 클러스터 외부에서 클러스터 내부로의 HTTP(port: 80)와 HTTPS(port: 443) 요청을 클러스터 내부의 Service로 라우트 시켜줍니다. Ingress는 HTTP와 HTTPS 요청만을 다루기 때문에 다른 Port로 들어오는 서비스를 노출시키려면 Service의 Service Type을 NodePort나 LoadBalancer로 지정해 노출시킵니다.
Ingress를 사용하기 위해서는 ingress-nginx와 같은 Ingress Controller 객체를 반드시 같이 생성해주어야 합니다. 대표적으로 쿠버네티스 클러스터 내부에서 직접 Pod로 배포하는 ingress-nginx와 AWS나 GCP 등 클라우드에서 제공되는 컨트롤러가 있습니다. 쿠버네티스에서 공식으로 지원하는 Ingress Controller는 AWS Load Balancer Controller와 ingress-gce, ingress-nginx가 있습니다.
클라우드 환경이 아니기 때문에 ingress-nginx를 설치해 실습을 진행했습니다. 마스터노드 1, 워커노드 2 환경에서 진행했습니다.
Test
ingress-nginx 설치
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
ingress-nginx를 설치하면 ingress-nginx Namespace가 생성되고 ingress-nginx-contoller Service가 생성됩니다. Service type은 LoadBalancer로 지정되어있는데 실습 환경이 온프레미스 환경이므로 NodePort로 변경해주었습니다.
테스트용 Deployment 명세
nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
nginx-deploy 노출용 Service 명세
nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
protocol: TCP
type: ClusterIP
ingress 생성
ingress-nginx-pod.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx-pod
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /game
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
- path: /video
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
# host: "example.com"
- spec.ingressClassName - 사용할 ingressClass의 이름을 명시 ingress-nginx를 설치하면 nginx IngressClass가 생성됩니다.
- spec.rules - Ingress에서 사용할 규칙을 명세
- spec.rules.host - host를 명세, 해당 필드를 작성하지 않으면 Node의 IP가 사용됩니다. host: "*.example.com"의 wildcard도 사용 가능합니다.
클러스터 외부에서 ingress-nginx-controller Service의 NodePort를 사용해서 접속해보면 접속이 잘 되는걸 확인할 수 있습니다.
Bypass
위에 선언한 Ingress를 kubectl describe ingress <ingress name>명령어로 확인해보면 아래 사진과 같이 나오는데
노란 박스를 보면 Service로 연결된 Pod들의 EndPoints 정보가 모두 들어있는걸 볼 수 있었습니다. 구글링을 좀 해보니 Ingress를 사용하면 Pod의 Service를 거치지 않고 ingress controller에서 직접 Pod IP로 라우팅 된다고 해서 iptraf-np 패키지를 써서 확인을 해보니까 아래와 같이 나오는걸 확인할 수 있었습니다.
노란색으로 가려진 부분은 Node의 Internal-IP입니다 . NodeIP에서 바로 ingress-controller Pod (10.40.0.2:80)로 갔다가 ingress-controller Pod(10.40.0.2:54964)에서 /video에 할당된 Service가 물고있는 Pod(10.40.0.1:80)로 바로 가는것을 볼 수 있습니다.
아래는 내용 정리 겸 통신 순서를 정리한 그림입니다
'DevOps > Kubernetes' 카테고리의 다른 글
Jenkins on Kubernetes 두 번째 글 (0) | 2024.01.23 |
---|---|
Jenkins on Kubernetes 첫 번째 글 (0) | 2024.01.23 |
Kubernetes/CKA 합격 및 후기 (1) | 2024.01.15 |
Networking/NetworkPolicy (0) | 2024.01.04 |
Networking/Service (0) | 2023.12.28 |