웹사이트 검색

인그레스 컨트롤러란 무엇이며 Helm을 사용하여 AWS의 Kubernetes 클러스터에 Nginx 인그레스 컨트롤러를 배포하는 방법


이 페이지에서

  1. 전제 조건
  2. 무엇을 할 것인가?\n
  3. Kops를 사용하여 Kubernetes 클러스터 생성\n
  4. Helm을 사용하여 Nginx 인그레스 컨트롤러 설정\n
  5. Route53에서 Nginx 인그레스 컨트롤러가 생성한 LoadBalancer를 가리키는 레코드세트를 생성합니다.\n
  6. 샘플 애플리케이션용 객체 정의 파일 만들기\n
  7. 샘플 애플리케이션 배포\n
  8. 인그레스 개체 배포
  9. 결론

Nginx Ingress Controller 설치를 진행하기 전에 Ingress 및 Ingress Controller가 무엇인지 간단히 살펴보겠습니다. 이 문서의 초점은 설정에 있으며 Kubernetes 클러스터에서 Nginx 인그레스 컨트롤러를 설정하기 위한 모든 전제 조건에 익숙하다고 가정합니다.

Kubernetes Ingress

Kubernetes 클러스터의 서비스에 대한 외부 액세스를 관리하는 Kubernetes 개체입니다. Kubernetes 클러스터 외부의 HTTP 및 HTTPS 경로를 Kubernetes 클러스터 내의 서비스에 노출합니다.

인그레스 컨트롤러

수신을 사용하려면 Kubernetes 클러스터에 수신 컨트롤러가 있어야 합니다. 클러스터의 다른 컨트롤러처럼 Kubernetes 클러스터의 일부로 제공되지 않으며 클러스터에서 자동으로 시작되지 않습니다. Kubernetes 클러스터에 인그레스 컨트롤러를 얼마든지 배포할 수 있습니다. 이렇게 하려면 각 인그레스에 적절한 ingress.class로 주석을 달아야 합니다. 다양한 유형의 수신 컨트롤러를 사용할 수 있습니다. Ingress Controller는 Kubernetes 환경을 위한 LoadBalancer입니다. Kubernetes 환경의 트래픽 관리 솔루션으로 사용됩니다.

이 기사에서는 Kops를 사용하여 설정된 Kubernetes 클러스터에서 Helm을 사용하여 Nginx Ingress Controller를 설치하는 것을 볼 수 있습니다. Nginx 인그레스 컨트롤러에 대해 자세히 알아보려면 여기에서 공식 문서를 참조하세요.

전제 조건

  1. AWS 계정(계정이 없는 경우 생성).
  2. Kops 1.18.2가 컴퓨터에 설치됨(Kops를 사용하여 Kubernetes 클러스터를 만들고 자세한 내용을 알아보려면 여기를 클릭하세요.)\n
  3. Helm v3.5.3 (Ubuntu 서버에 Helm을 설치하는 방법을 알아보려면 여기를 클릭하세요.)\n
  4. S3 버킷(AWS에서 S3 버킷을 생성하는 방법을 알아보려면 여기를 클릭하십시오).\n
  5. 도메인 이름(AWS에 도메인을 등록하는 방법을 알아보려면 여기를 클릭하세요.)\n
  6. 관리자 권한이 있는 IAM 역할(AWS에서 IAM 역할을 생성하는 방법을 알아보려면 여기를 클릭).\n

우리는 무엇을 할 것인가?

  1. Kops를 사용하여 Kubernetes 클러스터 생성\n
  2. Helm을 사용하여 Nginx 인그레스 컨트롤러 설정\n
  3. Route53에서 Nginx 인그레스 컨트롤러가 생성한 LoadBalancer를 가리키는 레코드세트를 생성합니다.\n
  4. 샘플 애플리케이션용 객체 정의 파일 만들기\n
  5. 샘플 애플리케이션 배포\n
  6. 인그레스 개체 배포

Kops를 사용하여 Kubernetes 클러스터 생성

클러스터 생성을 진행하기 전에 다음 명령어를 사용하여 AWS IAM 사용자 액세스 및 비밀 키를 내보냅니다.

export AWS_ACCESS_KEY_ID=<your-aws-access-key-here> #Export AWS Access Key
export AWS_SECRET_ACCESS_KEY=<your-aws-secret-key-here> ##Export AWS Secret Key export
Now, export the KOPS_STATE_STORE variable with value as S3 bucket name on your terminal.
KOPS_STATE_STORE=s3://<s3-bucket-name>

