k8s ingress test

이동욱·2023년 8월 21일
0

k8s

목록 보기
1/3

k8s ingress test 해보기

1. 개요


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에 잘 접근이 되는지 확인하겠다.

2. 순서


  1. ingress controller 설치
  2. docker image 준비
  3. k8s deployment 생성
  4. k8s service 생성
  5. k8s ingress 생성
  6. test

3. 시작


docker image, deployment, service는 각각 두 개 씩 만들도록 한다.

  1. ingress controller 설치
  • 설치
$ 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
  1. docker image 준비

    위 처럼 간단하게 화면만 렌더링 해주는 application을 포함한 이미지를 생성하고자 한다.
  • 컨테이너 환경 구성
    docker hub에 있는 centos:7 이미지를 통해 container 생성 후 application jar를 실행시키는 sh 파일도 함께 생성하고 image를 만들었다.

$ docker commit ktest localhost:5000/ktest:test
$ docker push localhost:5000/ktest:test
  1. k8s deployment 생성
    k8s에서의 작업은 기본적으로 test라는 namespace에서 진행하였다.
$ 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
  1. k8s service 생성
    pod는 ingress의 external ip를 통해 접근하기 때문에 service는 cluster ip type으로 생성하였다.
$ 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
  1. k8s ingress 생성
    localhost1을 통해 접근 시 test-service에 트래픽이 가도록 설정하고 localhost2를 통해 접근 시 test-service2에 트래픽이 가도록 설정했다.
$ 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
  1. test
    위 ingress rule yaml 파일에서 봤듯이 domain을 통해 각각의 서비스에 트래픽을 전달하는 방식으로 테스트를 해보았다. hosts 파일에 127.0.0.1 localhost1, 127.0.0.1 localhost2를 추가하고 추가한 도메인으로 들어가보자.
  • localhost1로 들어갔을 때

  • localhost2로 들어갔을 때

정상적으로 각각의 서비스로 접근하는 것을 확인할 수 있다.

4. 고찰


deployment, service, ingress를 생성하여 테스트를 해보았다. ingress를 보면서 생각했던 것이 배포 방식 중 블루-그린 전략을 사용할 때 ingress를 사용할 수 있겠구나 생각했다.
위에 테스트 했던 것과 같은 방식으로 예시를 들면 ingress external ip에 실제 운영 도메인과 테스트 도메인을 두고 테스트 도메인에 그린(new) 버전의 서비스를 연동 시켜 테스트 완료 후 운영 도메인에 그린(new) 서비스를 연동 시켜 트래픽을 처리하는 것으로 블루-그린 전략을 수행할 수 있겠구나 생각했다.

profile
lduk 웹 개발자(back)

0개의 댓글