웹 응용 프로그램에서 Docker 이미지, Kubernetes 배포


Java 애플리케이션에서 Kubernetes로 배포


이 강좌에서는 Java 웹 응용 프로그램에서 시작하여 이 응용 프로그램을 포함하는 Docker 이미지를 만들고 로컬 Kubernetes 그룹에 배치합니다.이 안내서는 웹 응용 프로그램을 컴파일하는 것부터 Kubernetes에서 실행하는 데 필요한 모든 절차를 보여 줍니다.비록 많은 우수한 소스 오픈 도구가 이 모든 절차를 실행할 수 있지만, 우리는 명령줄에서 모든 절차를 수동으로 실행할 것이다.

Kubernetes는 집단에 용기화 응용 프로그램을 배치하는 시스템이다.이것은 웹 응용 프로그램을 만드는 것과 서버에서 실행하는 웹 응용 프로그램을 분리할 수 있도록 합니다.Kubernetes 클러스터에서 실행되는 엔티티는 일반적으로 Docker 이미지와 같은 컨테이너 응용 프로그램입니다.
이 강좌에서는 dockerkubectl (Kubernetes) 명령행 도구를 사용합니다.이 두 도구 모두 Docker desktop tools 를 통해 설치할 수 있습니다.이 강좌의 일부로서, Docker 도구를 설치합니다. 이 방식을 통해 이 강좌에서 말한 것과 같은 명령을 기계에서 실행할 수 있습니다.이 강좌가 끝날 때, Kubernetes 그룹에 웹 응용 프로그램을 설치할 것입니다.😊

운영 체제에서 웹 응용 프로그램 실행


우리가 사용할 웹 응용 프로그램은 Java Spring Boot 웹 응용 프로그램입니다.간단하게 보기 위해서, 우리는 공식 스프링 부트 강좌 중의 간단한 existing application 를 사용할 것이다.이 웹 응용 프로그램은 REST 서비스로 HTTP GET 노드를 공개합니다.
이 절의 선결 조건으로 Git, JDK, (Java 8 또는 업데이트 버전) 및 Maven 이 필요합니다.먼저 Java 항목을 다운로드한 다음 Maven을 사용하여 컴파일합니다.
$ git clone https://github.com/spring-guides/gs-rest-service.git
$ cd gs-rest-service\complete
$ mvn clean package
$ cp target/rest-service-0.0.1-SNAPSHOT.jar ../..
$ cd ../..
세 번째 명령은 Java 응용 프로그램을 컴파일하고 웹 응용 프로그램을 JAR 파일에 패키지화합니다.target 폴더에서 JAR 파일을 찾습니다.
다음은 java 명령을 사용하여 웹 응용 프로그램을 실행할 수 있습니다.
$ java -jar rest-service-0.0.1-SNAPSHOT.jar
터미널에서 많은 줄을 볼 수 있습니다. 스프링 응용 프로그램의 상하문이 초기화되었습니다. 응용 프로그램은 8080 포트에서 공개됩니다.
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.2.RELEASE)

2020-03-26 20:56:13.857  INFO 18504 --- [           main] c.e.restservice.RestServiceApplication   : Starting RestServiceApplication v0.0.1-SNAPSHOT on Philipp-PC with PID 18504 [...]
[...]
2020-03-26 20:56:17.477  INFO 18504 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-03-26 20:56:17.481  INFO 18504 --- [           main] c.e.restservice.RestServiceApplication   : Started RestServiceApplication in 4.834 seconds (JVM running for 5.736)
GET 방법을 사용하여 REST 서비스를 호출하여 웹 응용 프로그램이 제대로 작동하는지 확인할 수 있습니다.가장 좋아하는 웹 브라우저에서 URL로 이동합니다: http://localhost:8080/greeting.다음과 같은 메시지가 표시됩니다.
{"id":1,"content":"Hello, World!"}

Docker images 소개


