Skaffold를 통해 Kubernetes의 Spring Boot 응용 프로그램에 CI/CD 워크플로우를 제공합니다.
Kubernetes를 사용하여 프로그램을 개발하는 것은 매우 번거로운 것으로 알려져 있다.개발자들이 자신들에게 가장 중요한 일, 즉 코드 작성에 전념할 수 있도록 이를 둘러싼 생태계가 왜 있는가.이 글에서 나는 Google 개발한 또 다른 도구인 스카프폴드를 소개할 것이다.
그럼 스카포드는 도대체 뭐야?
Skaffold handles the workflow for building, pushing and deploying your application.
그것은 어떤 문제를 해결하려고 시도합니까?
앞서 말한 바와 같이 Kubernetes를 사용하여 응용 프로그램을 개발하는 것은 쉬운 일이 아니다. 이것이 바로 Skaffold가 역할을 발휘하는 부분이다. 왜냐하면 Kubernetes에서 실행되는 응용 프로그램의 개발과 배치를 간소화했기 때문이다.로컬 또는 원격 Kubernetes 클러스터에서 응용 프로그램을 개발하고 배포할 때 즉시 피드백을 받을 수 있도록 전체 워크플로우를 관리합니다.
다음은 Skaffold를 사용하면 얻을 수 있는 몇 가지 이점입니다.
git clone
skaffold run
skaffold run or skaffold dev
이 하나밖에 없어요. 당신은 금색이에요.이것은 Kubernetes에서 프로그램을 구축하고 배치해야 하는 도구에 의존할 필요가 없다는 것을 의미하지 않습니다.명령 하나만 실행하면 개발이 훨씬 쉽다.그래.이론이 충분하니 우리 시작합시다.
Spring Boot 어플리케이션 분석
이 자습서에서는/states REST endpoint를 통해 액세스할 때 인도의 각 주와 수도를 표시하는 Spring Boot 응용 프로그램을 사용합니다.응용 프로그램은 응용 프로그램의 시작 부분에 행을 삽입하고 메모리에 저장하는 H2 데이터베이스를 사용합니다.소스 코드를 사용할 수 있습니다here.
선결 조건
이 프레젠테이션의 경우 다음을 설치해야 합니다.
쿠베트 Docker Desktop for Mac을 사용하여 Kubernetes 활성화
Kubernetes 사용
Kubernetes 달리기
docker desktop으로 컨텍스트 설정
스카포드부터.
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는 현재 다음 빌더를 지원합니다.
--XXenableJibInit
기)--XXenableBuildpacksInit
기)<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. Currentlyjib
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
파일을 만듭니다.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개로 증가했습니다.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가 사용되는 것도 고려할 만하다.
나를 지지하다
만약 네가 방금 읽은 물건을 좋아한다면, 너는 나에게 커피 한 잔을 사줄 수 있다
한층 더 읽다
너도 나의 이전 문장을 읽을 수 있다.
Reference
이 문제에 관하여(Skaffold를 통해 Kubernetes의 Spring Boot 응용 프로그램에 CI/CD 워크플로우를 제공합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/yrashish/create-ci-cd-workflow-for-a-springboot-application-deployed-to-kubernetes-using-skaffold-4b62텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)