Kops를 사용하여 처음으로 클러스터를 생성하고 클러스터 구성을 저장하기 위해 위에 지정된 S3 버킷을 사용하는 경우 다음 명령을 사용하여 클러스터를 가져오려고 할 때 클러스터가 표시되지 않아야 합니다.

kops get clusters

Kops를 자세히 이해하려면 전제 조건에 지정된 문서를 참조하세요. 여기에서 Kubernetes 클러스터를 생성하려면 값을 대체하여 다음 명령을 실행합니다. 여기서는 자세히 다루지 않겠습니다.

kops create cluster --name <subdomain.domain.com> --state s3://<s3-bucket> --cloud aws --master-size t2.small --master-count 1 --master-zones us-east-1a --node-size t2.small --node-count 2 --zones us-east-1a,us-east-1b,us-east-1c

제안에서 몇 가지 명령어를 볼 수 있습니다.

이제 이번에는 클러스터 구성을 가져오려고 하면 클라우드 및 영역과 함께 출력에 클러스터 이름이 표시됩니다.

지금까지 클러스터가 생성되지 않았으므로 다음 명령을 실행하여 클러스터 구성을 업데이트합니다.

kops update cluster --name kops.devopslee.com

클러스터 리소스가 생성되도록 --yes를 옵션으로 사용하여 위의 명령을 실행해야 합니다.

kops update cluster --name kops.devopslee.com --yes

클러스터가 준비되었는지 확인합니다.

kops validate cluster --wait 10m

클러스터가 정상 상태가 될 때까지 잠시 기다려야 합니다.

kops validate cluster --wait 10m

클러스터가 정상이면 다음 명령을 사용하여 모든 네임스페이스에서 기본 포드를 확인할 수 있습니다.

kubectl get pods -A

Helm을 사용하여 Nginx 인그레스 컨트롤러 설정

Kubernetes 클러스터가 준비되고 정상이면 Helm을 사용하여 Nginx 인그레스 컨트롤러를 설치할 수 있습니다.

계속하기 전에 Helm v3.5.3이 있는지 확인하세요.

참고: 현재 위치에 있는 Helm 바이너리를 사용했기 때문에 스크린샷에서 ./helm을 볼 수 있습니다.

helm version

리포지토리를 추가하고 다음 명령을 사용하여 Nginx Ingress Controller Helm 차트를 설치합니다. Helm을 이해하려면 전제 조건 섹션에 언급된 문서를 참조하십시오.

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true

위의 스크린샷에서 Helm 차트가 설치된 것을 확인할 수 있습니다.

Ingress Controller의 일부로 생성된 리소스를 확인할 수 있습니다.

kubectl get pods
kubectl get deployment
kubectl get service

위 스크린샷에서 LoadBalancer 유형의 "nginx-ingress-ingress-nginx-controller" 서비스도 생성된 것을 볼 수 있습니다. AWS 계정에 LoadBalancer가 생성되었음을 의미합니다.

Nginx 인그레스 컨트롤러에 의해 생성된 LoadBalancer를 가리키는 Route53에서 레코드세트 생성

Kubernetes 클러스터를 생성한 리전의 AWS 계정으로 이동합니다. LoadBalancer를 확인하고 DNS 이름을 복사합니다.

이제 Route53으로 이동하여 HostedZone에 단일 A 레코드를 생성합니다.

유효한 레코드를 생성하면 생성한 레코드는 생성한 Nginx 인그레스 컨트롤러를 통해 트래픽을 Kubernetes 클러스터로 라우팅하는 데 사용됩니다. 이 경우 kops.devopslee.com은 Nginx 인그레스 컨트롤러를 통해 Kubernetes 클러스터의 서비스로 트래픽을 라우팅합니다.

샘플 애플리케이션용 객체 정의 파일 만들기

이제 개체 정의 파일을 만들어 샘플 애플리케이션을 배포해 보겠습니다. 우리는 배포를 위해 3개의 배포와 3개의 각각의 서비스를 사용하여 3개의 애플리케이션을 배포할 것입니다. 그런 다음 경로 기반 라우팅이 있는 Ingress 리소스를 생성하여 경로를 기반으로 kops.devopslee.com을 사용하여 애플리케이션으로 트래픽을 라우팅합니다.

