Docker 및 k8s를 공부하면서 ingress라는 것을 알게 되어 실제 test 해보려고 한다. 찾아보기론 보통 nginx를 활용한 nginx ingress controller 서비스를 생성해 일종의 웹 서버처럼 사용하는 것으로 이해했는데 일단 먼저 실제로 만들어서 해봐야겠다.
나는 window os 로컬 환경에 docker desktop을 설치한 환경에서 테스트 하였고 기본적인 docker 및 k8s 설치, docker private repository 등 된 상태라고 가정하고 글을 쓰도록 하겠다.
테스트 방식은 docker image를 두 개 만들어서 k8s deployment, service, ingress에 등록하여 ingress endpoint를 통해 두 개의 service에 잘 접근이 되는지 확인하겠다.
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml
$ kubectl get pod -A
$ kubectl get svc -A
$ docker commit ktest localhost:5000/ktest:test
$ docker push localhost:5000/ktest:test
$ kubectl create namespace test
$ kubectl get namespace -A
$ vi deployment_test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
namespace: test
spec:
selector:
matchLabels:
app: test-deployment
replicas: 1
template:
metadata:
labels:
app: test-deployment
spec:
containers:
- name: test-deployment
image: localhost:5000/test:test
ports:
- containerPort: 8080
imagePullSecrets:
- name: test
$ kubectl apply -f deloyment_test.yaml
$ kubectl get deployment -A
$ vi service_test_cluster.yaml
apiVersion: v1
kind: Service
metadata:
name: test-service2
namespace: test
spec:
type: ClusterIP
selector:
app: test-deployment2
ports:
- name: public
port: 80 # service의 port
targetPort: 8080 # pod or deployment port
protocol: TCP
$ kubectl apply -f service_test_cluster.yaml
$ kubectl get svc -A
$ vi test-ingress-controller-rule.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: test
annotations:
nginx.ingress.k8s.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx" # To use nginx type ingress controller
spec:
ingressClassName: nginx
rules:
- host: localhost1
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: test-service
port:
number: 80
- host: localhost2
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: test-service2
port:
number: 80
localhost1로 들어갔을 때
localhost2로 들어갔을 때
정상적으로 각각의 서비스로 접근하는 것을 확인할 수 있다.
deployment, service, ingress를 생성하여 테스트를 해보았다. ingress를 보면서 생각했던 것이 배포 방식 중 블루-그린 전략을 사용할 때 ingress를 사용할 수 있겠구나 생각했다.
위에 테스트 했던 것과 같은 방식으로 예시를 들면 ingress external ip에 실제 운영 도메인과 테스트 도메인을 두고 테스트 도메인에 그린(new) 버전의 서비스를 연동 시켜 테스트 완료 후 운영 도메인에 그린(new) 서비스를 연동 시켜 트래픽을 처리하는 것으로 블루-그린 전략을 수행할 수 있겠구나 생각했다.