티스토리 뷰

이전 단원에서 각 인스턴스에 대한 액세스를 허용하는 두 가지 방법으로 Fruit Smoothies의 평가 웹 사이트 및 RESTfull API를 노출했다. API는 클러스터 내에서 사용하기 위한 내부 IP 주소를 만드는 ClusterIP를 사용하여 ratings-api 서비스를 통해 노출된다. 이 값을 선택하면 클러스터 내에서만 서비스에 연결할 수 있다. 웹 사이트는 Azure에서 공용 IP 주소를 만들어서 Azure 로드밸런서에 할당하는 LoadBalancer를 사용하여 ratings-web 서비스를 통해 노출된다. 이 값을 선택하면 클러스터 외부에서 서비스에 연결할 수 있음을 상기한다.

부하 분산 장치는 공개적으로 액세스할 수 있는 IP를 통해 평가 웹 사이트를 노출하지만 고려해야 할 제한 사항이 있다.

Fruit Smoothies의 개발 팀이 동영상 업로드 웹 사이트를 추가하여 프로젝트를 확장하기로 한다고 가정해 보겠다. Fruit Smoothies의 팬들은 집, 해변 또는 직장에서 스무디를 즐기는 방법에 대한 동영상을 제출할 수 있다. 현재 평가 웹 사이트는 FruitSmoothies.com에서 응답한다. 새 동영상 사이트를 배포할 때 새 사이트는 fruitsmoothies.com/videos에서 응답하고 평가 사이트는 fruitsmoothies.com/ratings에서 응답하게 하려 한다.

부하 분산 장치 솔루션을 계속 사용하는 경우 클러스터에 별도의 부하 분산 장치를 배포하고 해당 IP 주소를 새로운 FQDN(정규화된 도메인 이름)에 매핑해야 한다(예: videos.fruitsmoothies.com). 필요한 URL 기반 라우팅 구성을 구현하려면 클러스터 외부에 추가 소프트웨어를 설치해야 한다.

추가 작업은 Kubernetes 부하 분산 장치 서비스가 4 계층 부하 분산 장치라는 것이다. 4 계층 부하 분산 장치는 IP 주소, TCP 및 UDP 포트 간의 라우팅 결정만 처리한다. Kubernetes는 인그레스 컨트롤러를 사용하여 위의 구성을 간소화하는 옵션을 제공한다.

 

이번 실습에서는 다음을 수행한다.

  • NGINX를 실행하는 Kubernetes 인그레스 컨트롤러 배포
  • ClusterIP를 사용하도록 평가 웹 서비스 다시 구성
  • 평가 웹 서비스에 대한 인그레스 리소스 만들기
  • 애플리케이션 테스트

 

 

 

 

NGINX를 실행하는 Kubernetes 인그레스 컨트롤러 배포

Kubernetes 인그레스 컨트롤러는 7 계층 부하 분산 장치 기능을 제공하는 소프트웨어이다. 해당 기능에는 역방향 프록시, 구성 가능한 트래픽 라우팅 및 Kubernetes 서비스에 대한 TLS 종료가 포함된다. 인그레스 컨트롤러를 설치하고 부하 분산 장치를 대체하도록 구성한다. 이제 인그레스 컨트롤러를 사용하여 클러스터 외부에서 추가 소프트웨어 없이도 모든 부하 분산, 인증, TSL/SSL 및 URL 기반 라우팅 구성을 수행할 수 있다.

 

Azure Application Gateway, Ambassador, HAProxy, Kong, NGINX, Traefik 등 AKS(Azure Kubernetes Service)에서 Kubernetes 인그레스를 실행할 수 있는 몇 가지 옵션이 있다. 인그레스 컨트롤러는 LoadBalancer 유형의 Kubernetes 서비스를 사용하여 인터넷에 노출된다. 인그레스 컨트롤러는 Kubernetes 인그레스 리소스를 확인하고 구현하며, 이 리소스는 애플리케이션 엔드포인트에 대한 경로를 만든다. 여기서는 NGINX를 사용하여 기본 Kubernetes 인그레스 컨트롤러를 배포한다. 그런 다음, 트래픽에 해당 인그레스를 사용하도록 평가 프런트 엔드 서비스를 구성한다.

