日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Helm优化Kubernetes下的研发体验:基础设施即代码

發布時間:2024/4/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Helm优化Kubernetes下的研发体验:基础设施即代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
容器即進程,Kubernetes則解決了如何部署和運行應用的問題。對于任何一個部署在Kubernetes的應用而言,通常都可以由幾個固定的部分組成:Ingress、Service、Deployment等。直接使用Kubernetes原生的YAML定義服務,雖然能一定程度上簡化應用的部署,但是對于大部分研發人員來說編寫和使用YAML依然是一件相對痛苦的事情。Helm應運而生,Helm作為Kubernetes下的包管理工具,對原生服務定義過程進行了增強,通過模板化,參數化的形式大大簡化用戶部署Kubernetes應用的復雜度。

本文中,筆者將以一個Spring Boot程序為例,介紹如何在軟件研發端到端過程中是使用Helm。本文中所使用的示例代碼可以通過GitHub下載。

創建應用程序

項目采用Maven作為項目的編譯和構建工具,項目目錄結構如下:


├── README.md ├── chart │ ├── Chart.yaml # Chart基本信息 │ ├── charts # 依賴 │ ├── templates # Kubernetes模板 │ │ ├── NOTES.txt │ │ ├── _helpers.tpl │ │ ├── deployment.yaml │ │ ├── ingress.yaml │ │ └── service.yaml │ └── values.yaml # 變量 ├── Dockerfile # Dockerfile定義 ├── entrypoint.sh # 容器的entrypoint.sh文件 ├── mvnw ├── mvnw.cmd ├── pom.xml ├── src # 應用源碼 │ └── main │ └── java │ └── hello │ ├── Application.java │ └── HelloController.java
該項目SCM中通過基礎實施即代碼的方式,我們定義了應用的3大要素:應用源碼,應用是如何構建的(Dockerfile)以及應用是如何部署的(Chart)。

構建容器鏡像

容器相關內容:
├── Dockerfile # Dockerfile定義 ├── entrypoint.sh # 容器的entrypoint.sh文件
為了簡化容器鏡像構建過程,在Dockerfile中我們采用了Multi-Stage Builds的方式構建鏡像,Dockerfile的具體內容如下:
# Build FROM maven:3.5.0-jdk-8-alpine AS builderADD ./pom.xml pom.xml ADD ./src src/ RUN mvn clean package# Package FROM java:8COPY --from=builder target/gs-spring-boot-0.1.0.jar gs-spring-boot.jar RUN bash -c 'touch /gs-spring-boot.jar'ADD entrypoint.sh entrypoint.sh RUN chmod +x entrypoint.sh ENTRYPOINT ["./entrypoint.sh"]
在第一個階段中,我們將pom.xml以及源碼加載到一個Maven基礎鏡像中,并命名為builder,通過mvn clean package命令實現Java源碼的編譯打包,產生的jar包會保存到容器的targets目錄下。

在第二個階段中,我們在java:8基礎鏡像的基礎上直接從builder容器中拷貝jar文件,到當前容器中。為了能夠在容器中運行該jar文件,這里我們定義了一個entrypoint.sh作為容器的啟動命令,其內容如下:
#!/usr/bin/env bash ACTIVE_PROFILE=${PROFILE:=default} java -Xmx1024m -Djava.security.egd=file:/dev/./urandom -jar gs-spring-boot.jar --spring.profiles.active=${ACTIVE_PROFILE} $@
這里需要注意的是在命令的最后我們添加了一個$@,該語法可以獲取命令命令行中的所有參數,這樣在后期運行容器時,可以在命令行中使用參數,覆蓋應用的默認配置,例如--spring.profiles.active=prod

運行以下命令,編譯并打包應用:
$ docker build -t yunlzheng/spring-app . # 修改為自己的鏡像倉庫 Sending build context to Docker daemon 16.38MB Step 1/10 : FROM maven:3.5.0-jdk-8-alpine AS builder ---> 67d11473f554 ...... Successfully built e332622092ce Successfully tagged yunlzheng/spring-app:latest
上傳鏡像到鏡像倉庫中(需要實現注冊容器鏡像服務)。
docker push yunlzheng/spring-app # 修改為自己的鏡像倉庫

構建Chart