애플리케이션 1에 대해 1-nginx-main-app.yaml을 생성합니다.

Github 링크: 내 Github 저장소에서 파일을 복사하려면 여기를 클릭하세요.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-main
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-main
  template:
    metadata:
      labels:
        run: nginx-main
    spec:
      containers:
      - image: nginx
        name: nginx


---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deploy-main
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: nginx-main

애플리케이션 2용 2-nginx-green-app.yaml을 만듭니다.

Github 링크: 내 Github 저장소에서 파일을 복사하려면 여기를 클릭하세요.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-green
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-green
  template:
    metadata:
      labels:
        run: nginx-green
    spec:
      volumes:
      - name: webdata
        emptyDir: {}
      initContainers:
      - name: web-content
        image: busybox
        volumeMounts:
        - name: webdata
          mountPath: "/webdata"
        command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=green>GREEN</font></h1>" > /webdata/index.html']
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: webdata
          mountPath: "/usr/share/nginx/html"


---
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deploy-green
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: nginx-green          

애플리케이션 3용 3-nginx-blue-app.yaml 생성

Github 링크: 내 Github 저장소에서 파일을 복사하려면 여기를 클릭하세요.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-blue
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-blue
  template:
    metadata:
      labels:
        run: nginx-blue
    spec:
      volumes:
      - name: webdata
        emptyDir: {}
      initContainers:
      - name: web-content
        image: busybox
        volumeMounts:
        - name: webdata
          mountPath: "/webdata"
        command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=blue>BLUE</font></h1>" > /webdata/index.html']
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: webdata
          mountPath: "/usr/share/nginx/html"


---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deploy-blue
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: nginx-blue

경로 기반 인그레스 규칙을 만들기 위해 4-ingress.yaml을 만듭니다.

Github 링크: 내 Github 저장소에서 파일을 복사하려면 여기를 클릭하세요.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: ingress-resource
spec:
  rules:
  - host: kops.devopslee.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-deploy-main
          servicePort: 80
      - path: /blue
        backend:
          serviceName: nginx-deploy-blue
          servicePort: 80
      - path: /green
        backend:
          serviceName: nginx-deploy-green
          servicePort: 80

여기 내 Github 저장소에서 이 모든 파일을 찾을 수 있습니다.

샘플 애플리케이션 배포

샘플 애플리케이션을 하나씩 배포하고 상태를 확인합니다.

kubectl apply -f 1-nginx-main-app.yaml
kubectl apply -f 2-nginx-green-app.yaml
kubectl apply -f 3-nginx-blue-app.yaml
kubectl get deployments
kubectl get pods
kubectl get service

인그레스 개체 배포

이제 경로 기반 라우팅 인그레스 리소스를 만들 차례입니다. 동시에 Nginx Pod의 로그를 확인합니다.

kubectl logs nginx-ingress-ingress-nginx-controller-5c97c6b4d5-btvpl -f
kubectl apply -f 4-ingress.yaml

Ingress 리소스가 생성되자마자 Nginx가 해당 구성을 로드한 것을 확인할 수 있습니다.

이제 다른 경로에서 동일한 호스트 이름(예: kops.devopslee.com)을 사용하여 3개의 다른 애플리케이션에 액세스할 준비가 되었습니다.

응용 프로그램의 URL, 여기서 호스트 이름은 사용자에 따라 다릅니다.

nginx-deploy-main은 kops.devopslee.com에서 액세스할 수 있습니다.

nginx-deploy-green은 kops.devopslee.com/green에서 액세스할 수 있으며

nginx-deploy-blue는 kops.devopslee.com/blue에서 액세스할 수 있습니다.

경로를 기반으로 동일한 호스트 이름을 사용하여 3개의 다른 애플리케이션에 액세스할 수 있음을 알 수 있습니다.

결론

이 도움말에서는 Kops를 사용하여 Kubernetes 클러스터를 만드는 단계를 확인했습니다. 이 문서는 주로 Helm을 사용하여 Nginx Ingress Controller를 설정하고 Ingress 리소스를 사용하여 경로 기반 라우팅을 생성하는 데 중점을 두었습니다. 3개의 다른 샘플 애플리케이션을 배포하고 동일한 호스트 이름과 다른 경로를 사용하여 액세스를 시도했습니다.