Ingress란?
클러스터에 존재하는 서비스들보다 더 외부에 가깝게 존재해서, 외부로부터 들어온 패킷을 URL이나 도메인으로 구분해서 내부 서비스로 전달한다
위 그림에서 test.com/로 들어온 트래픽은 service1에 80포트, url은 /로 전달된다.
service.co.kr/ping으로 들어온 트래픽은 service2에 8080포트, url은 /ping으로 전달된다
Ingress는 내가 나열한 위 동작을 정의한다
어떤 규칙으로 들어온 트래픽을 어떤 서비스의 어떤포트, 어떤 URL로 전달할지에 대한 정의를 한다
Ingress는 쿠버네티스 리소스로 존재하여 kubectl 명령어로 조회,생성,수정,삭제 등이 모두 가능하다
위 그림의 예시를 yaml파일로 정의하면
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
spec:
rules:
- host: test.com
http:
paths:
- pathType: Prefix
path: "/test"
backend:
service:
name: service1
port:
number: 80
- host: service.co.kr
http:
paths:
- pathType: Prefix
path: "/ping"
backend:
service:
name: service2
port:
number: 8080
host에는 어떤 도메인으로 들어온 패킷을 처리할 것인지 적는다 ( 특정 도메인 상관없이 처리하려면 *로도 설정가능 )
path : 어떤 URL로 들어오고 어떤 URL로 전달할 것인지에 대한 정의 ( 들어오는 URL과 Service로 보내는 URL을 변경하려면 정규식으로 설정가능 이 글 아래에 설명할 예정 )
backend.service : 규칙에 해당하는 packet을 어떤 서비스의 어떤 포트로 보낼 것인지에 대한 정의
Ingress rule은 생각보다 간단하다.
근데 Ingress rule을 바로 배포한다면, 아마 배포되지 않을 것이다.
왜냐하면 Ingress를 정의한다고 바로 동작하는 것이아니라, Ingress controller가 배포되어 있어야 한다
Ingress controller는 위 룰을 보고 실제로 수행하도록하게 하는 컴포넌트다.
nginx-ingress의 경우에는 파드 내에 실제 동작을 수행하는 nginx가 있고
ingress rule에 설정된 값을 감지해서 nginx 의 conf파일에 실제적용하는 동작을 go lang으로 수행하고 있다.
즉, 우리가 kubectl 명령어로 ingress를 업데이트하면, ingress controller는 업데이트를 감지해서 nginx에 rule을 적용한다.
nginx-ingress 배포하는 방법 : https://kubernetes.github.io/ingress-nginx/deploy/
yaml파일을 배포하거나, helm으로 배포가능하다
controller가 배포되고 나면 Ingress도 정상 배포될 것이다.
nginx ingress를 사용하는 경우 참고사항
Ingress rule은 배포시 바로 바로 적용되는데, config map 은 바로 적용되지 않아서 controller를 재시작 해줘야한다.
configmap을 사용하는 경우는 nginx 동작에 대한 설정을 변경하고 싶은 경우 사용한다.
예를 들어 nginx의 connection timeout을 직접 정의하고 싶다면, 아래와 같이 configmap에 등록해주면 된다
apiVersion: v1
data:
allow-snippet-annotations: "true"
kind: ConfigMap
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.7.0
name: ingress-nginx-controller
namespace: ingress-nginx
data:
proxy-connect-timeout : 10
그외 설정값은 아래 page에 자세히 나와있다.
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/
Configmap에는 전체 default 설정이라면, rule별로 설정이 가능한 Case들은 Ingress rule배포시 annotation으로도 추가 가능하다
connection timeout을 특정 ingress rule에 만 5초로 설정하고 싶다면?
아래와 같이 Ingress rule배포시 metadata.annotations에 추가해주면된다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/proxy-connect-timeout: 5
spec:
rules:
- host: test.com
http:
paths:
- pathType: Prefix
path: "/test"
backend:
service:
name: service1
port:
number: 80
추가가능한 annotations : https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/
ingress rule을 좀 더 잘 활용하고 싶다면? 아래 정규식을 적극 활용하면된다.
현재글 상단에 있던 예시를 좀더 변형해서 아래의 형태로 배포하고자 한다.
test.com/test로 들어온 트래픽은 service1에 80포트, url은 /로 전달된다.
service.co.kr/ping으로 들어온 트래픽은 service2에 8080포트, url은 /test/ping으로 전달된다
위 rule은 아래와 같이 배포할 수 있다
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: $1
spec:
rules:
- host: test.com
http:
paths:
- pathType: Prefix
path: "/test(/)"
backend:
service:
name: service1
port:
number: 80
- host: service.co.kr
http:
paths:
- pathType: Prefix
path: "/test(/ping)"
backend:
service:
name: service2
port:
number: 8080
annotation으로 rewrite할 값을 추가해주면된다.
path에 설정된 정규식 캡쳐구문() 을 rewrite-target으로 지정해주면 된다
만약에 특정 구문을 지정하지 않을 경우 아래와 같이 *로도 표시할 수 있다
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: $1
spec:
rules:
- host: test.com
http:
paths:
- pathType: Prefix
path: "/test(/*)"
backend:
service:
name: service1
port:
number: 80
'kubernetes' 카테고리의 다른 글
CKS 자격증 준비 후기 - 2024년 8월 (0) | 2024.08.25 |
---|---|
CKAD 자격증 준비 후기 - 2024년 5월 (0) | 2024.05.29 |
CKA 자격증 준비 후기 - 2024년 4월 (0) | 2024.04.21 |
Manage role based access control (RBAC) (0) | 2022.07.17 |