通過容器鏡像我們為服務定義了一個隔離的運行時環境,而為了能夠讓我們的應用程序能夠運行到Kubernetes集群當中,我們還需要定義Helm相關的內容,來標準化容器的編排和部署信息:
├── chart │ ├── Chart.yaml # Chart基本信息 │ ├── charts # 依賴 │ ├── templates # Kubernetes模板 │ │ ├── NOTES.txt │ │ ├── _helpers.tpl │ │ ├── deployment.yaml │ │ ├── ingress.yaml │ │ └── service.yaml │ └── values.yaml # 變量
在以上結構中我們定義了該應用是如何在Kubernetes集群中運行的。在初始化應用時,用戶可以通過使用Helm命令生成以上內容:
$ helm create chart Creating chart
Chart我們可以理解為一組Kubernetes manifest文件的模板,Chart.yaml中包含了該Chart的基本信息,如名稱,版本等:
apiVersion: v1 appVersion: "1.0" description: A Spring Boot Application name: chart version: 0.1.0
在values.yaml中,我們定義了當前模板中所有的變量,如下所示:
replicaCount: 1image: repository: yunlzheng/spring-app #修改為自己的鏡像 tag: latest pullPolicy: IfNotPresentservice: type: ClusterIP port: 8080 #容器映射的端口ingress: enabled: true # 打開集群ingress annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" path: / hosts: - spring-example.local tls: []
templates目錄下,則是Kubernetes用戶熟悉的如deployment.yaml,service.yaml。當然你也可以根據自己的需求添加更多的模板文件。

以deployment.yaml為例,文件內容如下所示:
# deployment.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: name: {{ template "chart.fullname" . }} labels: app: {{ template "chart.name" . }} chart: {{ template "chart.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels:app: {{ template "chart.name" . }}release: {{ .Release.Name }} template: metadata:labels:app: {{ template "chart.name" . }}release: {{ .Release.Name }} spec:containers:- name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"imagePullPolicy: {{ .Values.image.pullPolicy }}ports:- name: httpcontainerPort: 8080protocol: TCP
在文件中使用了values.yaml中定義的相關變量,如Values.replicaCount,Values.image.repository,Values.image.tag等,使用這些變量的好處是,在部署Chart的時候,我們可以在命令行中動態修改這些變量的值,例如,修改鏡像部署的版本等, service.yaml中的內容也是類似的,這里就不做描述。

完成以上內容后,我們就可以將當前應用打包成一個Chart文件,首先我們需要驗證一下Chart文件的內容:
$ cd chart $ helm lint ==> Linting . [INFO] Chart.yaml: icon is recommended1 chart(s) linted, no failures
在確認Chart格式沒有問題之后,開發人員就可以直接通過Helm部署實例到Kubernetes集群:
$ cd chart $ helm install . # 省略其它輸出 ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE womping-sparrow-spring-app ClusterIP 172.19.11.41 <none> 8080/TCP 1sNOTES: 1. Get the application URL by running these commands: http://spring-example.local/
開發人員訪問,并驗證應用是否按照預期運行:

發布Chart

在確認應用能夠正常運行之后,我們就可以對Chart進行打包和發布了。對于運維和測試人員,而言,他們只需要直接使用特定版本的應用Chart,并對其進行測試或者是部署:
$ cd .. $ helm package chart Successfully packaged chart and saved it to: /Users/yunlong/workspace/project-samples/containerization-spring-with-helm/chart-0.1.0.tgz
在默認情況下,helm package命令會使用Charts.yaml中文件定義的版本。 而如果在持續集成工具中,如果我們希望每次都能動態生成一個新版本的Chart,那在打包時,可以通過--version,動態修改,從而確保每次持續集成過程都能產生一個新的版本,并且能夠對該版本進行獨立驗證。
$ helm package chart --version 0.0.2 Successfully packaged chart and saved it to: /workspace/tmp/spring-sample/chart-0.0.2.tgz
萬事具備,當然現在還沒有任何人能夠使用你構建的Chart,為了能夠讓其他人(測試、運維、or anyone)能夠使用Chart,我們需要將Chart發布到一個公共的倉庫(Repository)當中。

Helm官方提供了一個名叫Chartmusem的開源項目,支持對接AWS S3,Google Storage,Alibaba OSS等存儲服務,用戶可通過其API上傳Chart,并且自動生成倉庫索引文件,有精力的同學可以自行研究。

這里我們直接使用阿里云效提供的Helm倉庫服務,用戶只需要注冊賬號,并開通私有倉庫服務,即可免費創建自己私有的,無容量限制的Helm倉庫。

由于通過阿里云效創建的Helm倉庫是私有的,因此在添加倉庫時需要通過參數--username=kHKvnX--password=WsCH7zuHH2指定用戶名和密碼:
helm repo add play-helm https://repomanage.rdc.aliyun.com/helm_repositories/26125-play-helm --username=kHKvnX --password=WsCH7zuHH2
為了更好的Chart發布體驗,Helm官方為Chartmusem提供了一個Helm Push的插件,云效Helm倉庫服務對該插件進行了完整兼容,因此用戶可以直接使用該插件完成Chart的發布:

