IBM Cloud Private 용 NGINX Ingress Controller 사용

이 포스트에서는 IBM Cloud Private 의 Vagrant 기반 배포를 활용하여 IBM Cloud Private 환경에서 기본 Ingress Controller를 교체하는 방법을 다룹니다. 이는 개발 목적으로 단일 노드에 IBM Cloud Private 환경을 구축하는 쉬운 방법이지만 ICP는 IBM Cloud(이전의 SoftLayer) 또는 OpenStack 환경에도 배포할 수 있습니다.

글로벌 소매업체에서 은행 및 항공사에 이르기까지 오늘날의 기업은 기존 애플리케이션과 인프라를 현대화해야 할 의무가 있습니다. 그들은 Google, Facebook 및 Netflix와 같은 웹 스케일 회사가 항상 제공해온 민첩성을 달성하는 데 도움이 되는 새로운 플랫폼과 도구, 개발 접근 방식 및 IT 공급자를 찾고 있습니다.

ICP(IBM Cloud Private)는 기업의 방화벽 뒤에 있는 마이크로서비스 아키텍처를 기반으로 하는 최신 애플리케이션을 개발하기 위한 플랫폼으로, 규정 준수, 보안, 지원 및 서비스에 대한 기업의 요구 사항에 적합합니다.

IBM Cloud Private 는 컨테이너 오케스트레이터로 Kubernetes, 개인 이미지 저장소, 관리 콘솔 및 모니터링 프레임워크를 포함하는 컨테이너 관리를 위한 통합 환경입니다. 플랫폼이 Kubernetes를 기반으로 구축되었기 때문에 블로그의 Kubernetes 부하 분산을 위한 NGINX 및 NGINX Plus Ingress Controller 에 자세히 설명된 NGINX Plus Ingress Controller 를 활용할 수 있습니다.

목차

1. 환경 준비
2. 기본 Ingress Controller 삭제
3. NGINX Plus용 NGINX Ingress Controller Docker 이미지 만들기
4. Helm 차트와 함께 NGINX Ingress Controller 설치
5. 데모 애플리케이션 배포
6. 배포 모니터링
7. 요약

1. IBM Cloud Private 환경 준비

어떤 배포 환경을 선택하든 첫 번째 단계는 모든 요구 사항을 충족하는 것입니다. 우리는 로컬 가상 머신(VM)에서 Vagrant와 함께 배포하기로 선택했습니다. 이것은 다른 요구 사항 중에서 최소 10GiB의 RAM이 필요한 다소 무거운 시스템입니다.

모든 요구 사항을 충족하면 다음 명령을 실행하여 Vagrant 배포를 시작합니다.

$ git clone https://github.com/IBM/deploy-ibm-cloud-private.git
$ cd deploy-ibm-cloud-private
$ vagrant up

VM을 프로비저닝하고 필요한 모든 컨테이너를 시작하는 데 약간의 시간이 걸립니다. 다음 배너가 나타나면 설치가 완료된 것입니다. 그런 다음 vagrant ssh 명령을 실행하여 Vagrant VM에 로그인합니다.

    icp: #############################################################################
    icp: #          IBM Cloud Private community edition installation complete!       #
    icp: #                  The web console is now available at:                     #
    icp: #                                                                           #
    icp: #                          https://192.168.50.100:8443                      #
    icp: #                   default username/password is admin/admin                #
    icp: #                                                                           #
    icp: #                          Documentation available at:                      #
    icp: #               https://www.ibm.com/support/knowledgecenter/SSBS6K          #
    icp: #                                                                           #
    icp: #                 Request access to the ICP-ce Public Slack!:               #
    icp: #                            http://ibm.biz/BdsHmN                          #
    icp: #############################################################################

$ vagrant ssh

Vagrant 빌드가 완료되었을 때 표시되는 IP 주소(여기서는 192.168.50.100)를 기록해 둡니다. 사용 사례에서는 Ingress Controller 에 할당된 공용 IP 주소와 IBM Cloud Private GUI에 액세스하기 위한 주소가 됩니다. 이 시점에서 여기 지침에 따라 kubectl 명령줄 도구에 대한 원격 액세스를 구성할 수도 있습니다.