NGINX 인그레스 컨트롤러는 Kubernetes의 다른 모든 디플로이먼트처럼 배포된다. 디플로이먼트 매니페스트 파일을 사용하여 NGINX 인그레스 컨트롤러 이미지를 지정하거나 NGINX 인그레스 Helm 차트를 사용할 수 있다. NGINX Helm 차트는 인그레스 컨트롤러에 필요한 디플로이먼트 구성을 간소화한다. 예를 들어 구성 매핑을 정의하거나 NGINX 배포에 대한 서비스 계정을 구성할 필요가 없다. 여기서는 Helm 차트를 사용하여 클러스터에 인그레스 컨트롤러를 설치한다.

 

1. 먼저 인그레스에 대한 네임스페이스를 만든다.


kubectl create namespace ingress

kim@Azure:~$ kubectl create namespace ingress
namespace/ingress created

 

2. 아래 helm repo add 명령을 실행하여 안정적 리포지토리를 사용하도록 Helm 클라이언트를 구성한다.


helm repo add stable https://kubernetes-charts.storage.googleapis.com/

 

3. 다음으로, NGINX 인그레스 컨트롤러를 설치한다. NGINX 인그레스는 이전에 MongoDB를 설치할 때 구성한 안정화 Helm 리포지토리의 일부이다. 중복성을 추가하기 위해 --set controller.replicaCount 매개 변수와 함께 배포되는 NGINX 인그레스 컨트롤러의 두 복제본을 설치한다. Windows Server 노드가 인그레스 컨트롤러를 실행하지 않아야 하므로 Linux 노드에서만 컨트롤러를 예약해야 한다. --set nodeSelector 매개 변수를 사용하여 노드 셀렉터를 지정하면 Linux 기반 노드에서만 NGINX 인그레스 컨트롤러를 실행하도록 Kubernetes 스케줄러에 지시할 수 있다.


helm install nginx-ingress stable/nginx-ingress \
--namespace ingress \
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux

 

4. 설치가 완료되면 다음과 비슷한 출력이 표시된다.

kim@Azure:~$ helm install nginx-ingress stable/nginx-ingress \
> --namespace ingress \
> --set controller.replicaCount=2 \
> --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
> --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux
WARNING: This chart is deprecated
NAME: nginx-ingress
LAST DEPLOYED: Sun May 16 05:05:50 2021
NAMESPACE: ingress
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
*******************************************************************************************************
* DEPRECATED, please use https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx *
*******************************************************************************************************
 
 
The nginx-ingress controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace ingress get services -o wide -w nginx-ingress-controller'
 
An example Ingress that makes use of the controller:
 
  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
    name: example
    namespace: foo
  spec:
    rules:
      - host: www.example.com
        http:
          paths:
            - backend:
                serviceName: exampleService
                servicePort: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
        - hosts:
            - www.example.com
          secretName: example-tls
 
If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:
 
  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

 

5. 다음으로, 인그레스 서비스의 공용 IP를 확인해 보겠다. 서비스에서 공용 IP를 가져오는 데 몇 분 정도 걸린다. 실시간으로 업데이트를 확인하려면 -w 플래그를 추가하여 watch로 다음 명령을 실행한다. Ctrl-C를 사용하여 확인을 중지한다.


kubectl get service nginx-ingress-controller --namespace ingress -w

서비스는 실제 IP로 변경될 때까지 잠시동안 EXTERNAL-IP를 으로 표시한다.

kim@Azure:~$ kubectl get service nginx-ingress-controller --namespace ingress -w
NAME                       TYPE           CLUSTER-IP   EXTERNAL-IP    PORT(S)                      AGE
nginx-ingress-controller   LoadBalancer   10.2.0.238   20.194.0.122   80:32386/TCP,443:30329/TCP   35s

20.194.0.122와 같이 해당 외부 IP를 기록해 둔다.

 

 

 

 

ClusterIP를 사용하도록 평가 웹 서비스 다시 구성

인그레스를 통해 디플로이먼트를 공개할 예정이므로 서비스에 대한 공용 IP를 사용할 필요가 없다. 여기서는 LoadBalancer 대신 ClusterIP를 사용하도록 서비스를 변경한다.

 

1. 통합 편집기를 사용하여 ratings-web-service.yaml이라는 이름의 파일을 편집한다.