安裝Helm Push插件:
$ helm plugin install https://github.com/chartmuseum/helm-push Downloading and installing helm-push v0.7.1 ... https://github.com/chartmuseum/helm-push/releases/download/v0.7.1/helm-push_0.7.1_darwin_amd64.tar.gz Installed plugin: push
由于已經將Helm倉庫添加到了本地,我們可以直接使用以下命令將Chart發布到倉庫中:
$ helm push chart-0.1.0.tgz play-helm Pushing chart-0.1.0.tgz to play-helm... Done.
發布完成后重新更新本地倉庫索引:
$ helm update ...Successfully got an update from the "play-helm" chart repository ...Successfully got an update from the "stable" chart repository Update Complete. ? Happy Helming!?
搜索play-helm倉庫并部署的Chart:
$ helm search play-helm NAME CHART VERSION APP VERSION DESCRIPTION play-helm/chart 0.1.0 1.0 A Spring Boot Application$ helm install play-helm/chart

其它的小技巧

在發布鏡像的時候指定版本:
$ helm push chart-0.1.0.tgz play-helm --version=0.2.0 Pushing chart-0.2.0.tgz to play-helm... Done.
直接發布Chart目錄:
$ helm push chart play-helm --version=0.3.0 Pushing chart-0.1.0.tgz to play-helm... Done.
在不添加Helm倉庫的情況下直接發布Chart:
$ helm push chart https://repomanage.rdc.aliyun.com/helm_repositories/26125-play-helm --username=kHKvnX --password=WsCH7zuHH2 Pushing chart-0.1.0.tgz to https://repomanage.rdc.aliyun.com/helm_repositories/26125-play-helm... Done.

小結

到目前為止,我們展示了如何在軟件研發的端到端過程中使用Helm,通過基礎設施即代碼的模式,開發人員可以直接在源碼中通過Chart定義管理應用的部署架構,在完成開發工作后開發人員只需要將Chart發布到Helm倉庫中,接下來無論是測試,還是運維都可以直接使用Chart快速在Kubernetes集群中對應用進行測試與發布。

本文轉自DockOne-使用Helm優化Kubernetes下的研發體驗:基礎設施即代碼

總結

以上是生活随笔為你收集整理的使用Helm优化Kubernetes下的研发体验:基础设施即代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人依依网 | 国产艳情片 | 午夜一区| 国产精选久久 | 草的我好爽 | 91极品尤物| 亚洲精品一区二区三区四区五区 | 男女性高潮免费网站 | 亚洲视频天天射 | www.四虎.| 日韩av网页| 污视频在线观看网站 | 激情亚洲网 | 法国空姐在线观看免费 | 亚洲欧美国产一区二区三区 | av黄色网址 | 中国av免费看 | 国产一区二区三区乱码 | 日本女优黄色 | 欧美亚洲第一页 | brazzers欧美一区二区 | 国模一区二区 | 国产精品16p | 97在线免费视频观看 | 久久久久久久无码 | 无遮挡黄色 | 男人日女人在线观看 | 韩国三级hd两男一女 | 国产你懂的 | 欧美黄色免费在线观看 | av涩涩| 91精品国产自产精品男人的天堂 | 亚洲啊啊啊啊啊 | 特黄特色大片免费播放器使用方法 | 亚洲淫视频 | 亚洲第一成人av | 57pao国产成永久免费视频 | 91麻豆视频 | 午夜精品一二三区 | 黄色大片一级片 | 色就是色亚洲色图 | 美女黄色真播 | 日本男女啪啪 | 96国产在线 | 一起艹在线观看 | 悠悠av| 超碰超在线 | 久久爱一区 | 91口爆一区二区三区在线 | 午夜成人鲁丝片午夜精品 | 成人深夜在线 | 91资源站 | 成人在线日韩 | 午夜影院h| 久久看看 | 色婷婷综合久久久久中文一区二区 | 无码人妻丰满熟妇啪啪欧美 | 国产第一页在线观看 | 国产日韩欧美成人 | 秋霞国产午夜精品免费视频 | 91欧美激情一区二区三区成人 | 中文字幕少妇在线三级hd | 成人毛片18女人毛片 | 亚洲第一天堂在线观看 | 久久精品视频6 | 好吊色视频一区二区三区 | 国产精品一区二区三区免费 | 久久久久久久久久成人 | 免费观看在线高清 | 麻豆av影院 | 最新国产三级 | 四川丰满妇女毛片四川话 | 六月丁香在线视频 | 日批视频免费观看 | 开心激情亚洲 | 免费看黄色aaaaaa 片 | 国产精品久久久 | 欧美日韩国产一区二区在线观看 | 黄色成人在线免费观看 | 在线手机av| 欧美自拍第一页 | 91蝌蚪视频在线 | 熟妇人妻系列aⅴ无码专区友真希 | 国产高清免费观看 | 97人妻精品一区二区三区免费 | 国产毛片精品国产一区二区三区 | 中文在线天堂网 | 天天夜夜人人 | 91偷拍富婆spa盗摄在线 | 免费se99se | 国产精品宾馆在线 | av网站在线观看免费 | 欧美变态口味重另类在线视频 | 国产片黄色| 五月情婷婷 | 好好热视频 | 在线免费观看一区 | 国产精品一区二区三区久久 | 国产在线观看免费网站 |