使用 Helm CLI 生成 charts 目录。输入以下命令创建新 chart:
helm create phoenixnap
使用 ls 命令列出文件结构:
Helm chart 目录包含以下内容:
- charts - 存储相关 charts 的目录
- templates - 配置文件的目录
- Chart.yaml - 包含 charts 元数据的文件
- values.yaml - 包含默认参数值的文件
配置 Helm Chart 涉及自定义参数,例如镜像拉取策略、名称覆盖、服务帐户和服务类型。请按照以下步骤了解如何在values.yaml文件中编辑这些参数。
镜像拉取策略决定如何从注册表中拉取容器镜像。默认策略值为**IfNotPresent
** ,这意味着 Kubernetes 仅当系统上尚不存在映像时才拉取该映像,下面我们尝试将策略改变为 Always:
- 打开value.yaml文件:
- 修改 image.pullPolicy 为 Always
要覆盖value.yaml文件中的chart名称,请将值添加到 nameOverride 和 fullnameOverride 字段。以下示例添加 phoenix-app 作为 nameOverride 值,并将phoenix-chartn 添加为 fullnameOverride。
Helm chart 的 service account 名称是在运行集群时生成的。但是,最好手动设置它并确保应用程序直接与chart 中的受控用户关联。
根据集群的不同,部署可能需要不同的网络服务类型。例如,使用Minikube进行测试时,推荐的网络服务类型为NodePort 。
要更改网络服务类型,请找到服务部分并更改类型字段中的值。下面的示例显示了设置为新服务类型的NodePort 。
配置values.yaml文件后,使用Helm命令部署应用程序。继续执行以下步骤来完成此操作。
helm install phoenix-chart phoenixnap/ --values phoenixnap/values.yaml
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}")
echo http://$NODE_IP:$NODE_PORT
输出显示已部署应用程序的完整地址,复制地址并将其粘贴到网络浏览器中。出现应用程序屏幕。
你也可以不仅仅只是修改,你可以重新创建这个样例
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 模板
首先,您需要弄清楚哪些值可以改变或者您想要模板化哪些值。我正在选择name 、 replicas 、容器名称、image、 imagePullPolicy和configMap 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.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
现在为了确保我们的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