Docker 데스크톱 도구가 설치되어 있는지 확인합니다.모든 설치 지침here을 찾을 수 있습니다.
Docker는 PaaS(플랫폼 즉 서비스) 범주에 속하며 소스를 시작합니다.간단히 말하면 Docker는 컨테이너에서 응용 프로그램을 실행합니다(예를 들어 우리의 웹 응용 프로그램).용기는 하나의 운영체제, 실행할 응용 프로그램과 모든 의존항을 포함하는 외부 세계와 격리된다.Docker 워크플로우는 다음과 같습니다.
  • 기본 이미지부터 시작하여 JDK 또는 Python 같은 운영 체제와 가장 자주 사용하는 의존 항목을 포함합니다.
  • 기본 이미지에 응용 프로그램을 추가합니다.기본 이미지에 속하지 않는 모든 의존 항목을 추가합니다.
  • 출력은 응용 프로그램을 포함하는 사용자 정의 이미지입니다.
  • 이미지에서 응용 프로그램을 실행합니다.
  • Docker 애플리케이션 구축 및 실행


    Docker 이미지는 계층화됩니다. 각 이미지는 더 많은 엔티티를 추가하여 다른 이미지에 기반합니다.이미지 생성 프로세스를 투명하게 하기 위해 Docker 파일을 사용했습니다.이 Docker 파일에는 Docker 이미지를 만드는 방법에 대한 모든 정보가 들어 있습니다.다음과 같은 내용으로 Dockerfile라는 파일을 만듭니다.
    FROM openjdk:8-jre-alpine
    COPY rest-service-0.0.1-SNAPSHOT.jar /my-app.jar
    CMD java -jar /my-app.jar
    
    첫 번째 줄에는 Java 8 런타임 환경이 포함된 기본 이미지가 지정되어 있습니다.다음 줄에서 웹 응용 프로그램을 이미지로 복사합니다.마지막 줄에서 그림이 Docker 용기로 실행될 때 어떻게 되는지 설명합니다. 웹 응용 프로그램이 실행됩니다.
    이제 Docker 파일을 사용하여 자체 이미지를 만듭니다.
    $ docker build -t my-app:0.0.1 .
    
    다음 명령을 사용하여 알려진 모든 Docker 이미지를 나열할 수 있습니다.
    $ docker images
    REPOSITORY  TAG           IMAGE ID      CREATED         SIZE
    my-app      0.0.1         32b488088806  25 minutes ago  103MB
    openjdk     8-jre-alpine  f7a292bbb70c  10 minutes ago  84.9MB 
    
    위의 명령은 my-app 이라는 사용자 정의 이미지를 표시해야 합니다.이제 Docker 이미지를 실행할 예정입니다.Kubernetes를 사용하지 않고 docker 명령을 사용하여 이미지를 실행합니다.
    $ docker run -p 8080:8080 -d my-app:0.0.1
    c5a91de6d0d6ffe692434548ff2ce6fdcc2c89fa02f7bc621c0c132ddfe2589a
    
    축하합니다. 방금 Docker 용기에서 웹 서비스를 시작했습니다.😊 URLhttp://localhost:8080/greeting로 이동하여 웹 응용 프로그램이 예상대로 실행되고 있는지 확인합니다.Docker는 Docker 이미지를 생성, 실행 및 모니터링하는 다양한 명령을 제공합니다.실행 중인 Docker 이미지를 나열하려면 다음을 입력하십시오.
    $ docker ps
    CONTAINER ID  IMAGE          COMMAND                  CREATED        STATUS         PORTS                    NAMES
    c5a91de6d0d6  my-app:0.0.1   "/bin/sh -c 'java -j…"   2 minutes ago  Up 21 seconds  0.0.0.0:8080->8080/tcp   funny_dhawan
    
    
    마지막으로 docker stop 를 입력하여 실행 중인 컨테이너를 중지할 수 있습니다.
    Docker 파일에 대한 자세한 내용은 공식 문서here를 참조하십시오.

    쿠베르니테스 소개


    Kubernetes는 클라우드 응용 프로그램을 배치, 감시, 확장하는 데 사용되는 시스템이다.그것은 최초로 구글이 개발한 것으로 기원된 것이다.Kubernetes는 컨테이너 어플리케이션을 실행합니다.
    Kubernetes에서 이미지의 단일 실행 실례를pod라고 하는데, RESTful 웹 서비스를 사용하면 보통 같은 프로그램의 여러 개의pod가 병행 실행됩니다.Kubernetes는 작업 부하가 심할 때 더 많은pod를 시작하거나 건강하지 않은pod를 검출할 수 있도록 계산 자원을pod에 쉽게 분배할 수 있습니다.
    Docker desktop tools 설치에는 로컬 Kubernetes 서버가 포함되어 있습니다.클라우드에 있는 것처럼 Kubernetes에 작업 부하를 로컬로 배치할 수 있지만, 테스트 목적으로만 사용할 수 있습니다.현실에서 Kubernetes를 사용하여 아마존 클라우드나 구글 클라우드 같은 진정한 클라우드 인프라에 응용 프로그램을 배치할 것입니다.

    Kubernetes 클러스터에서 애플리케이션 실행


    이 섹션에서는 Kubernetes를 사용하여 Docker 이미지를 배포합니다.더 구체적으로 말하면 kubectl 명령줄 도구와 Kubernetes 파일을 사용하여 프로그램을 실행할 것입니다.
    우선 Kubernetes가 활성 상태인지 확인하고 기계에서 실행해야 합니다(설명 참조here.
    둘째, 우리는 기중기를 발사하고 싶다.이를 위해, 우리는 통상적으로 사용한다Deployment files.Kubernetes는 필요한 크레인 가동을 확보하고 필요할 때 불건전한 크레인을 교체할 수도 있다.
    다음 배포 파일deployment.yml을 만듭니다.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app-deploy
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-app
            image: my-app:0.0.1
            ports:
            - containerPort: 8080
    
    배치 파일은 실행할 docker 이미지(containers: name, 시작할 Pod 수(replicas, 노출된 포트(containerPort를 지정합니다.또는 최대 CPU 및 메모리 사용량과 같은 리소스 제약을 추가할 수 있습니다.
    $ kubectl apply -f deployment.yml
    deployment.apps/my-app-deploy created
    
    $ kubectl get deployments
    NAME            READY   UP-TO-DATE   AVAILABLE   AGE
    my-app-deploy   1/1     1            1           1min
    
    $ kubectl describe deployment my-app-deploy
    
    첫 번째 줄에서 Kubernetes 배포를 만듭니다.그러면 관련 POD가 자동으로 시작되며kubectl get pods를 사용하여 확인할 수 있습니다.두 번째 줄은 모든 배치의 목록이고, 세 번째 줄은 우리가 배치한 모든 상세한 정보이다.우리의 배치는 하나의pod만 시작하는 것으로 설정되어 있습니다.이 구성을 두 개의 복제본으로 변경할 수 있습니다.
    $ kubectl scale --replicas=2 deployment/my-app-deploy
    deployment.extensions/my-app-deploy scaled
    
    $ kubectl describe deployments my-app-deploy
    
    너는 우리가 두 개의 달리기 선실이 있는데, 모두 사용 가능한 상태에 있다는 것을 볼 수 있다.
    현재, 우리의 웹 응용 프로그램은 집단적으로 실행되고 있지만, 이 웹 응용 프로그램에 직접 접근할 수 없습니다.POD의 IP 주소는 Kubernetes 클러스터에서만 액세스할 수 있습니다.현재의 문제는 우리가 어떻게 집단 밖에서 우리의 웹 응용 프로그램을 테스트합니까?우리의pod가 장차 교체될 수 있기 때문에 IP 주소가 바뀔 수 있다는 것을 고려할 때 이 문제는 더욱 까다롭다.좋은 소식은 Kubernetes가 Services라는 간단한 해결 방안을 제공했다는 것이다.
    Kubernetes Services는 하나의 IP 주소에 여러 POD를 공개하는 추상적인 방식입니다.파일service.yml을 통해 서비스를 만들 수 있습니다.
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service
    spec:
      ports:
        - port: 80
          targetPort: 8080
      selector:
        app: my-app
    
    $ kubectl create -f service.yml
    service/my-app-service created
    
    $ kubectl get services
    NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP   5d1h
    my-app-service   ClusterIP   10.104.130.56   <none>        80/TCP    24s
    
    Dellmy-app-service 서비스의 IP 주소는 여전히 클러스터 내에서만 액세스할 수 있습니다.우리는 포트 전송을 사용하여 이 문제를 해결할 수 있다.운영 준비 환경에서는 NodePort 또는 LoadBalancer 유형의 서비스와 같은 다른 솔루션을 사용할 수 있습니다.
    $ kubectl port-forward service/my-app-service 8081:80
    
    저희 웹 응용 프로그램은 현재 localhost의 URLhttp://localhost:8081/greeting을 통해 접근할 수 있습니다.축하합니다. Kubernetes 집단이 현재 웹 응용 프로그램을 위탁 관리하고 있습니다. 웹 브라우저에서 접근할 수 있습니다.😊
    서비스 및 팟캐스트를 종료하려면 다음을 입력합니다.
    $ kubectl delete deployment my-app-deploy
    deployment.extensions "my-app-deploy" deleted
    
    $ kubectl delete service my-app-service
    service "my-app-service" deleted
    

    총결산


    클라우드 배포 파이핑에서 가장 중요한 단계를 요약해 보겠습니다.
  • 웹 애플리케이션을 JAR로 패키지화
  • JAR 파일이 포함된 Docker 이미지 만들기
  • Kubernetes 구축
  • Kubernetes는 Docker 이미지가 포함된 크레인
  • 을 자동으로 시작합니다.
  • 모든 러닝 크레인의 입구점
  • 으로 Kubernetes 서비스를 만듭니다
    이 주제에 관심 가져주셔서 감사합니다!질문이나 건의가 있으면 댓글을 남겨주세요!

    좋은 웹페이지 즐겨찾기