2. IBM Cloud Private 의 기본 Ingress Controller 삭제

vagrant@primary:~$ kubectl -n kube-system delete ds/nginx-ingress-lb-ppc64le
daemonset "nginx-ingress-lb-ppc64le" deleted
vagrant@primary:~$ kubectl -n kube-system delete ds/nginx-ingress-lb-amd64
daemonset "nginx-ingress-lb-amd64" deleted

또한 default-http-backend라는 Kubernetes Service 및 Deployment 객체와 nginx-load-balancer-conf ConfigMap도 삭제합니다.

vagrant@primary:~$ kubectl -n kube-system delete svc/default-http-backend
service "default-http-backend" deleted
vagrant@primary:~$ kubectl -n kube-system delete deployment/default-http-backend
deployment "default-http-backend" deleted
vagrant@primary:~$ kubectl -n kube-system delete configmap/nginx-load-balancer-conf
configmap "nginx-load-balancer-conf" deleted

3. NGINX Plus용 NGINX Ingress Controller Docker 이미지 만들기

NGINX Plus를 Ingress Controller로 사용하려면 먼저 Ingress Controller 컨테이너 이미지를 빌드해야 합니다. NGINX는 NGINX Plus용 NGINX Ingress Controller 의 사전 빌드된 컨테이너 이미지를 배포하지 않지만 해당 이미지 생성은 간단하고 GitHub의 NGINX Ingress Controller 저장소에 잘 문서화되어 있습니다.

첫 번째 단계는 Vagrant VM에서 GitHub 저장소를 복제하는 것입니다.

vagrant@primary:~$ git clone https://github.com/nginxinc/kubernetes-ingress.git
Cloning into 'kubernetes-ingress'...
remote: Counting objects: 11149, done.
remote: Total 11149 (delta 0), reused 0 (delta 0), pack-reused 11149
Receiving objects: 100% (11149/11149), 20.79 MiB | 2.05 MiB/s, done.
Resolving deltas: 100% (3835/3835), done.
Checking connectivity... done.

다음으로 NGINX Plus 구독 또는 평가판과 관련된 NGINX Plus 인증서 및 키 파일이 있는지 확인하고 필요한 경우 복사합니다.

vagrant@primary:~$ cd kubernetes-ingress/nginx-controller/
vagrant@primary:~/kubernetes-ingress/nginx-controller$ ls -la nginx-repo.*
-rw-rw-r-- 1 vagrant vagrant 1334 Mar 15 19:00 nginx-repo.crt
-rw-rw-r-- 1 vagrant vagrant 1704 Mar 15 19:01 nginx-repo.key

NGINX Plus 이미지를 안전하게 저장하기 위해 IBM Cloud Private 의 일부로 배포된 프라이빗 이미지 레지스트리에 로그인합니다. 이 예에서는 기본 제공 관리자 계정을 사용하고 있습니다.

vagrant@primary:~/kubernetes-ingress/nginx-controller$ docker login mycluster.icp:8500
Username: admin
Password: password
Login Succeeded

이제 NGINX Plus용 NGINX Ingress Controller 이미지를 빌드하고 로컬 이미지 리포지토리에 업로드합니다.

