Skaffold를 통해 Kubernetes의 Spring Boot 응용 프로그램에 CI/CD 워크플로우를 제공합니다.

본 문서에서 Spring Boot 응용 프로그램에 로컬 CI/CD 작업 흐름을 만들고 Skaffold를 사용하여 Kubernetes에 배치합니다.
Kubernetes를 사용하여 프로그램을 개발하는 것은 매우 번거로운 것으로 알려져 있다.개발자들이 자신들에게 가장 중요한 일, 즉 코드 작성에 전념할 수 있도록 이를 둘러싼 생태계가 왜 있는가.이 글에서 나는 Google 개발한 또 다른 도구인 스카프폴드를 소개할 것이다.

그럼 스카포드는 도대체 뭐야?


Skaffold handles the workflow for building, pushing and deploying your application.


그것은 어떤 문제를 해결하려고 시도합니까?


앞서 말한 바와 같이 Kubernetes를 사용하여 응용 프로그램을 개발하는 것은 쉬운 일이 아니다. 이것이 바로 Skaffold가 역할을 발휘하는 부분이다. 왜냐하면 Kubernetes에서 실행되는 응용 프로그램의 개발과 배치를 간소화했기 때문이다.로컬 또는 원격 Kubernetes 클러스터에서 응용 프로그램을 개발하고 배포할 때 즉시 피드백을 받을 수 있도록 전체 워크플로우를 관리합니다.

