IT STUDY LOG

[컨테이너 오케스트레이션] 04. 쿠버네티스 네트워크 본문

devops bootcamp 4/DevOps 인프라 관리

[컨테이너 오케스트레이션] 04. 쿠버네티스 네트워크

roheerumi 2023. 5. 22. 17:45

# 학습 목표

  • 컨테이너 오케스트레이션이 무엇인지 이해할 수 있다.
  • 쿠버네티스의 간단한 작동 원리를 이해할 수 있다.
  • 쿠버네티스 리소스 명세를 작성할 수 있다.
    • 파드 명세를 작성할 수 있다.
    • 디플로이먼트 명세를 작성할 수 있다.
    • 서비스를 이용해 파드를 노출할 수 있다.
  • kubectl 명령어를 사용하여 리소스의 생성, 삭제, 조회를 할 수 있다.
  • kubectl 명령어를 사용하여 롤아웃 관련 작업을 진행할 수 있다.
    • 롤링 배포 현황을 확인할 수 있다.
    • 새로운 버전에 문제가 발생했을 때 롤백할 수 있다.

(이하 advanced)

  • liveness probe를 이용하여 파드의 health check를 할 수 있다.
  • 쿠버네티스가 Stateful한 애플리케이션을 다루는 방법을 이해할 수 있다.
  • 쿠버네티스에서 인그레스를 이용한 HTTP 기반 라우팅을 적용할 수 있다.
  • helm 패키지 매니저를 사용할 수 있다.

# 학습 내용

1.  인그레스

인그레스

- 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 게이트웨이

- 일반적으로 HTTP를 관리하며 로드 밸런서, SSL Termination (클러스터 내에서는 HTTP로만 통신하게 하는 전환 과정), 가상 호스팅을 제공

인그레스 생성 및 적용

1) 기존 서비스 타입을 LoadBalancer로 ClusterIP로 바꾸고 적용. ClusterIP는 클러스터 내에서만 접근 가능하며 더 이상 EXTERNAL-IP는 사용할 수 없음

2) 인그레스 리소스를 다음과 같이 만들고 적용

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  namespace: default
spec:
  rules:
  - host: localhost
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

3) 인그레스는 kubectl get all로는 조회가 안되므로 kubectl get all, ingresses 사용해 생성된 인그레스 조회

$ kubectl apply -f application.yaml
deployment.apps/nginx-deployment created

$ kubectl apply -f service.yaml    
service/nginx-service created

$ kubectl apply -f ingress.yaml                           
ingress.networking.k8s.io/nginx-ingress created

$ kubectl get all,ingresses   
# pods 정보
NAME                                    READY   STATUS    RESTARTS        AGE
pod/nginx-deployment-85996f8dbd-tkmg7   1/1     Running   1 (3m10s ago)   122m

# service 정보
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP   123m
service/nginx-service   ClusterIP   10.98.165.212   <none>        80/TCP    7m36s # loadbalancer가 아님

# deployment 정보
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   1/1     1            1           122m

# replicaset 정보
NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-85996f8dbd   1         1         1       122m

# ingress 정보
NAME                                      CLASS   HOSTS       ADDRESS        PORTS   AGE
ingress.networking.k8s.io/nginx-ingress   nginx   localhost   192.168.49.2   80      8m42s

4) 인그레스는 인그레스 리소스(정책 그 자체) 외에도 인그레스 컨트롤러(정책을 실행시키는 도구)가 반드시 필요함

※ minikube를 사용하는 경우, 인그레스 컨트롤러는 애드온으로 별도의 설치가 필요합니다. 공식 문서를 참고해서 nginx 인그레스 컨트롤러를 활성화

# NGINX 인그레스 컨트롤러를 활성화
$ minikube addons enable ingress
💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
💡  After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
    ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.7.0
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
🔎  Verifying ingress addon...
🌟  'ingress' 애드온이 활성화되었습니다

# NGINX 인그레스 컨트롤러가 실행 중인지 확인
$ kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-qtm5q        0/1     Completed   0          58s
ingress-nginx-admission-patch-2mvkb         0/1     Completed   1          58s
ingress-nginx-controller-6cc5ccb977-7wwvr   1/1     Running     0          58s

5) 터널을 열고, http://localhost에 접속

$ minikube tunnel

 

인그레스의 필요성

- 서비스를 활용해 외부 IP 주소를 할당해 주는 서비스로드 밸런서를 생성하고 컨테이너로 트래픽을 보내는 방법을 이용해 애플리케이션(파드)을 외부에 노출시킬 수 있는데 왜 인그레스를 별도로 사용해야할까?

- 인그레스 리소스는 로드 밸런싱과 더불어 호스트 기반 라우팅을 지원하기 때문

- 앞서 만든 서비스의 경우 LoadBalancer에서 ClusterIP로 바꿨기 때문에 인그레스가 로드 밸런서의 역할을 수행해야 함

- 아주 단순한 애플리케이션도 서비스는 두 개 이상의 HTTP 요청을 가지는 것이 보통 (보통 각각 Web Server와 WAS로 대표)

- 이러한 서비스의 접근을 별도의 포트로 구분하여 접속하게 할 수도 있지만, 하나의 호스트 상에서 라우팅으로 구분하면 보다 유연한 서비스를 만들 수 있음

  • Web Server는 /로, WAS는 /api로 라우팅 가능
  • YAML 파일에서 spec.rules.host에 별도의 호스트를 지정하여 Web Server는 www.mydomain.click, WAS는 api.mydomain.click으로 설정하는 것도 가능

 

인그레스 컨트롤러란?

- 흔히 잘 알고 있는 nginx와 같은 애플리케이션이 바로 인그레스 컨트롤러 (nginx가 하는 일이 결국 호스트 기반 라우팅과 로드 밸런싱이므로)

- 즉 인그레스 컨트롤러는 규칙을 이행하는 실질적인 애플리케이션 컨테이너

 

Comments