vagrant@primary:~/kubernetes-ingress/nginx-controller$ make clean
rm -f nginx-ingress
vagrant@primary:~/kubernetes-ingress/nginx-controller$ make DOCKERFILE=DockerfileForPlus 
PREFIX=mycluster.icp:8500/kube-system/nginx-plus-ingress;
docker run --rm -v /home/vagrant/kubernetes-ingress/nginx-controller/../:/go/src/github.com/nginxinc/kubernetes-ingress -w /go/src/github.com/nginxinc/kubernetes-ingress/nginx-controller/ golang:1.9 go test ./...
...
Successfully built 14c9175da736
Successfully tagged mycluster.icp:8500/kube-system/nginx-plus-ingress:1.1.1
docker push mycluster.icp:8500/kube-system/nginx-plus-ingress:1.1.1
The push refers to repository [mycluster.icp:8500/kube-system/nginx-plus-ingress]
0d0d4a6ae01c: Mounted from default/nginx-plus-ingress
ac13d835531f: Mounted from default/nginx-plus-ingress
8e227d7592cb: Mounted from default/nginx-plus-ingress
dfa9320f47a2: Mounted from default/nginx-plus-ingress
2ebe8bc4efb9: Mounted from default/nginx-plus-ingress
5500ab547185: Mounted from default/nginx-plus-ingress
646527a83e96: Mounted from default/nginx-plus-ingress
014cf8bfcb2d: Mounted from default/nginx-plus-ingress
1.1.1: digest: sha256:79f9f8848cd97ae3651279144e079bd27258894435fb09a5f8fde06e2e9406b1 size: 1990

다음 명령을 실행하여 이미지가 성공적으로 생성되었는지 확인할 수 있습니다.

vagrant@primary:~/kubernetes-ingress/nginx-controller$ kubectl get images --all-namespaces
NAMESPACE     NAME                 AGE
kube-system   nginx-plus-ingress   2m

보시다시피 이미지는 kube-system 네임스페이스의 일부입니다. PREFIX 인수를 사용하여 make 명령에 다른 경로를 설정한 경우 다음 명령을 실행하여 범위를 네임스페이스에서 글로벌로 업데이트해야 합니다. 이는 NGINX Ingress Controller가 kube-system 네임스페이스의 일부로 실행되어야 하고 이미지에 액세스해야 하기 때문입니다.

vagrant@primary:~/kubernetes-ingress/nginx-controller$ kubectl -n kube-system edit image image-name

4. Helm 차트와 함께 NGINX Ingress Controller 설치

이제 NGINX Plus 이미지가 생성되었으므로 새 Ingress Controller를 설치할 수 있습니다. 이를 수행하는 가장 쉬운 방법은 kubernetes-ingress GitHub 저장소의 일부인 Helm 차트를 사용하는 것입니다. helm-chart 디렉터리에는 NGINX Open Source와 함께 사용되는 NGINX Ingress Controller용인 기본 values.yaml 파일과 함께 특히 이 예제를 위한 values-icp.yaml 파일이 있습니다.

default values.yaml 파일과 IBM Cloud Private 버전 간의 주요 차이점은 namespace 및 tolerations 매개변수의 값이며, IBM Cloud Private 버전에서는 각각 kube-system 및 “icp”입니다. 기본 ICP 접근 방식을 준수하고 Ingress Controller를 Kubernetes DaemonSet으로 배포하기 때문에 종류 매개변수를 daemonset으로 설정합니다. 또한 nodeselector 매개변수에 대해 일부 ICP 특정 값을 설정하고 있습니다. 모든 설정을 검토하려면 GitHub 리포지토리에서 전체 파일을 참조하세요.

자체 배포의 경우 위에 표시된 make 명령을 변경하는 경우 .yaml 파일의 해당 매개변수(예: 리포지토리 및 태그)를 일치하도록 변경해야 합니다.

업데이트된 values-icp.yaml 파일이 있으면 helm install 명령을 실행하여 NGINX Ingress Controller 를 설치합니다. (가독성을 위해 출력의 마지막 줄을 두 줄로 나누었습니다.)

vagrant@primary:~/kubernetes-ingress/nginx-controller$ cd ..
vagrant@primary:~/kubernetes-ingress$ helm install --name nginx-plus-ingress -f helm-chart/values-icp.yaml helm-chart/
NAME:   nginx-plus-ingress
LAST DEPLOYED: Tue Mar 20 22:43:11 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Secret
NAME                   TYPE    DATA  AGE
default-server-secret  Opaque  2     2s

==> v1/ConfigMap
NAME          DATA  AGE
nginx-config  2     2s

==> v1beta1/DaemonSet
NAME                      DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  ... 
nginx-ingress-controller  0        0        0      0           0     
     
    ...NODE-SELECTOR                             AGE
       beta.kubernetes.io/arch=amd64,proxy=true  1s

