在Lab1中,我们使用Helm安装了guestbook示例应用程序,并看到了相较于kubectl的优势我们可能认为自己已经足够了解使用Helm但是chart的更新或修改呢?我们如何更新和修改正在运行的应用?,现在小编就来说说关于helm参数模板?下面内容希望能帮助到你,我们来一起看看吧!
helm参数模板
Lab2 使用Helm更新应用在Lab1中,我们使用Helm安装了guestbook示例应用程序,并看到了相较于kubectl的优势。我们可能认为自己已经足够了解使用Helm。但是chart的更新或修改呢?我们如何更新和修改正在运行的应用?
在本实验中,我们将研究chart更改后如何更新正在运行的应用程序。为了说明这一点,我们将通过以下方式对原始留言簿的chart进行更改:
- 删除Redis从节点并改为仅使用内存数据库
- 将类型从LoadBalancer更改为NodePort
虽然是认为修改,但是本实验的目的是展示如何使用Kubernetes和Helm更新应用。那么,这样做有多容易呢?让我们继续看看。
场景1: 使用kubectl更新应用在本部分的实验中,我们将直接使用Kubernetes更新以前部署的应用程序Guestbook。
- 这是一个可选步骤,从技术上讲,更新正在运行的应用程序不是必需的。进行此步骤的原因是“整理”-我们要为已部署的当前配置获取正确的文件。这样可以避免在以后进行更新甚至回滚时犯错误。在此更新的配置中,我们删除了Redis从节点。要使目录与配置匹配,请移动/存档或仅从文件夹中删除Redis从属文件:
cd guestbook/v1
rm redis-slave-service.yaml
rm redis-slave-deployment.yaml
注意:如果需要,可以稍后使用git checkout-命令来还原这些文件。
- 删除Redis从节点的Service和Pod:
$ kubectl delete svc redis-slave --namespace default
service "redis-slave" deleted
$ kubectl delete deployment redis-slave --namespace default
deployment.extensions "redis-slave" deleted
- 将Guestbook服务的yaml从LoadBalancer更新为NodePort类型:
sed -i.bak 's/LoadBalancer/NodePort/g' guestbook-service.yaml
- 删除Guestbook运行时服务
kubectl delete svc guestbook --namespace default
- 重新创建具有NodePort类型的服务:
kubectl create -f guestbook-service.yaml
- 使用以下命令检查更新:
$ kubectl get all --namespace default
NAME READY STATUS RESTARTS AGE
pod/guestbook-v1-7fc76dc46-9r4s7 1/1 Running 0 1h
pod/guestbook-v1-7fc76dc46-hspnk 1/1 Running 0 1h
pod/guestbook-v1-7fc76dc46-sxzkt 1/1 Running 0 1h
pod/redis-master-5d8b66464f-pvbl9 1/1 Running 0 1h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/guestbook NodePort 172.21.45.29 <none> 3000:31989/TCP 31s
service/kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 9d
service/redis-master ClusterIP 172.21.232.61 <none> 6379/TCP 1h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/guestbook-demo 3/3 3 3 1h
deployment.apps/redis-master 1/1 1 1 1h
NAME DESIRED CURRENT READY AGE
replicaset.apps/guestbook-v1-7fc76dc46 3 3 3 1h
replicaset.apps/redis-master-5d8b66464f 1 1 1 1h
注意:服务类型已更改(更改为NodePor),并且已为留言簿服务分配了新端口(在此输出情况下为31989)。所有redis-slave资源均已删除。
- 获取节点的公共IP,并重新访问应用提供的服务:
kubectl get nodes -o wide
在本节中,我们将使用Helm更新以前部署的guestbook-demo应用程序。
在开始之前,让我们花几分钟看一下Helm与直接使用Kubernetes相比如何简化流程。Helm使用模板语言为chart提供了极大的灵活性和强大的功能,从而为chart用户消除了复杂性。在留言簿示例中,我们将使用以下模板功能:
- Values:提供访问传递到chart中的值的对象。例如在guestbook-service中,它包含以下类型:.Values.service.type。此行提供了在升级或安装期间设置服务类型的功能。
- 控制结构:在模板中也称为“动作”,控制结构使模板能够控制生成的流程。一个例子是在redis-slave-service中,它包含行-if .Values.redis.slaveEnabled-。该行允许我们在升级或安装期间启用/禁用REDIS主/从。
如下所示,完整的redis-slave-service.yaml演示了在禁用slaveEnabled标志时文件如何变得冗余以及如何设置端口值。其他chart文件中还有更多的模板功能示例。
{{- if .Values.redis.slaveEnabled -}}
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
app: redis
role: slave
spec:
ports:
- port: {{ .Values.redis.port }}
targetPort: redis-server
selector:
app: redis
role: slave
{{- end }}
helm list -n helm-demo
请注意,我们指定了名称空间。如果未指定,它将使用当前的名称空间上下文。我们应该看到类似于以下内容的输出:
$ helm list -n helm-demo
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
guestbook-demo helm-demo 1 2020-02-24 18:08:02.017401264 0000 UTC deployed guestbook-0.2.0
list命令提供已部署chart(发行版)的列表,其中提供了chart版本,名称空间,更新(修订)数量等信息。
- 我们更新应用程序:
$ cd helm101/charts
$ helm upgrade guestbook-demo ./guestbook --set redis.slaveEnabled=false,service.type=NodePort --namespace helm-demo
Release "guestbook-demo" has been upgraded. Happy Helming!
...
Helm升级将采用现有版本,并根据提供的信息对其进行升级。我们应该看到类似于以下内容的输出:
$ helm upgrade guestbook-demo ./guestbook --set redis.slaveEnabled=false,service.type=NodePort --namespace helm-demo
Release "guestbook-demo" has been upgraded. Happy Helming!
NAME: guestbook-demo
LAST DEPLOYED: Tue Feb 25 14:23:27 2020
NAMESPACE: helm-demo
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace helm-demo -o jsonpath="{.spec.ports[0].nodePort}" services guestbook-demo)
export NODE_IP=$(kubectl get nodes --namespace helm-demo -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
upgrade命令将应用程序升级到chart的指定版本,删除redis-slave资源,并将应用程序service.type更新为NodePort。
使用kubectl get all --namespace helm-demo获取更新内容:
$ kubectl get all --namespace helm-demo
NAME READY STATUS RESTARTS AGE
pod/guestbook-demo-6c9cf8b9-dhqk9 1/1 Running 0 20h
pod/guestbook-demo-6c9cf8b9-zddn2 1/1 Running 0 20h
pod/redis-master-5d8b66464f-g7sh6 1/1 Running 0 20h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/guestbook-demo NodePort 172.21.43.244 <none> 3000:31202/TCP 20h
service/redis-master ClusterIP 172.21.12.43 <none> 6379/TCP 20h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/guestbook-demo 2/2 2 2 20h
deployment.apps/redis-master 1/1 1 1 20h
NAME DESIRED CURRENT READY AGE
replicaset.apps/guestbook-demo-6c9cf8b9 2 2 2 20h
replicaset.apps/redis-master-5d8b66464f 1 1 1 20h
注意:服务类型已更改(更改为NodePort),并且已为留言簿服务分配了新端口(在此输出情况下为31202)。所有redis-slave资源均已删除。
当我们使用helm list -n helm-demo命令检查Helm版本时,可以看到revision和日期已更新:
$ helm list -n helm-demo
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
guestbook-demo helm-demo 2 2020-02-25 14:23:27.06732381 0000 UTC deployed guestbook-0.2.0
获取节点的公共IP,并重新访问应用提供的服务:
kubectl get nodes -o wide
恭喜,现在已经更新了应用程序! Helm不需要任何手动更改资源,因此非常容易升级!所有配置都可以在命令行上即时设置,也可以使用替代文件设置。从将逻辑添加到模板文件后就可以实现这一点,这取决于flag标识,启用或禁用此功能。
,