기존 process
ingress를 설치하지 않았을 때의 프로세스이다. 서비스를 묶어서 관리하지 않기 떄문에 서비스마다 tls 보안 연결이나
라우팅을 구현할 때 각각의 서비스에 해당 설정들을 해야 한다. 따라서 ingress를 통해 하나의 규칙을 만들어 관리하는 것이 애플리케이션을 관리하는데 효과적으로 작용할 것이다.
Ingress를 적용한 process
해당 프로레스는 test1 서비스를 요청할 때의 프로세스이다.
- load Balancer를 통해 node에 전송한다.
- ingress controller에서 요청받은 정보를 바탕으로 해당 ingress 규칙을 찾아 서비스로 보내준다,
Deployment 생성
test1-deployment, test2-deployment 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: test1-deployment
spec:
replicas: 3
selector:
matchLabels:
app: test1-label
template:
metadata:
name: test1-deployment-pod
labels:
app: test1-label
spec:
containers:
- name: test1-pod
image: wonho96/wonho-image:ingress-test-1
ports:
- containerPort: 8081
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test2-deployment
spec:
replicas: 3
selector:
matchLabels:
app: test2-label
template:
metadata:
name: test2-deployment-pod
labels:
app: test2-label
spec:
containers:
- name: test2-pod
image: wonho96/wonho-image:ingress-test-2
ports:
- containerPort: 8082
Service생성
test1-service, test2-service 생성
apiVersion: v1
kind: Service
metadata:
name: test1-service
spec:
ports:
- name: test1-port
port: 80
targetPort: 8081
selector:
app: test1-label
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
name: test2-service
spec:
ports:
- name: test2-port
port: 80
targetPort: 8082
selector:
app: test2-label
type: NodePort
ingress-nginx Controller 생성
# 생성
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
# result
kubectl get service -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.233.9.152 <pending> 80:30310/TCP,443:31280/TCP 44s
ingress-nginx-controller-admission ClusterIP 10.233.31.119 <none> 443/TCP 44s
ingress-nginx-controller 부분을 보면 EXTERNAL-IP에 pending이라고 되어 있는 것을 볼 수 있다.
나는 aws를 사용하지 않기 때문에 LoadBalancer 타입을 생성하더라도 사용할 수 없다.
따라서 NodePort 타입의 ingress-nginx controller를 생성해줘야 한다.
ingress-nginx Controller NodePort 타입 생성
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller-nodeport
namespace: ingress-nginx
spec:
ports:
- name: http
nodePort: 31000
port: 80
protocol: TCP
targetPort: http
- name: https
nodePort: 32000
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
type: NodePort
ingress 생성
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2 # /test1, /test2를 /로 다시 만들어 작성해주는 옵션
nginx.ingress.kubernetes.io/use-regex: "true" # 정규식을 허용하는 설정
spec:
ingressClassName: nginx
rules:
- http:
paths:
- pathType: ImplementationSpecific
path: /test1(/|$)(.*) # 하위 path도 사용할 수 있도록 정규식 사용
backend:
service:
name: test1-service
port:
number: 80
- pathType: ImplementationSpecific
path: /test2(/|$)(.*) # 하위 path도 사용할 수 있도록 정규식 사용
backend:
service:
name: test2-service
port:
number: 80
nginx.ingress.kubernetes.io/reswrite-target에 /$2를 사용한 이유는 하위 path까지 검색할 수 있도록 하는 설정이다.
확인
kubectl get service -n ingress-nginx
# result
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.233.9.152 <pending> 80:30310/TCP,443:31280/TCP 16m
ingress-nginx-controller-admission ClusterIP 10.233.31.119 <none> 443/TCP 16m
ingress-nginx-controller-nodeport NodePort 10.233.49.208 <none> 80:31000/TCP,443:32000/TCP 2m33s
<nodeIP>:31000으로 들어가면 정상적으로 작동되는 것을 확인할 수 있다.
'Kubernetes' 카테고리의 다른 글
7-2. Kubernetes IngressController SSL/TLS 보안 적용 (4) | 2024.08.27 |
---|---|
6. Kubernetes Secret (0) | 2024.08.13 |
5. Kubernetes Configmap (0) | 2024.08.13 |
4. Kubernetes Service (0) | 2024.08.07 |
3. Kubernetes Deployment (0) | 2024.08.07 |