Skip to content

Latest commit

 

History

History
290 lines (215 loc) · 9.97 KB

File metadata and controls

290 lines (215 loc) · 9.97 KB

03-制作chart

如何创建 Helm chart

使用 Helm CLI 生成 charts 目录。输入以下命令创建新 chart:

helm create phoenixnap

image

使用 ls 命令列出文件结构:

image

Helm chart 目录包含以下内容:

  • charts - 存储相关 charts 的目录
  • templates - 配置文件的目录
  • Chart.yaml - 包含 charts 元数据的文件
  • values.yaml - 包含默认参数值的文件

如何配置 Helm Chart

配置 Helm Chart 涉及自定义参数,例如镜像拉取策略名称覆盖服务帐户服务类型。请按照以下步骤了解如何在values.yaml文件中编辑这些参数。

配置镜像拉取策略

镜像拉取策略决定如何从注册表中拉取容器镜像。默认策略值为**IfNotPresent** ,这意味着 Kubernetes 仅当系统上尚不存在映像时才拉取该映像,下面我们尝试将策略改变为 Always:

  1. 打开value.yaml文件:
  2. 修改 image.pullPolicy 为 Always

image

image

chart 名称覆盖

要覆盖value.yaml文件中的chart名称,请将值添加到 nameOverride 和 fullnameOverride 字段。以下示例添加 phoenix-app 作为 nameOverride 值,并将phoenix-chartn 添加为 fullnameOverride

image

指定 service account名称

Helm chart 的 service account 名称是在运行集群时生成的。但是,最好手动设置它并确保应用程序直接与chart 中的受控用户关联。

image

更改网络服务类型

根据集群的不同,部署可能需要不同的网络服务类型。例如,使用Minikube进行测试时,推荐的网络服务类型为NodePort

要更改网络服务类型,请找到服务部分并更改类型字段中的值。下面的示例显示了设置为新服务类型的NodePort

image

如何在 Kubernetes 上部署新的 Helm Chart

配置values.yaml文件后,使用Helm命令部署应用程序。继续执行以下步骤来完成此操作。

第 1 步:安装 Helm Chart

helm install phoenix-chart phoenixnap/ --values phoenixnap/values.yaml

image

步骤2:导出节点端口和IP地址

export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services phoenix-chart)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")

步骤3:查看已部署的应用程序

echo http://$NODE_IP:$NODE_PORT 

image

输出显示已部署应用程序的完整地址,复制地址并将其粘贴到网络浏览器中。出现应用程序屏幕。

image

从头开始创建(选读)

templates

你也可以不仅仅只是修改,你可以重新创建这个样例

rm -rf templates/*

创建deployment.yaml文件并复制以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: release-name-nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-chart
          image: "nginx:1.16.0"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          volumeMounts:
            - name: nginx-index-file
              mountPath: /usr/share/nginx/html/
      volumes:
        - name: nginx-index-file
          configMap:
            name: index-html-configmap

如果您看到上面的 YAML 文件,则这些值是静态的。 Helm Chart 的想法是对 YAML 文件进行模板化,以便我们可以通过动态地为它们分配值来在多个环境中重用它们

要模板化一个值,您所需要做的就是在大括号内添加对象参数,如下所示。它称为模板指令,语法特定于Go 模板

image

首先,您需要弄清楚哪些值可以改变或者您想要模板化哪些值。我正在选择namereplicas 、容器名称、image、 imagePullPolicyconfigMap Name ,我在 YAML 文件中以粗体突出显示了这些名称。

  • name:{{ .Release.Name }}-nginx :我们每次都需要更改部署名称,因为 Helm 不允许我们安装同名的版本。因此,我们将使用版本名称模板化部署名称,并随之插入**-nginx** 。现在,如果我们使用名称frontend创建一个版本,则部署名称将为frontend-nginx 。这样,我们就能保证名称的唯一性。
  • container name :{{ .Chart.Name }} :对于容器名称,我们将使用 Chart 对象并使用Chart.yaml中的chart名称作为容器名称。
  • replicas : {{ .Values.replicaCount }}我们将从values.yaml文件中访问副本值。
  • image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" 在这里,我们在一行中使用多个模板指令,并从 Values 文件中访问图像键下的存储库和标签信息。
  • configmap name: {{ .Release.Name }}-index-html-configmap. 这里我们将发布名称添加到配置映射中。

这是应用模板后的最终**deployment.yaml**文件。模板化部分以粗体突出显示。将部署文件内容替换为以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-nginx
  labels:
    app: nginx
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          volumeMounts:
            - name: nginx-index-file
              mountPath: /usr/share/nginx/html/
      volumes:
        - name: nginx-index-file
          configMap:
            name: {{ .Release.Name }}-index-html-configmap
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-service
spec:
  selector:
    app.kubernetes.io/instance: {{ .Release.Name }}
  type: {{ .Values.service.type }}
  ports:
    - protocol: {{ .Values.service.protocol | default "TCP" }}
      port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.targetPort }}

协议模板指令中,您可以看到一个竖线( | ) 。它用于定义协议的默认值为TCP。这意味着,如果我们不在**values.yaml**文件中定义协议值或者它为空,它将采用TCP作为协议的默认值。

创建**configmap.yaml**并向其中添加以下内容。在这里,我们将默认的 Nginx index.html页面替换为自定义 HTML 页面。此外,我们添加了一个模板指令来替换 HTML 中的环境名称。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-index-html-configmap
  namespace: default
data:
  index.html: |
    <html>
    <h1>Welcome</h1>
    </br>
    <h1>Hi! I got deployed in {{ .Values.env.name }} Environment using Helm Chart </h1>
    </html

values

values.yaml文件包含我们在模板中使用的模板指令中需要替换的所有值。现在,将默认的**values.yaml**内容替换为以下内容。

replicaCount: 2

image:
  repository: nginx
  tag: "1.16.0"
  pullPolicy: IfNotPresent

service:
  name: nginx-service
  type: ClusterIP
  port: 80
  targetPort: 9000

env:
  name: dev

现在我们已经准备好了 Nginx Helm Chart,最终的 Helm Chart 结构如下所示。

nginx-chart
├── Chart.yaml
├── charts
├── templates
│   ├── configmap.yaml
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml

验证 Helm chart

现在为了确保我们的chart有效并且所有缩进都正常,我们可以运行以下命令。确保您位于chart目录内。

helm lint .

如果您从**nginx-chart目录外部执行它,请提供nginx-chart**的完整路径

helm lint /path/to/nginx-chart

如果没有错误或问题,则会显示此结果

==> Linting ./nginx
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed

要验证模板中的值是否被替换,您可以使用以下命令呈现带有值的模板化 YAML 文件。它将生成并显示带有替换值的所有清单文件。

helm template .

我们还可以使用--dry-run命令来检查。这将假装将chart安装到集群中,如果出现问题,它将显示错误。

helm install --dry-run my-release nginx-chart

xxxxxxxxxx helm plugin install <path/url1> # Install pluginshelm plugin list # View a list of all installed pluginshelm plugin update # Update pluginshelm plugin uninstall # Uninstall a pluginbash