다음은 Skaffold를 사용하면 얻을 수 있는 몇 가지 이점입니다.
  • 경량화
  • 그것은 단지 클라이언트 실용 프로그램이기 때문에 집단 설정이나 유지보수가 필요한 것이 없다.
  • 간편한 공유
  • 당신의 팀원들 사이에서 공유하는 것은 매우 쉽다. 왜냐하면 당신은 아래의 일을 하기만 하면 시작할 수 있기 때문이다.
    git clone
    skaffold run
    
  • 개발 용이성
  • 응용 프로그램을 용기화하려면 로컬에서도 많은 일을 해야 한다.로컬 개발에 있어서, 응용 프로그램을 구축하고, 추진하고, Kubernetes에 응용 프로그램을 배치하는 등 몇 가지 일을 할 수 있습니다.작업 흐름의 단계별 도구와 다른 명령 (docker blah,kubectl blah 등) 이 있습니다.스카포드가 있으면 마법 지령skaffold run or skaffold dev이 하나밖에 없어요. 당신은 금색이에요.이것은 Kubernetes에서 프로그램을 구축하고 배치해야 하는 도구에 의존할 필요가 없다는 것을 의미하지 않습니다.명령 하나만 실행하면 개발이 훨씬 쉽다.
    그래.이론이 충분하니 우리 시작합시다.

    Spring Boot 어플리케이션 분석


    이 자습서에서는/states REST endpoint를 통해 액세스할 때 인도의 각 주와 수도를 표시하는 Spring Boot 응용 프로그램을 사용합니다.응용 프로그램은 응용 프로그램의 시작 부분에 행을 삽입하고 메모리에 저장하는 H2 데이터베이스를 사용합니다.소스 코드를 사용할 수 있습니다here.

    선결 조건


    이 프레젠테이션의 경우 다음을 설치해야 합니다.
  • 설치Skaffold
  • 용 Docker Desktop 설치
  • 설치Mac
  • Minikube(옵션)
  • 나는 맥OS를 사용한 적이 있지만, 너는 네가 좋아하거나 사용 경험이 있는 어떤 첫 번째 운영체제를 자유롭게 사용할 수 있다.Minikube 설치는 선택할 수 있다고 말씀드렸습니다. Docker desktop을 설치했다면 다음 절차를 통해 Kubernetes를 사용할 수 있습니다.

    쿠베트 Docker Desktop for Mac을 사용하여 Kubernetes 활성화

  • Docker 메뉴 모음의 기본 설정으로 이동한 다음 Kubernetes 탭을 클릭합니다.이 콤보 상자를 누르면 Kubernetes를 사용하고 기본 컴파일러를 Kubernetes로 전환합니다.Kubernetes를 사용하려면 시간이 좀 걸립니다.

    Kubernetes 사용
  • 이 활성화되면 Docker 메뉴 표시줄에 다음과 같은 내용이 표시됩니다.컨텍스트를 docker desktop으로 변경해야 합니다.

    Kubernetes 달리기

  • docker desktop으로 컨텍스트 설정
    스카포드부터.
  • skaffold init 명령 사용
  • 우선, 당신은 skaffold.yaml 서류가 필요합니다.이를 위해, 우리는 아래의 명령을 실행할 수 있다.
    skaffold init
    
    그러나 다음과 같은 오류 메시지가 표시됩니다.
    skaffold init
    one or more valid builder configuration (Dockerfile or Jib configuration) must be present to build images with skaffold; please provide at least one build config and try again or run `skaffold init --skip-build`</span>
    
    이 오류는 Skaffold가 프로젝트에서 Dockerfile이나 Jib 설정을 찾고 있기 때문에 명백한 것 같습니다.
    Skaffold는 현재 다음 빌더를 지원합니다.

  • Docker(띠--XXenableJibInit기)
  • Jib(띠--XXenableBuildpacksInit기)
  • 그래서 이 오류를 해결하기 위해서, 나는pom에 Jib maven 플러그인을 추가할 것이다.xml 파일.만약 당신이 Jib와 그 용법이 무엇인지 알고 싶다면, 당신은 나의 이전 문장 Buildpacks 을 읽을 수 있습니다.다음을 pom에 복사/붙여넣으면 Jib 지원을 사용할 수 있습니다.xml 파일.
    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>jib-maven-plugin</artifactId>
       <version>2.7.0</version>
       <configuration>
          <from>
             <image>gcr.io/distroless/java:11</image>
          </from>
          <to>
             <image>registry.hub.docker.com/hiashish/indian-states</image>
          </to>
       </configuration>
    </plugin></span>
    
    공식 데이터article에 따르면.

    skaffold init also recognizes Maven and Gradle projects, and will auto-suggest the [jib](https://skaffold.dev/docs/pipeline-stages/builders/#/local#jib-maven-and-gradle) builder. Currently jib artifact detection is disabled by default, but can be enabled using the flag --XXenableJibInit.


    현재 skaffold init--XXenableJibInit. 실행되고 있지만, 다시 실패하고 다음 오류가 발생합니다.
    skaffold init --XXenableJibInit
    one or more valid Kubernetes manifests are required to run skaffold</span>
    
    Kubernetes 목록 (배치,pod, 서비스 등) 을 만들지 않았고, Skaffold에 알려진 documentation 이 있기 때문에, 이 오류를 해결하기 위해서는 아래kubectl 명령을 사용하여 수동으로 만들어야 합니다.
    배포 작성
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        app: states
      name: states
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: states
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: states
        spec:
          containers:
            - image: docker.io/hiashish/indian-states
              name: indian-states
              resources: {}
    status: {}
    
    서비스 작성
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: null
      labels:
        app: states
      name: states
    spec:
      ports:
        - port: 8080
          protocol: TCP
          targetPort: 8080
      selector:
        app: states
      type: NodePort
    status:
      loadBalancer: {}
    
    우리는 현재 이미 배치와 서비스를 창설했다.위 명령의 출력을 k8s 디렉토리의 YAML 파일로 복사해야 합니다.
    현재 실행skaffold init --XXenableJibInit
    apiVersion: skaffold/v2beta10
    kind: Config
    metadata:
      name: indian-states
    build:
      artifacts:
      - image: docker.io/hiashish/indian-states
        jib:
          project: com.example:indian-states
    deploy:
      kubectl:
        manifests:
        - k8s/mydeployment.yaml
        - k8s/myservice.yaml</span><span id="feb6" class="dw ir is fi kg b dg li lj lk ll lm ki s kj">Do you want to write this configuration to skaffold.yaml? [y/n]: y
    Configuration skaffold.yaml was written
    You can now run [skaffold build] to build the artifacts
    or [skaffold run] to build and deploy
    or [skaffold dev] to enter development mode, with auto-redeploy
    
    마지막으로 skaffold.yaml 파일을 만듭니다.
  • skafold dev 명령 사용
  • 현재, 우리는 Kubernetes 프로그램을 시작하는 지속적인 구축과 배치에 필요한 설정을 완성했습니다.이제 아래 명령을 실행하여 CI/CD 워크플로우를 로컬에서 시작할 수 있습니다.
    skaffold dev
    Listing files to watch...
     - docker.io/hiashish/indian-states
    Generating tags...
     - docker.io/hiashish/indian-states -> docker.io/hiashish/indian-states:31ff588-dirty
    Checking cache...
     - docker.io/hiashish/indian-states: Found Locally
    Tags used in deployment:
     - docker.io/hiashish/indian-states -> docker.io/hiashish/indian-states:43f7c470a60b876c7579ed3041b64024b774e9808851ad83b6817701d0188cc5
    Starting deploy...
     - deployment.apps/states created
     - service/states created
    Waiting for deployments to stabilize...
     - deployment/states is ready.
    Deployments stabilized in 2.710870355s
    Press Ctrl+C to exit
    Watching for changes...
    [indian-states] 
    [indian-states]   .   ____          _            __ _ _
    [indian-states]  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    [indian-states] ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    [indian-states]  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
    [indian-states]   '  |____| .__|_| |_|_| |_\__, | / / / /
    [indian-states]  =========|_|==============|___/=/_/_/_/
    [indian-states]  :: Spring Boot ::                (v2.4.0)
    [indian-states] 
    [indian-states] 2020-12-07 17:43:54.919  INFO 1 --- [           main] c.e.i.IndianStatesApplication            : Starting IndianStatesApplication using Java 11.0.6 on states-6f5bb746b6-9sglw with PID 1 (/app/classes started by root in /)
    [indian-states] 2020-12-07 17:43:54.938  INFO 1 --- [           main] c.e.i.IndianStatesApplication            : No active profile set, falling back to default profiles: default
    [indian-states] 2020-12-07 17:43:57.607  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JDBC repositories in DEFAULT mode.
    [indian-states] 2020-12-07 17:43:57.670  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 35 ms. Found 0 JDBC repository interfaces.
    [indian-states] 2020-12-07 17:44:00.130  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
    [indian-states] 2020-12-07 17:44:00.189  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    [indian-states] 2020-12-07 17:44:00.196  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.39]
    [indian-states] 2020-12-07 17:44:00.387  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    [indian-states] 2020-12-07 17:44:00.388  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5249 ms
    [indian-states] 2020-12-07 17:44:01.673  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
    [indian-states] 2020-12-07 17:44:02.375  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
    [indian-states] 2020-12-07 17:44:03.216  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
    [indian-states] 2020-12-07 17:44:04.050  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
    [indian-states] 2020-12-07 17:44:04.095  INFO 1 --- [           main] c.e.i.IndianStatesApplication            : Started IndianStatesApplication in 10.782 seconds (JVM running for 12.991)
    
    보시다시피, 프로그램은 로컬 Kubernetes 그룹에 구축되어 배치되었습니다.우선 로컬에서 프로그램에 접근할 수 있도록kubectl 명령을 사용하여 프로그램을 검사해야 합니다.
    kubectl get all 
    NAME                          READY   STATUS    RESTARTS   AGE
    pod/states-7c55b8d5b6-vx5hq   1/1     Running   0          5m47s
    
    NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          21h
    service/states       NodePort    10.110.135.236   <none>        8080:30925/TCP   5m47s
    
    NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/states   1/1     1            1           5m48s
    
    NAME                                DESIRED   CURRENT   READY   AGE
    replicaset.apps/states-7c55b8d5b6   1         1         1       5m48s
    
    NodePort 우리에게 분배된 신청은 30925입니다.응용 프로그램의/states/REST 끝점을 호출해서 무슨 일이 일어날지 봅시다.
    curl localhost:30925/states
    [{"name":"Andra Pradesh","capital":"Hyderabad"},{"name":"Arunachal Pradesh","capital":"Itangar"},{"name":"Assam","capital":"Dispur"},{"name":"Bihar","capital":"Patna"},{"name":"Chhattisgarh","capital":"Raipur"},{"name":"Goa","capital":"Panaji"},{"name":"Gujarat","capital":"Gandhinagar"},{"name":"Haryana","capital":"Chandigarh"},{"name":"Himachal Pradesh","capital":"Shimla"},{"name":"Jharkhand","capital":"Ranchi"},{"name":"Karnataka","capital":"Bangalore"},{"name":"Kerala","capital":"Thiruvananthapuram"},{"name":"Madhya Pradesh","capital":"Bhopal"},{"name":"Maharashtra","capital":"Mumbai"},{"name":"Manipur","capital":"Imphal"},{"name":"Meghalaya","capital":"Shillong"},{"name":"Mizoram","capital":"Aizawi"},{"name":"Nagaland","capital":"Kohima"},{"name":"Orissa","capital":"Bhubaneshwar"},{"name":"Rajasthan","capital":"Jaipur"},{"name":"Sikkim","capital":"Gangtok"},{"name":"Tamil Nadu","capital":"Chennai"},{"name":"Telangana","capital":"Hyderabad"},{"name":"Tripura","capital":"Agartala"},{"name":"Uttaranchal","capital":"Dehradun"},{"name":"Uttar Pradesh","capital":"Lucknow"},{"name":"West Bengal","capital":"Kolkata"},{"name":"Punjab","capital":"Chandigarh"}]
    
    이거 보기 좋다!!!
    Skaffold가 전체 작업 흐름을 다시 촉발할 수 있는지 작은 코드 변경을 해 봅시다.나는 NodePort를 1에서 2로 바꾸고 YAML 파일을 배치해서 Skafold가 추가된 replicas를 사용하여 프로그램을 재배치할 수 있는지 확인할 것이다.
    애플리케이션 재배치
    Tags used in deployment:
     - docker.io/hiashish/indian-states -> docker.io/hiashish/indian-states:43f7c470a60b876c7579ed3041b64024b774e9808851ad83b6817701d0188cc5
    Starting deploy...
     - deployment.apps/states configured
    Waiting for deployments to stabilize...
     - deployment/states is ready.
    Deployments stabilized in 4.109550864s
    Watching for changes...
    [indian-states] 
    [indian-states]   .   ____          _            __ _ _
    [indian-states]  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    [indian-states] ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    [indian-states]  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
    [indian-states]   '  |____| .__|_| |_|_| |_\__, | / / / /
    [indian-states]  =========|_|==============|___/=/_/_/_/
    [indian-states]  :: Spring Boot ::                (v2.4.0)
    [indian-states]
    
    현재 kubectl을 사용하여 프로그램을 다시 검사합니다. replicas
    kubectl get all
    AME                          READY   STATUS    RESTARTS   AGE
    pod/states-7c55b8d5b6-br9zx   1/1     Running   0          20s
    pod/states-7c55b8d5b6-vx5hq   1/1     Running   0          16m
    
    NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          21h
    service/states       NodePort    10.110.135.236   <none>        8080:30925/TCP   16m
    
    NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/states   2/2     2            2           16m
    
    NAME                                DESIRED   CURRENT   READY   AGE
    replicaset.apps/states-7c55b8d5b6   2         2         2       16m
    
    
    보시다시피 재배치 후 복제 복사본의 수가 예상한 2개로 증가했습니다.
  • skafold run 명령 사용
  • 이것은 replicaset와 유사하지만 skaffold dev에서 기술한 작업 흐름은 한 번만 실행된다는 것이 주요 차이점이다.프로덕션 워크플로우에 사용하는 것이 좋습니다.

    문제. 클라우드 셸 사용


    로컬에 필요한 의존항 (docker,minikube,skaffold) 을 모두 설치했다면, 설치 부분을 건너뛸 수 있습니다. 전제 부분에서 말했듯이 구글 클라우드 를 사용하여 로컬 Kubernetes 환경을 복사할 수 있습니다.Cloud Shell은 브라우저 기반 터미널/CLI 및 편집기를 제공하며 Skafold, Minikube, Docker가 사전 설치되어 있으며 무료입니다.
    다음 명령만 실행하면 됩니다.Cloud Shell 환경에서 docker 및 minikube가 시작되고 실행되었는지 확인합니다.skaffold.yaml git clone https://github.com/yrashish/indian-states다음은 클라우드 쉘의 캡처입니다.
    Shell

    위에서 보듯이 Spring Boot 응용 프로그램을 Cloud Shell로 실행하고 예상한 출력을 얻을 수도 있습니다.

    빠른 프레젠테이션


    결론


    본문에서, 나는 방금 Skaffold가 제공하는 몇 가지 기능을 소개했다.디버깅을 위한 포트 전송, 운행 상황 검사, 템플릿 배치 설정 등 다양한 기능도 연구할 만하다. Kubernetes 프로그램을 지속적으로 배치하는 데 Skaffold가 사용되는 것도 고려할 만하다.

    나를 지지하다


    만약 네가 방금 읽은 물건을 좋아한다면, 너는 나에게 커피 한 잔을 사줄 수 있다

    한층 더 읽다
    너도 나의 이전 문장을 읽을 수 있다.

    좋은 웹페이지 즐겨찾기