code ratings-web-service.yaml

 

2. 파일의 기존 콘텐츠를 다음 텍스트로 대체한다. 서비스 type이 ClusterIP로 변경된다.

apiVersion: v1
kind: Service
metadata:
  name: ratings-web
spec:
  selector:
    app: ratings-web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

 

3. 파일을 저장하려면 Ctrl+S를 선택한다. 편집기를 닫으려면 Ctrl+Q를 선택한다.

 

4. 배포된 서비스에서는 type의 값을 업데이트할 수 없다. 서비스를 삭제하고 변경된 구성으로 다시 만들어야 한다.

다음 명령을 실행하여 서비스를 삭제한다.


kubectl delete service \
--namespace ratingsapp \
ratings-web\

kim@Azure:~$ kubectl delete service \
> --namespace ratingsapp \
> ratings-web
service "ratings-web" deleted

 

다음 명령을 실행하여 서비스를 다시 만든다.


kubectl apply \
--namespace ratingsapp \
-f ratings-web-service.yaml

 

 

 

 

평가 웹 서비스에 대한 인그레스 리소스 만들기

Kubernetes 인그레스 컨트롤러에서 요청을 ratings-web 서비스로 라우팅하려면 인그레스 리소스가 필요하다. 인그레스 리소스는 인그레스 컨트롤러의 구성을 지정하는 위치이다.

각 인그레스 리소스에는 선택적 호스트, 요청에서 평가할 경로 목록 및 요청을 라우팅할 백 엔드를 지정하는 하나 이상의 인그레스 규칙이 포함된다. 이러한 규칙은 각 요청에서 취하는 경로를 결정하기 위해 평가된다.

ratings-web 서비스에 대한 경로를 포함한 인그레스 리소스를 설정하겠다.

 

1. 통합 편집기를 사용하여 ratings-web-ingress.yaml이라는 이름의 파일을 편집한다.


code ratings-web-ingress.yaml

 

2. 다음 텍스트를 파일에 붙여넣는다.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ratings-web-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: frontend.<ingress ip>.nip.io # IMPORTANT: update <ingress ip> with the dashed public IP of your ingress, for $    http:
      paths:
      - backend:
          serviceName: ratings-web
          servicePort: 80
        path: /

 

이 파일에서 host 키의 <ingress ip> 값을 이전에 검색한 인그레스의 dashed 공용 IP로 업데이트 한다(예: frontend.20-194-0-122.nip.io). 이 값을 사용하면 IP 주소 대신 호스트 이름을 통해 인그레스에 액세스할 수 있다. 다음 단원에서는 이 호스트 이름에 SSL/TLS를 구성한다.

참고
다음 예제에서는 와일드 카드 DNS를 제공하는 무료 서비스인 nip.io를 사용한다. xip.io 또는 sslip.io와 같은 대안을 사용할 수도 있다. 아니면 도메인 이름을 사용하고 적절한 DNS 레코드를 설정해도 된다.

 

3. 파일을 저장하려면 Ctrl+S를 선택한다. 편집기를 닫으려면 Ctrl+Q를 선택한다.

 

4. kubectl apply 명령을 사용하여 구성을 적용하고 ratingsapp 네임스페이스에서 인그레스 경로 파일을 배포한다.


kubectl apply \
--namespace ratingsapp \
-f ratings-web-ingress.yaml

다음 예제와 비슷한 출력이 표시된다.

kim@Azure:~$ kubectl apply \
> --namespace ratingsapp \
> -f ratings-web-ingress.yaml
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.networking.k8s.io/ratings-web-ingress created

 

 

 

 

애플리케이션 테스트

애플리케이션을 보고 애플리케이션과 상호 작용하려면 웹 브라우저의 인그레스에 구성한 호스트 이름을 연다 (예: http://frontend.20-194-0-122.nip.io).

 

 

 

 

요약

이번 실습에서는 NGINX 인그레스 컨트롤러를 배포하고 클러스터 내에서만 액세스할 수 있도록 ratings-web 서비스를 업데이트했다. 그런 다음, 호스트 이름을 통해 ratings-web 서비스 배포의 역방향 프록시에 대한 경로를 포함하는 인그레스 리소스를 만들었다.

 

 

 

8편에서 계속

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함