4、自定义一个自己的chart模板

开发自己的Chart:我们已Java应用为例
完成这个chart,以后创建各种应用只需换应用镜像即可

创建模板

helm create javademo

修改Chart.yaml,Values.yaml,添加常用的变量

[root@master javademo]# cat values.yaml
replicaCount: 1

image:
  repository: 192.168.25.135/library/tomcat
  tag: latest
  pullPolicy: IfNotPresent

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  host: liaochao.com
  tls:
    secretName: liaochao.com

resources:
   limits:
     cpu: 100m
     memory: 128Mi
   requests:
     cpu: 100m
     memory: 128Mi

nodeSelector: {}

tolerations: []

affinity: {}

上面可以看到,values.yaml中定义了java的镜像、service的类型、ingress、资源限制等。

在templates目录下创建部署镜像所需要的yaml文件,并变量引用yaml里经常变动的字段

修改deployment.yaml

[root@master templates]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "name" . }}
  labels:
    {{- include "labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "selectorLabels" . | nindent 8 }}
    spec:
    {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
    {{- end }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /test/status.html
              port: 8080
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}

上述可以看到,标签引用来自公共模板_helpers.tpl,其他数据来自values.yaml,健康检测手动定义。

编辑service.yaml

[root@master templates]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "name" . }}
  labels:
    {{- include "labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    {{- include "selectorLabels" . | nindent 4 }}

上述可以看到,标签引用也来自公共模板_helpers.tpl,其他数据来自values.yaml

编辑ingress.yaml

[root@master templates]# cat ingress.yaml
{{- if .Values.ingress.enabled -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
  name: {{ include "name" . }}
  labels:
    {{- include "labels" . | nindent 4 }}
  {{- with .Values.ingress.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
{{- if .Values.ingress.tls }}
  tls:
    - hosts:
      - {{ .Values.ingress.host }}
      secretName: {{ .Values.ingress.tls.secretName }}
{{- end }}
  rules:
    - host: {{ .Values.ingress.host | quote }}
      http:
        paths:
          - path: /
            backend:
              serviceName: {{ include "name" . }}
              servicePort: {{ .Values.service.port }}
{{- end }}

上述可以看到,标签引用也来自公共模板_helpers.tpl,其他数据来自values.yaml

编辑公共模板:_helpers.tpl

[root@master templates]# cat _helpers.tpl
{{/*
资源名字
*/}}

{{- define "name" -}}
{{ .Chart.Name }}-{{ .Release.Name }}
{{- end -}}

{{/*
资源标签
*/}}

{{- define "labels" -}}
app: {{ template "name" . }}
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
{{- end -}}

{{/*
Pod标签
*/}}
{{- define "selectorLabels" -}}
app: {{ template "name" . }}
release: {{ .Release.Name }}
{{- end -}}

编辑文档说明:

[root@master templates]# cat NOTES.txt
访问地址:
{{- if .Values.ingress.enabled }}
  http{{ if .Values.ingress.tls }}s{{ end }}://{{ .Values.ingress.host }}
{{- end }}
{{- if contains "NodePort" .Values.service.type }}
  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "name" . }})
  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT
{{- end }}

最终结构:

[root@master helm]# tree javademo/
javademo/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   └── service.yaml
└── values.yaml

2 directories, 7 files

试运行查看:

[root@master helm]# helm install web02 --dry-run javademo
NAME: web02
LAST DEPLOYED: Sun Feb 23 14:11:35 2020
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: javademo/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: javademo-web02
  labels:
    app: javademo-web02
    chart: javademo-0.1.0
    release: web02
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: javademo-web02
    release: web02
---
# Source: javademo/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: javademo-web02
  labels:
    app: javademo-web02
    chart: javademo-0.1.0
    release: web02
spec:
  replicas: 1
  selector:
    matchLabels:
      app: javademo-web02
      release: web02
  template:
    metadata:
      labels:
        app: javademo-web02
        release: web02
    spec:
      containers:
        - name: javademo
          securityContext:
            {}
          image: "192.168.25.135/library/tomcat:latest"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /test/status.html
              port: 8080
          resources:
            limits:
              cpu: 100m
              memory: 128Mi
            requests:
              cpu: 100m
              memory: 128Mi
---
# Source: javademo/templates/ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: javademo-web02
  labels:
    app: javademo-web02
    chart: javademo-0.1.0
    release: web02
spec:
  tls:
    - hosts:
      - liaochao.com
      secretName: liaochao.com
  rules:
    - host: "liaochao.com"
      http:
        paths:
          - path: /
            backend:
              serviceName: javademo-web02
              servicePort: 80

NOTES:
访问地址:
  https://liaochao.com

这里可以看到,我们打开了ingress 开关,打开了资源限制,打开了https,得到了我们想要的。

运行:

helm install web01 --dry-run javademo

查看状态:

[root@master helm]# kubectl get pod
NAME                                      READY   STATUS               RESTARTS   AGE
javademo-web01-7f9bb95f8d-hfqh4           1/1     Running              2          14h

查看ingress:

[root@master helm]# kubectl get ingress
NAME             HOSTS          ADDRESS   PORTS     AGE
javademo-web01   liaochao.com             80, 443   15h

我们在自己的电脑上面加上hosts

192.168.25.136 liaochao.com

然后查看浏览器:

在这里插入图片描述
此时流程已经走完,如果我们想换应用,到时候只需要修改应用,其他的全都不需要变

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要自定义一个 Helm chart,您需要了解以下几个基本概念: 1. Chart:Helm package 的一个压缩包,包含了 Kubernetes 资源和相关的模板文件。 2. Template:Helm 使用 Go 的文本模板库来生成 Kubernetes YAML 文件。模板文件包含了一些变量和控制逻辑。 3. Values:一个 YAML 文件,包含了一些值,可以在模板文件中被引用。这个文件可以被命令行参数、环境变量或者外部文件覆盖。 下面是一个简单的自定义 Helm chart 的步骤: 1. 使用 Helm 命令创建一个新的 chart: ``` helm create mychart ``` 2. 在 `mychart/templates` 目录下创建模板文件,比如 `deployment.yaml` 和 `service.yaml`。 3. 在模板文件中使用 Helm 的模板语言来引用 values.yaml 中的变量,比如: ``` apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Values.appName }} ``` 4. 在 `values.yaml` 文件中定义变量值,比如: ``` appName: myapp replicaCount: 3 ``` 5. 在命令行中使用 `helm install` 命令来安装自定义chart: ``` helm install mychart --set replicaCount=5 ``` 这个命令会使用 `values.yaml` 中的默认值,但是覆盖了 `replicaCount` 变量的值。如果需要覆盖更多的变量,可以使用 `--set` 参数或者一个外部文件。 以上就是自定义 Helm chart 的基本步骤,您可以根据自己的需求来定义更多的模板文件和变量。 ### 回答2: Helm是一个开源的软件包管理器,用于简化在Kubernetes集群中部署和管理应用程序的过程。Helm Chart是Helm的一项重要功能,用于定义和组织Kubernetes应用程序的部署。 Helm Chart是一个基于YAML文件的模板,用于描述如何创建和管理Kubernetes资源,包括部署、服务、存储卷等。通过自定义Helm Chart,可以根据实际需求定制化部署,使得应用程序的配置和部署更加灵活和可重复。 自定义Helm Chart的过程通常包括以下几个步骤: 1. 创建Chart目录:通过命令行工具创建一个新的Chart目录,该目录将包含所有与Chart相关的文件和目录。 2. 编辑Chart配置文件:在Chart目录中编辑Chart.yaml文件,该文件包含了Chart的元数据信息,例如版本号、名称、描述等。 3. 编辑values文件:values.yaml文件用于定义Chart的默认配置和变量。可以通过编辑该文件来自定义Chart的配置选项。 4. 定义模板文件:在templates目录中编辑各个Kubernetes资源的模板文件,例如Deployment、Service等。可以使用Go模板语言来定义变量和控制结构,从而更加灵活地生成资源配置。 5. 打包和发布Chart:使用Helm将自定义Chart打包成一个可分发的tar.gz文件。可以使用Helm命令将Chart发布到本地或远程的Chart存储库中,从而方便其他人使用和分享。 6. 使用自定义Chart:其他用户可以使用helm install命令来安装和部署自定义Chart。通过指定不同的values文件,可以根据实际需求进行灵活的配置和部署。 总之,通过自定义Helm Chart,可以更方便地管理和部署Kubernetes应用程序,并且可以根据具体需求进行灵活的定制和配置。这样可以提高开发和运维效率,减少错误和重复工作。 ### 回答3: Helm是一个开源的Kubernetes包管理工具,可以帮助用户轻松地创建、发布和管理Kubernetes应用程序。在Helm中,Chart是一种用于定义和部署Kubernetes应用的包装格式。 Helm提供了一个默认的Chart模板,用户可以基于该模板创建自定义Chart。要创建一个自定义Chart,首先需要使用Helm命令行工具创建一个新的Chart目录结构。在这个目录下,可以添加自定义的Kubernetes资源文件,如Deployment、Service、ConfigMap等,来定义和配置应用程序的部署和运行环境。 在Chart目录中的"templates"文件夹下,可以使用Go模板语言创建各种资源的配置文件。用户可以通过编辑这些配置文件来自定义应用程序的各种属性,例如容器镜像、环境变量、资源限制等。 除了资源文件外,用户还可以在Chart目录中添加其他的配置文件,如values.yaml和requirements.yaml。values.yaml文件用于定义Chart的默认值和可配置参数,用户可以在部署时根据需要自定义这些值。requirements.yaml文件用于定义Chart的依赖关系,用户可以在部署时自动安装这些依赖。 创建完成自定义Chart后,可以使用Helm命令行工具进行打包、发布和安装。用户可以使用helm package命令将Chart打包成一个压缩文件,然后使用helm install命令将Chart安装到Kubernetes集群中。在安装过程中,用户可以通过指定不同的values文件来覆盖默认的配置值,从而实现个性化的定制。 总之,通过Helm自定义Chart,用户可以根据应用程序的需求和特定的配置要求,灵活地定制和管理Kubernetes应用程序的部署和管理过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值