直接转向与舵图最佳实践

Kubernetes这是一款用于容器应用程序的流行编排工具,它的名字来源于希腊语中的“领航员”,也就是掌舵的人。但在任何旅程中,导航员的成功取决于可用的地图。
应用程序的舵图表就是那个映射,一个文件的集合,可以从舵图库描述了一组相关的K8s资源。2022世界杯阿根廷预选赛赛程以最有效的方式制作您的Helm图表将帮助Kubernetes在将容器部署到您的生产环境时通过浅滩机动。
但也有其他方法可以随大流,就像我在开发公开可用的K8s图表来部署产品时发现的那样。hth华体会最新官方网站对于每一个pull请求,来自Helm社区的反馈都帮助我找到了Helm图表的最佳实践,这些最佳实践为操作和更新容器提供了最强的结果。
了解更多:10头盔教程开始你的Kubernetes之旅
下面是在编写社区或客户在生产中使用的K8s图表时需要考虑的一些事情。你需要考虑的事情有:
- 需要定义哪些依赖关系?
- 您的应用程序是否需要持久状态才能操作?
- 您将如何通过秘密和权限来处理安全性?
- 你将如何控制运行的kubelet容器?
- 如何确保应用程序正在运行并能够接收调用?
- 您将如何向外界公开应用程序的服务?
- 你将如何测试你的星盘?
本指南提供了一些构建和指定Helm图表的最佳实践,将帮助K8s将容器应用程序顺利交付到码头。
头盔是为每个人:获得一个免费指南盔
开始
在开始之前,请确保您熟悉的基本程序制作赫尔姆海图.
在本指南中,我们将创建一个Helm图表,遵循我们推荐的部署两层的最佳实践创建、读取、更新和删除(应用程序为Mongo数据库使用Express.js。
您可以在中找到示例应用程序的源代码GitHub中的express-crud.
创建并填充Helm图表
让我们使用helm客户端创建我们的模板helm图表创建命令:
$ helm create express-crud
对象的目录结构express-crud执掌图表。
中更新图表元数据Chart.yaml刚刚创建的文件。确保添加正确的信息appVersion(用作docker image标签的应用程序版本),描述,版本(一个SemVer 2版本字符串),来源,维护人员而且图标.
apiVersion: v1 appVersion: "1.0.0" description: A Helm chart for express-crud应用程序名称:express-crud版本:0.1.0来源:- https://github.com/jainishshah17/express-mongo-crud维护者:-名称:myaccount email: myacount@mycompany.com图标:https://github.com/mycompany17/mycompany.com/blob/master/app/public/images/logo.jpg home: https://mycompany.com/
定义依赖关系
如果你的申请依赖关系,则必须创建一个requirements.yaml文件在Helm图表的目录结构中指定它们。因为我们的应用程序需要mongodb数据库时,必须在依赖关系名单requirements.yaml创建的文件。
一个requirements.yaml本例中包含:
依赖项:—name: mongodb version: 3.0.4 repository: https://kubernetes-charts.storage.googleapis.com/ condition: mongodb.enabled
一次requirements.yaml文件创建完成后,必须运行依赖项更新命令在Helm客户端:
$ helm dep update
创建部署文件
Helm图的部署文件驻留在\模板子目录,并指定K8s将如何部署容器应用程序。
在开发部署文件时,需要做出一些关键的决定。
部署对象vs statfulset对象
您创建的部署文件将取决于应用程序是需要k8将其作为部署对象管理还是作为部署对象管理StatefulSet对象.
部署对象是在文件名中声明的无状态应用程序deployment.yaml并指定种类参数,部署.
有状态对象适用于有状态且与分布式系统一起使用的应用程序。它们在文件名中声明stateless.yaml和物种种类参数,有状态.
| 部署 | StatefulSet |
| 部署意味着无状态使用,并且相当轻量级。 | 当必须持久化状态时使用statefulset。因此它使用volumeClaimTemplates在持久卷上,以确保它们可以在组件重新启动时保持状态。 |
| 如果您的应用程序是无状态的,或者在启动时可以从后端系统构建状态,那么请使用部署。 | 如果您的应用程序是有状态的,或者您想在Kubernetes之上部署有状态存储,请使用StatefulSet。 |
由于这个应用程序不需要状态持久化,我使用部署对象。
的deployment.yaml文件已由执掌创建命令。
我们将使用AppVersion作为应用程序的Docker图像标记。这允许我们升级Helm图表与新版本的应用程序,只需改变值Chart.yaml
image: "{{. values .image. "存储库}}:{{默认的。chart。AppVersion .Values.image。标签}}”
Secret与ConfigMap
您需要确定存储哪一个凭据或配置数据是合适的秘密,并且可以在一个ConfigMap.
机密是指诸如密码之类的敏感信息,K8s将以加密格式存储这些信息。
ConfigMap是一个包含配置信息的文件,可以由应用程序共享。ConfigMap中的信息没有加密,因此不应该包含任何敏感信息。
| 秘密 | ConfigMap |
| 将这些信息保密比将它们逐字逐句地放在pod定义或docker映像中更安全、更灵活; | ConfigMap允许您将配置工件与映像内容解耦,以保持容器化应用程序的可移植性 |
| 用于机密数据 | 用于非机密数据 |
| 例如:API密钥、密码、令牌和ssh密钥 | 示例:日志旋转器,无机密数据配置 |
在本例中,我们将允许Helm从private中提取docker映像码头工人注册使用图像提取秘密。
此过程依赖于Kubernetes集群可用的秘密,该秘密为存储库管理器指定登录凭据。这个秘密可以由kubectl命令行如:
$ kubectl create secret docker-registry regsecret——docker-server=$DOCKER_REGISTRY_RUL——docker-username=$USERNAME——docker-password=$PASSWORD——docker-email=$EMAIL
在values.yaml你的Helm chart文件,然后你可以传递秘密的名字到一个值:
imagePullSecrets: regsecret
然后,您可以使用secret允许Helm通过这些行访问docker注册表deployment.yaml:
{{- if . values。imagePullSecrets}} imagePullSecrets: - name: {{. values。imagePullSecrets}} {{- end}}
对于应用程序可用的秘密,您应该将该信息直接添加到values.yaml.
例如,要配置我们的应用程序以使用预先创建的用户和数据库访问mongodb,请将该信息添加到values.yaml
mongodb: enabled: true mongodb brootpassword: mongodb busername: admin mongodb password: mongodb database: test
注意,这里我们没有在Helm图中硬编码默认凭证。相反,当没有通过-set flag或提供密码时,我们使用逻辑随机生成密码values.yaml
我们将使用一个secret将mongodb凭据传递给我们的应用程序,通过这些行deployment.yaml.
env:—name: DATABASE_PASSWORD valueFrom: secretKeyRef: name: {{. release。Name}}-mongodb key: mongodb-password
| InitContainers | 容器生命周期挂钩 |
| InitContainers是在应用程序容器之前运行的专用容器,可以包含应用程序映像中不存在的实用程序或安装脚本。 | 容器可以使用容器生命周期钩子框架来运行在其管理生命周期中由事件触发的代码。 |
| Pod可以有一个或多个Init容器,这些容器在应用程序容器启动之前运行。 | 一个豆荚只能有一个PostStart或PreStop钩 |
| PostStart钩子在容器创建后立即执行。但是,不能保证钩子会在容器ENTRYPOINT之前执行。没有参数传递给处理程序。 例如,移动使用ConfigMap/Secrets挂载的文件到不同的位置。 |
|
| PreStop钩子在容器终止之前立即被调用。它是阻塞的,这意味着它是同步的,所以它必须在删除容器的调用被发送之前完成。 优雅地关闭应用程序 |
|
| 你可以使用initContainers如果要添加,则在继续之前等待检查依赖的微服务是否正常。 | 你可以使用PostStart在同一个pod中挂钩到更新的文件,例如更新配置文件服务IP |
在我们的例子中,添加这些initContainers规范来deployments.yaml在数据库启动并运行之前,保持应用程序的启动。
initContainers:—name: wait-for-db image: "{{. values . xml "initContainerImage}}"命令:- 'sh' - '-c' - > until nc -z -w 2 {{. release。Name}}-mongodb 27017 && echo mongodb ok;做睡眠2;完成
增加准备和活动探测
添加准备就绪和活动探测来检查应用程序的持续运行状况通常是个好主意。如果您不这样做,那么应用程序可能会以某种方式失败,即它看起来正在运行,但不响应调用或查询。
这些线条deployment.yaml文件将添加这些探测来执行定期检查:
livingessprobe: httpGet: path: '/health' port: http initialDelaySeconds: 60 periodSeconds: 10 failureThreshold: 10 readinessProbe: httpGet: path: '/health' port: http initialDelaySeconds: 60 periodSeconds: 10 failureThreshold: 10
添加RBAC支持
这些程序将添加基于角色的访问控制当应用程序需要时,支持我们的图表。
步骤1:创建一个的作用添加如下内容role.yaml文件:
角色只能用于授予对单个名称空间内资源的访问权限。2022世界杯阿根廷预选赛赛程
{{- if . values .rbac. if。创建}}apiVersion: rbac.authorization.k8s。io/v1 kind:角色元数据:labels: app: {{template "express-crud.name"。{} chart: {{template "express-crud. {}图”。}} heritage: {{. release。Service}} release: {{. release。名称}}name: {{ template "express-crud.fullname" . }} rules: {{ toYaml .Values.rbac.role.rules }} {{- end }}
第二步:创建RoleBinding由添加如下内容rolebinding.yaml文件:
ClusterRole可以用来授予与Role相同的权限,但因为它们是集群范围的,所以它们也可以用来授予以下权限:
- 集群范围的资源(如节点)2022世界杯阿根廷预选赛赛程
- 非资源端点(如“/healthz”)
- 跨所有名称空间的名称空2022世界杯阿根廷预选赛赛程间资源(如pods)
{{- if . values .rbac. if。创建}}apiVersion: rbac.authorization.k8s。io/v1 kind: RoleBinding metadata: labels: app: {{template "express-crud.name"。{} chart: {{template "express-crud. {}图”。}} heritage: {{. release。Service}} release: {{. release。名称}}name: {{ template "express-crud.fullname" . }} subjects: - kind: ServiceAccount name: {{ template "express-crud.serviceAccountName" . }} roleRef: kind: Role apiGroup: rbac.authorization.k8s.io name: {{ template "express-crud.fullname" . }} {{- end }}
步骤3:创建一个ServiceAccount通过添加如下内容serviceaccount.yaml文件:
服务帐户为在Pod中运行的进程提供标识。
{{- if . values . serviceaccount。create}} apiVersion: v1 kind: ServiceAccount metadata: labels: app: {{template "express-crud.name"。{} chart: {{template "express-crud. {}图”。}} heritage: {{. release。Service}} release: {{. release。名称}}name: {{ template "express-crud.serviceAccountName" . }} {{- end }}
步骤4:使用helper模板设置ServiceAccount名称。
我们将通过添加以下内容来做到这一点_helpers.tpl文件
{{/*创建服务帐户的名称,使用*/}}{{- define "express-crud. xml "。serviceAccountName" -}} {{- if . values . serviceaccount . if . value . serviceaccount . if " -Create -}} {{default(包含“express-crud. conf”)fullname”。) .Values.serviceAccount.name }} {{- else -}} {{ default "default" .Values.serviceAccount.name }} {{- end -}} {{- end -}}
添加服务
现在是时候向世界公开我们的应用程序了通过服务.
服务允许应用程序通过IP地址接收流量。可以以不同的方式公开服务类型:
| ClusterIP | 该服务只能由集群内的内部IP访问。 |
| NodePort | 该服务可以从集群外部通过NodeIP和NodePort访问。 |
| loadbalance | 可以通过外部负载均衡器从集群外部访问该服务。可以入口对应用程序.. |
我们将通过将以下内容添加到service.yaml:
apiVersion: v1 kind:服务元数据:name: {{template "express-crud. xml。fullname”。}}标签:app:{{模板"express- crude .name"。{} chart: {{template "express-crud. {}图”。}} release: {{. release。名称}}heritage: {{ .Release.Service }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.externalPort }} targetPort: http protocol: TCP name: http selector: app: {{ template "express-crud.name" . }} release: {{ .Release.Name }}
注意,在以上,为我们服务类型我们在values.yam李:
service: type: LoadBalancer internalPort: 3000 externalPort: 80
值。yaml的总结
类中定义许多设置values.yaml文件是一个很好的实践,以帮助保持你的Helm图表可维护。
这就是values.yaml出现了我们示例的文件,显示了我们为上面讨论的许多特性定义的各种设置:
# express-mon -crud的默认值。这是一个yaml格式的文件。#声明要传递到模板中的变量##基于角色的访问控制## Ref: https://kubernetes.io/docs/admin/authorization/rbac/ rbac: create: true Role: ##要创建的规则。它遵循角色规范规则:—apiGroups:—resources:—services - endpoints - pod2022世界杯阿根廷预选赛赛程s verbs:—get - watch - list ## ServiceAccount ## Ref: https://kubernetes.io/docs/admin/service-accounts-admin/ ## serviceAccount: create: true ##要使用的serviceAccount的名称。# #如果没有设置并创建是真的,一个名称生成使用fullname模板名称:# # mongodb配置值依赖# #裁判:https://github.com/kubernetes/charts/blob/master/stable/mongodb/README.md # # mongodb:启用:真正的形象:标签:3.6.3 pullPolicy: IfNotPresent持久性:尺寸:50 gi #资源:#请求:#记忆:“十二gi”# cpu:“200”#限制:#记忆:“十二gi”# cpu:“2”# #确保——wiredTigerCacheSizeGB没有超过一半的内存限制!2022世界杯阿根廷预选赛赛程##这对于保护Kubernetes的OOMKill是至关重要的!mongodb bextraflags: - "——wiredTigerCacheSizeGB=1" mongodb brootpassword: mongodb busername: admin mongodbPassword: mongodbDatabase: test # lifenessprobe: # initialDelaySeconds: 60 # periodSeconds: 10 # readinessProbe: # initialDelaySeconds: 30 # periodSeconds: 30 ingress: enabled: false annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes. log =1"Io /tls-acme: "true"路径:/ hosts。local tls: [] # - secretName: chart-example-tls # hosts: # - chart-example。local initContainerImage: "alpine:3.6" imagePullSecrets: replicaCount: 1 image: repository: jainishshah17/express- mono -crud # tag: 1.0.1 pullPolicy: IfNotPresent service: type: LoadBalancer internalPort: 3000 externalPort: 802022世界杯阿根廷预选赛赛程 resources:{} #我们通常建议不指定默认资源,并将其作为用户的自觉选择。 This also increases chances charts run on environments with little # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. # limits: # cpu: 100m # memory: 128Mi # requests: # cpu: 100m # memory: 128Mi nodeSelector: {} tolerations: [] affinity: {}
测试和安装舵图
测试我们的Helm图表是非常重要的,我们将使用执掌线头命令。
$ helm lint ./ ## Output ==> Linting ./ lint OK 1张图被检测,没有故障
使用舵安装命令使用helm chart在Kubernetes上部署我们的应用程序。
$ helm install——name test1 ./ ##输出名称:test1 LAST DEPLOYED: Sat Sep 15 09:36:23 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES:2022世界杯阿根廷预选赛赛程==> v1beta1/ Service NAME DESIRED CURRENT - up - AVAILABLE AGE test1-mongodb 1 1 10 0s ==> v1beta2/Deployment test1- expressage 1 1 10 0s ==> v1/Secret NAME TYPE DATA AGE test1-mongodb Opaque 2 0s ==> v1/PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test1-mongodb Pending standard 0s ==> v1/ServiceAccount NAME SECRETS AGE test1- expresscrud 1 0s ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE test1-mongodb ClusterIP 10.19.248.205 27017/TCP 0stest1-express-crud LoadBalancer 10.19.254.169 80:31994/TCP 0s ==> v1/Role NAME AGE test1-express-crud 0s ==> v1/RoleBinding NAME AGE test1-express-crud 0s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE test1-mongodb-67b6697449-tppk5 0/1 Pending 0 0s test1-express-crud-dfdbd55dc-rdk2c 0/1 Init:0/1 0 0s NOTES: 1. Get the application URL by running these commands: NOTE: It may take a few minutes for the LoadBalancer IP to be available. You can watch the status of by running 'kubectl get svc -w test1-express-crud' export SERVICE_IP=$(kubectl get svc --namespace default test1-express-crud -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo https://$SERVICE_IP:80
运行上面的helm install命令将为负载均衡器生成一个External_IP。您可以使用此IP地址运行应用程序。
这是我们的应用程序运行时的样子:

结束
正如你从这个例子中看到的,Helm是一个非常多功能的系统,允许你在如何构建和开发图表方面有很大的灵活性。以与Helm社区的约定相匹配的方式进行操作将有助于简化提交Helm图表供公众使用的过程,并使其在更新应用程序时更容易维护。
这个示例项目的完整Helm图表可以在express-crud你可以查看这些功能文件,以帮助你更彻底地理解它们是如何工作的。
要探索更多示例,您可以查看我的示例存储库舵图表将产品部署到Kubernethth华体会最新官方网站es。
额外的资源:2022世界杯阿根廷预选赛赛程
