Kubernetes Fullstack 응용 프로그램을 Heroku 컨테이너로 변환

9829 단어 kubernetesdevops
지난 몇 년 동안 구글의 쿠베르니테스 프로젝트는 거대한 센세이션을 일으켰다.이 프로젝트는 이미 클라우드 인프라 분야의 거두로 발전했다.
비록 이것은 위대한 프로젝트로 많은 용도가 있지만, 그것은 여전히 복잡한 거대한 것이다.주요 클라우드 공급업체로부터 위탁 관리되는 Kubernetes 서비스가 있어도 팀은 끊임없이 확장된 플러그인과 패턴 변환을 사용하여 복잡하고 얽힌 구조를 유지해야 한다.그 유연성이 고유한 복잡성 때문에 Kubernetes는 자신의 기술로 이 다양한 편성 생태계를 실현하고 유지하며 업그레이드하고 조작해야 한다.

PaaS의 단순성


이러한 밀집적이고 기능 기반의 수요는 일부 상업 모델에 적용될 수 있다.그러나 서버와 보안을 관리하는 대신 응용 프로그램을 구축하는 데 시간이 걸리려면 Kubernetes가 아닌 플랫폼 즉 서비스(PaaS)를 고려해야 할 수도 있습니다.이러한 공급업체는 환경의 인프라, 보안, 가시성, 전체적인 복지를 유지하기 때문에 비즈니스 크리티컬 어플리케이션에 집중할 수 있습니다.
Kubernetes의 장점 중 하나는 통일된 환경 체험을 제공할 수 있다는 것이다.Kubernetes에 적응하기 위해 구축된 응용 프로그램은 디자인상 이식이 가능하고 본질적으로 짧으며 어떠한 용기 구동 세계에서도 생활할 수 있으며 인프라 시설과 무관하다( Twelve Factor Apps 응용 프로그램 구축에 대한 더 많은 안내서를 참조).그렇다면 한 응용 프로그램 팀이 쿠베르니테스가 관리하는 인프라 시설의 복잡성에서 벗어나 기획된 PaaS를 지원하려면 어떤 모습일까?
오늘 이 간단한 것 Kubernetes driven Flask application을 봅시다.우리는 그것이 어떻게 작동하는지 보고, 그것의 요구를 이해하며, 그것을 어떻게 Heroku로 변환하는지 탐색할 것이다.

응용 프로그램 설계



