Ingress
- 클러스터 외부에서 내부로 접근 요청을 어떻게 처리할 지 정의해 둔 규칙
- L7 어플리케이션 수준의 접근 요청 처리 방법 제공
- URL 제공, 트래픽 로드밸런스, SSL 인증처리, 도메인 기반 가상 호스팅 등
- HAProxy, Envoy, Kong 같은 소프트웨어 프록시 등 3rd-party 소프트웨어 제공사에 의해서 제공되기도 함.
- 인그레스 : 접근 규칙(Rule)이 정의된 자원
- 인그레스 컨트롤러 : 인그레스 접근 규칙을 기반으로 제어
- 현재 공식적으로 제공하는 인그레스 컨트롤러
- ingress-gce : Google Compute Engine용
- ingress-nginx : nginx 웹 서비스로 들어오는 요청을 처리
Ingress 생성 전 Sample Backend Service 생성
Ingress 를 생성하기 전에 path rule에 맞게 수행될 backend service/pod를 우선 생성한다.
blue-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: blue-app
labels:
app: blue-app
spec:
replicas: 1
selector:
matchLabels:
app: blue-app
template:
metadata:
labels:
app: blue-app
spec:
containers:
- name: blue-app
image: takytaky/web:blue
ports:
- containerPort: 80
green-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: green-app
labels:
app: green-app
spec:
replicas: 1
selector:
matchLabels:
app: green-app
template:
metadata:
labels:
app: green-app
spec:
containers:
- name: green-app
image: takytaky/web:green
ports:
- containerPort: 80
yellow-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yellow-app
labels:
app: yellow-app
spec:
replicas: 1
selector:
matchLabels:
app: yellow-app
template:
metadata:
labels:
app: yellow-app
spec:
containers:
- name: yellow-app
image: takytaky/web:yellow
ports:
- containerPort: 80
blue-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: blue-svc
spec:
type: NodePort
selector:
app: blue-app
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30081
green-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: green-svc
spec:
type: NodePort
selector:
app: green-app
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30082
yellow-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: yellow-svc
spec:
type: NodePort
selector:
app: yellow-app
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30083
위 deployment와 service를 생성하고 나서 결과를 확인해본다.
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f blue-app.yaml
deployment.apps/blue-app created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f green-app.yaml
deployment.apps/green-app created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f yellow-app.yaml
deployment.apps/yellow-app created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f blue-svc.yaml
service/blue-svc created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f green-svc.yaml
service/green-svc created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f yellow-svc.yaml
service/yellow-svc created
root@master:~/k8s_lab/ingress/ingress-color# kubectl get svc,pods-o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/blue-svc NodePort 10.107.199.200 <none> 80:30081/TCP 4m42s app=blue-app
service/green-svc NodePort 10.109.245.115 <none> 80:30082/TCP 4m4s app=green-app
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 59m <none>
service/yellow-svc NodePort 10.103.132.156 <none> 80:30083/TCP 3m16s app=yellow-app
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/blue-app-74948d8f76-27wlr 1/1 Running 0 5m59s 192.168.189.90 worker2 <none> <none>
pod/green-app-5c8f4cd489-ngzsg 1/1 Running 0 5m38s 192.168.235.158 worker1 <none> <none>
pod/yellow-app-559d9bf8cb-nk2cz 1/1 Running 0 5m13s 192.168.235.159 worker1 <none> <none>
현재 구성된 Cluster의 마스터 Node의 IP는 172.30.1.25이다. 위 각 서비스의 NodePort가 각각 30081, 30082, 30083으로 맵핑 되어있으므로 Cluster 외부에서 아래와 같이 접근을 해보면 정상적으로 각 서비스가 수행 됨을 볼 수 있다.
Ingress 생성
- 인그레스의 내용에는 LoadBalancer또는 Proxy 서버를 구성하는데 필요한 정보 작성
- 인그레스 컨트롤러를 통해서 접근하는 요청에 대한 처리할 규칙(rule) 을 정의
ingress-color-web.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: color-web
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
defaultBackend:
service:
name: blue-svc
port:
number: 80
rules:
- host: example.com
http:
paths:
- pathType: Prefix
path: /blue
backend:
service:
name: blue-svc
port:
number: 80
- pathType: Prefix
path: /green
backend:
service:
name: green-svc
port:
number: 80
- host: color.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: yellow-svc
port:
number: 80
- Ingress Annotation
- 인그레스 설정 시 추가적인 항목인 어노테이션을 통해서 설정
Name | Description |
nginx.ingress.kubernetes.io/rewrite-target: / | Target URI where the traffic must be redirected |
https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md
- .spec.rules[] : 어떤 규칙을 적용할 지 지정
- .spec.rues[].host : example.com 주소로 요청이 들어온 경우 다음 규칙에 따라 처리
- .spec.rules[].http.paths[].path : example.com/blue로 요청이 들어오면 backend 서비스로 전달한다.
- .spec.ingressClassName : networking.k8s.io의 ingress-nginx를 사용한다면 nginx 로 명시해준다.
ingress-color-web.yaml을 실행하고 실행결과를 확인한다.
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f ingress-color-web.yaml
ingress.networking.k8s.io/color-web created
root@master:~/k8s_lab/ingress/ingress-color# kubectl get svc,pods,ing -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/blue-svc NodePort 10.107.199.200 <none> 80:30081/TCP 11m app=blue-app
service/green-svc NodePort 10.109.245.115 <none> 80:30082/TCP 10m app=green-app
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 66m <none>
service/yellow-svc NodePort 10.103.132.156 <none> 80:30083/TCP 10m app=yellow-app
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/blue-app-74948d8f76-27wlr 1/1 Running 0 12m 192.168.189.90 worker2 <none> <none>
pod/green-app-5c8f4cd489-ngzsg 1/1 Running 0 12m 192.168.235.158 worker1 <none> <none>
pod/yellow-app-559d9bf8cb-nk2cz 1/1 Running 0 11m 192.168.235.159 worker1 <none> <none>
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/color-web nginx example.com,color.com 80 16s
ingress-nginx (Ingress Controller) 생성
nginx 인그레스 컨트롤러를 제어하기위한 파드 및 리소스 생성 파일 다운로드
#git clone https://github.com/kubernetes/ingress-nginx
#cd ./ingress-nginx/deploy/static/provider/baremetal
ingress-controller를 생성하고 생성 결과를 확인한다. 생성 결과 ingress-controller의 NodePort 주소는 http의 경우 31208로 생성되었음을 알 수 있다.
root@master:~/ingress-nginx/deploy/static/provider/baremetal# kubectl apply -k .
namespace/ingress-nginx unchanged
serviceaccount/ingress-nginx unchanged
serviceaccount/ingress-nginx-admission unchanged
role.rbac.authorization.k8s.io/ingress-nginx unchanged
role.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
clusterrole.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
rolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
configmap/ingress-nginx-controller unchanged
service/ingress-nginx-controller unchanged
service/ingress-nginx-controller-admission unchanged
deployment.apps/ingress-nginx-controller configured
job.batch/ingress-nginx-admission-create unchanged
job.batch/ingress-nginx-admission-patch unchanged
ingressclass.networking.k8s.io/nginx unchanged
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured
root@master:~/ingress-nginx/deploy/static/provider/baremetal#
root@master:~/ingress-nginx/deploy/static/provider/baremetal#
root@master:~/ingress-nginx/deploy/static/provider/baremetal# kubectl get deploy,svc,rs,pods,ing -n ingress-nginx
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 1/1 1 1 33h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller NodePort 10.107.89.28 <none> 80:31208/TCP,443:32615/TCP 13h
service/ingress-nginx-controller-admission ClusterIP 10.97.39.71 <none> 443/TCP 13h
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-5f68dd5779 1 1 1 33h
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-admission-create-g5h4d 0/1 Completed 0 2d7h
pod/ingress-nginx-admission-patch-5lgx2 0/1 Completed 0 2d7h
pod/ingress-nginx-controller-5f68dd5779-7t4c7 1/1 Running 0 33h
생성된 ingress 테스트
윈도우 PC에서 테스트를 한다면 C:\Windows\System32\drivers\etc\hosts 파일을 열어서 아래 두 url 정보를 넣어준다. (앞에 노드 IP는 각자 환경에 맞게 넣는다.)
172.30.1.25 example.com
172.30.1.10 color.com
Rule에 example.com path에는 /yellow 가 정의 되어있지 않으므로 404 Not Found가 뜸을 볼 수 있다.
color.com:31208/ 접근 시 ingress rule에 맞게 yellow svc로 맵핑이 되는것을 볼 수 있다.
-- The End --
'Devops > Kubernetes' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 Dashboard 설치하기 (1) | 2024.01.07 |
---|---|
[Kubernetes] jenkins Kubernetes 에 설치 및 배포하기 (1) | 2023.12.31 |
[Kubernetes] apt-get 시 public key is not available: NO_PUBKEY 에러 수정 (1) | 2023.12.21 |
[Kubernetes] 쿠버네티스 Service 개념 - ClusterIP, NodePort (0) | 2022.01.23 |
[Kubernetes] Controller - Replicaset (0) | 2022.01.22 |