5. 데모 애플리케이션 배포

Ingress Controller 를 빠르게 테스트하기 위해 README에 제공된 지침에 따라 kubernetes-ingress 리포지토리에 포함된 간단한 전체 예제 애플리케이션을 배포할 수 있습니다.

vagrant@primary:~/kubernetes-ingress$ cd examples/complete-example
vagrant@primary:~/kubernetes-ingress/examples/complete-example$ kubectl create -f cafe.yaml
deployment "coffee" created
service "coffee-svc" created
deployment "tea" created
service "tea-svc" created
vagrant@primary:~/kubernetes-ingress/examples/complete-example$ kubectl create -f cafe-secret.yaml
secret "cafe-secret" created
vagrant@primary:~/kubernetes-ingress/examples/complete-example$ kubectl create -f cafe-ingress.yaml
ingress "cafe-ingress" created

이 명령을 실행하여 Ingress Controller Pod가 실행 중인지 확인합니다.

vagrant@primary:~/kubernetes-ingress/examples/complete-example$ kubectl -n kube-system get pods | grep nginx
nginx-ingress-controller-6r8c2                  1/1       Running            0          31s

다음으로 Ingress Controller가 데모 애플리케이션으로 올바르게 라우팅되는지 테스트합니다. 먼저 IC_IP 환경 변수를 환경 준비에서 vagrant up 명령의 출력에 표시된 IP 주소(우리의 경우 192.168.50.100)로 설정합니다. 서비스에 액세스하기 위해 curl 명령을 실행합니다.

vagrant@primary:~/kubernetes-ingress/examples/complete-example$ export IC_IP=192.168.50.100
vagrant@primary:~/kubernetes-ingress/examples/complete-example$ curl --resolve cafe.example.com:443:$IC_IP https://cafe.example.com/coffee --insecure
Server address: 10.1.189.69:80
Server name: coffee-7586895968-z7jxl
Date: 13/Mar/2018:23:11:02 +0000
URI: /coffee
Request ID: ff48a3670a937cafaf53f8d48b05f1cf
vagrant@primary:~/kubernetes-ingress/examples/complete-example$ curl --resolve cafe.example.com:443:$IC_IP https://cafe.example.com/tea --insecure
Server address: 10.1.189.68:80
Server name: tea-7cd44fcb4d-jzcq6
Date: 13/Mar/2018:23:11:14 +0000
URI: /tea
Request ID: ff15bdaf66651a0d9b5fda634dfc4cdd

6. 배포 모니터링

NGINX Ingress Controller 설치 지침의 5단계에 설명된 대로 NGINX Plus 라이브 활동 모니터링 대시보드에 대한 포트 전달을 구성하면 포트 8080의 대시보드에서 배포를 추적할 수 있습니다.

대시보드 모니터링

그리고 Upstreams 탭을 열면 배포한 coffee 및 tea 애플리케이션 모두에 대한 항목이 있음을 알 수 있습니다.

대시보드 모니터링 자세하게

7. IBM Cloud Private 요약

이 포스트에서는 ICP의 Vagrant 기반 배포를 사용하여 IBM Cloud Private 환경의 기본 Ingress Controller를 NGINX Plus용 Ingress Controller로 대체하는 방법을 보여주었습니다. 추가 노드, 프로덕션 배치 또는 유사한 환경(예: IBM Cloud 또는 OpenStack)에 대해 필요에 따라 위의 단계를 수정할 수 있습니다.

NGINX Plus 및 NGINX App Protect와 함께 NGINX Ingress Controller를 사용해 보려면 지금 무료 30일 평가판을 시작하거나 당사에 연락하여 사용 사례에 대해 논의하십시오.

NGINX Open Source와 함께 NGINX Ingress Controller를 사용해 보려면 소스 코드를 얻거나 DockerHub에서 미리 빌드된 컨테이너를 다운로드할 수 있습니다.

사용 사례에 대해 최신 소식을 빠르게 전달받고 싶으시면 아래 뉴스레터를 구독하세요.