이 프로그램은 간단한 Flask 전단으로 Postgres 데이터베이스에서 배우 목록을 추출하여 사이트에 표시합니다.보시다시피 모니터링, 기록, 서비스, 정상적인 운행 시간을 제공하는 인프라 시설은 응용 프로그램 자체보다 더 많은 구성 요소를 구성한다.
Kubernetes에 응용 프로그램을 배치하기 위해서는 선결 조건의 기초 구조 구성 요소, 응용 프로그램 자체의 몇 개의 YAML과 데이터베이스의 Helm 그림이 필요합니다.
  • GitLab CI/CD
  • Ambassador Edge Stack
  • LinkerD Service Mesh
  • FluentD Log Collector
  • Elasticsearch Document Database
  • Certificate Generation
  • Ingress Definition
  • Exposed Ports & Application Deployment
  • PostgreSQL Helm Customizations
  • And finally the application itself
  • 응용 프로그램을 사용할 수 있도록 필요한 절차가 많다.Heroku의 유사한 필수 조건을 살펴보자.

    PaaS 공급업체가 기술 결정을 내렸기 때문에 공급업체의 결정과 의견을 준수해야 합니다.그러나 보답으로 당신은 상자를 열면 바로 사용할 수 있는 긴밀하게 통합된 서비스 제품을 얻을 수 있습니다.서비스 격자와 로그 내보내기를 연구하고 실현하는 데 몇 주가 걸렸는데, 지금은 몇 분과 몇 개의 명령만 있으면 된다.
    Heroku에 동일한 응용 프로그램을 배치하려면 시작 the database the application.
    이제 이 프로그램을 Kubernetes에서 Heroku로 전환하는 방법을 살펴보겠습니다.우리는 네 가지 절차를 볼 것이다.
  • 인프라 구축
  • 애플리케이션 변환
  • 애플리케이션 배포
  • 애플리케이션 업데이트
  • 1. 인프라 시설 건설


    우리는 Kubernetes의 많은 구성 요소를 보았습니다. 이것은 제품의 조작성을 확보하는 데 필요한 것입니다. 모든 구성 요소는 설치 안내서와 건의가 있지만, 패턴은 보통 매우 비슷합니다.
  • 제어 바이너리 파일을 다운로드합니다.
  • kubectl이 적당한 집단에 도달할 수 있음을 검증한다.
  • "kubectl apply-fhttps://dependency/spec.yaml"또는 바이너리 파일로 자원을 만듭니다.
  • 배치가 적당한 안전 상하문에서 완성되고 예상대로 실행되는지 검증한다.
  • Heroku의 요구는 훨씬 간단하다. 계정을 만들고 다운로드 heroku cli, and you're done! . 기억해라. PaaS의 큰 장점 중 하나는 검증과 설치 (이 모든 절차는 당신이 Kubernetes를 사용해야 하는 것) 가 이미 당신을 위해 완성되었다는 것이다.
    이러한 절차는 TLS와 데이터 관리, 확장성, 관찰성, 중복성 등 두 가지 환경의 응용 프로그램에 핵심 인프라 서비스를 제공합니다.

    2. 애플리케이션 변환


    현재, 우리는 모든 환경이 우리의 예시 응용 프로그램을 어떻게 찾는지 결정했고, 우리는 응용 프로그램을 어떻게 조정하여 새로운 PaaS 홈페이지에서 작업해야 하는지 볼 수 있다.많은 구성 요소들이 우리의 이름으로 이루어지기 때문에 응용 프로그램을 배치하기 전에 필요한 전환을 해야 한다.
    이 절차는 응용 프로그램을 용기로 배치하고, stdout에서 응용 프로그램 로그를 보고, 실행할 때 용기에 원격 로그인하고, 인프라 시설에서 응용 프로그램의 매개 변수를 사용자 정의할 수 있도록 합니다.
    우선 Dockerfile을 변경해야 합니다.초기화할 때 응용 프로그램을 정의하는 Kubernetes Dockerfile의 경우 기본적으로 원하는 대로 설계할 수 있습니다.
        FROM python:3
        WORKDIR /usr/src/app
        COPY requirements.txt ./
        RUN pip install --no-cache-dir -r requirements.txt
        RUN touch /tmp/healthy && echo "healthy" >> /tmp/healthy && cat /tmp/healthy
        ENV FLASK_ENV=development
        ENV FLASK_APP=myapp.py
        COPY myapp.py .
        CMD [ "flask", "run", "--host=0.0.0.0" ]
    
    이미지는 간단합니다. 유지보수의 기본 이미지를 사용하고 작업 디렉터리를 설정하고python 수요를 추가하며 기본 환경 변수를 설정하고 응용 프로그램 코드를 추가한 다음 서버를 시작합니다.
    다음 단계에서 이 Dockerfile을 사용하여 응용 프로그램을 구축하여 Docker 등록표로 전송하고 Kubernetes가 로컬 서버로 이미지를 끌어다 응용 프로그램을 시작하도록 합니다.
    Heroku에서, 우리는Python에 특정한 기본 이미지를 사용하기를 원하기 때문에, Heroku의 용기 관리 인터페이스에 몇 개의 패키지를 추가해야 합니다.새 Dockerfile은 다음과 같습니다.
        FROM python:3
        WORKDIR /usr/src/app
        COPY requirements.txt ./
        RUN pip install --no-cache-dir -r requirements.txt
        RUN apt-get update && \
            apt-get install -y \
            curl \
            openssh-server
        ADD ./.profile.d /app/.profile.d
        RUN rm /bin/sh && ln -s /bin/bash /bin/sh
        RUN echo "healthy" >> /tmp/healthy && \
            cat /tmp/healthy
        ENV FLASK_ENV=development
        ENV FLASK_APP=myapp.py
        COPY myapp.py .
        CMD python3 myapp.py
    
    여기에서 우리는 이전과 같은 이미지를 정의했지만 약간의 조정이 있었다.
  • 우선,curl과 ssh를 이미지에 추가하는 새로운 aptget 시리즈가 설치되어 있습니다.ssh 환경을 정의하기 위해 스크립트 (heroku exec.sh) 를 추가했습니다.
  • [ -z "$SSH_CLIENT" ] && source <(curl --fail --retry 3 -sSL "$HEROKU_EXEC_URL")
    
  • 그리고/bin/bash를/bin/sh에 연결하여 기본 셸을 명시해야 합니다.

  • 다음은 myapp에서flask가 실행될 때 파라미터를 지정해서 이미지 실례화 방식을 변경해야 합니다.py 파일은 Heroku가 정의한 환경 변수를 사용하여 프로그램이 배치된 후에 데이터를 얻을 수 있도록 합니다.
    if __name__ == "__main__":
        port = int(os.getenv("PORT", 5000))
        app.run(debug=True, host='0.0.0.0', port=port)
    
    
  • 마지막 고려 요소는 데이터베이스다.Kubernetes가 있으면 대체할 수 있는 호스트 용량 clustered or replicated databases을 이용하여 손상이나 노드 고장을 방지할 수 있습니다.우리는 반드시 Helm chart를 사용하여 처음부터 데이터베이스 구조를 설계하거나 우리의 데이터베이스를 위해 외부 위탁 관리 솔루션을 사용해야 한다.
    그러나 위탁 관리 서비스를 사용할 때 이것은 필수적인 것이 아니다.Heroku를 사용하면 대시보드를 통해 위탁 관리 데이터베이스를 추가할 수 있습니다.복제와 복구 능력은 공급업체가 관리해야 할 문제가 된다.
    (이 두 가지 데이터베이스 구현에서 복제와 복구 능력은 테스트를 거친 백업을 대체할 수 없습니다. 항상 핵심 데이터를 백업하고 검증합니다.)
    이렇게 하면 우리는 응용 프로그램 용기 이미지와 데이터베이스를 배치할 수 있다.

    3, 응용 프로그램 실행


    만약에 우리가 핵심 인프라 시설을 설치하고 집단을 위해 데이터베이스를 설정하며 서비스 계정과 관련된 적당한 역할 기반 접근 제어(RBAC) 설정을 설치한다면 우리는 현재 응용 프로그램 배치에 전념할 수 있다.
    예제에서는 명시적 CI/CD 파이프를 정의하지 않았습니다.따라서 Kubernetes에 응용 프로그램을 수동으로 배치하려면 kubectl 바이너리 파일을 사용하여 다음과 같은 작업을 수행해야 합니다.
    docker login
    docker build -t myorg/myapp:0.0.1 -t myorg/myapp:latest . 
    docker push myorg/myapp:0.0.1; docker push myorg/myapp:latest
    kubectl apply -f ./spec/
    
    보시다시피 핵심 인프라를 배치하고 YAML을 검증하면 수동으로 코드를 Kubernetes 집단으로 스크롤하는 것이 어렵지 않습니다.
    Heroku의 배치 방안을 보면 사용자 정의 바이너리 파일이 있고 그들의 API와 상호작용을 할 수 있습니다.
    heroku login
    heroku container:login
    heroku container:push web -a myapp
    heroku container:release web -a myapp
    
    여기에서 우리는 Heroku가 응용 프로그램에 대한 표시와 배치를 신뢰합니다. 비록 이것은 어느 정도 수동 발표와 같이 엄격하지만.
    마찬가지로 공평한 것은 두 플랫폼에 내장된 배치와 발표 파이프가 이 모든 업무를 완전히 혼동할 수 있다는 것이다.그러나 이것도 반드시 어떤 환경에서도 설계, 건조, 유지보수를 해야 한다.
    현재, 우리는 이미 이 두 가지 환경에서 응용 프로그램을 배치하는 절차를 정의했다.

    4. 애플리케이션 업데이트


    기존 응용 프로그램을 Kubernetes에 배포할 때 응용 프로그램이 아닌 다른 명령을 사용합니다.
    docker build -t myorg/myapp:0.0.2 -t myorg/myapp:latest . 
    kubectl rollout deployment/myapp -n myapp --record --image=myapp:0.0.2
    
    Heroku에 대해 우리는 같은 과정을 다시 따르기만 하면 된다.
    heroku container:push web -a myapp
    heroku container:release web -a myapp
    
    이 마지막 단계에서, 우리는 응용 프로그램을 환경에 교체하여 배치하는 과정이 있다.

    결론


    셰익스피어는 "어떤 이름이든 장미 한 송이는 맡아도 똑같이 달콤하다."라고 썼다.이와 유사하게 우리 응용 프로그램의 작업 원리는 모든 용기화 환경(Capulet 또는 Montague)에서의 작업 원리와 같다. 왜냐하면 응용 프로그램 자체가 아니라 그 주변 환경을 따라야 하기 때문이다.
    그 밖에 복잡하고 고도로 맞춤형 Kubernetes 환경에서 간단한 응용 프로그램을 실행하는 데 무엇이 필요한지, 그리고 우리의 위탁 관리 인프라 공급업체 Heroku에서 같은 등급의 기능을 얻는 데 무엇이 필요한지 연구했다.마지막으로 둘 다 배치와 운행이 쉽지만 Heroku는 입문의 선결 조건에 있어 그렇게 밀집되어 있지 않다.

    좋은 웹페이지 즐겨찾기