首页
About Me
推荐
weibo
github
Search
1
linuxea:gitlab-ci之docker镜像质量品质报告
49,451 阅读
2
linuxea:如何复现查看docker run参数命令
23,044 阅读
3
Graylog收集文件日志实例
18,580 阅读
4
linuxea:jenkins+pipeline+gitlab+ansible快速安装配置(1)
18,275 阅读
5
git+jenkins发布和回滚示例
18,181 阅读
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
登录
Search
标签搜索
kubernetes
docker
zabbix
Golang
mariadb
持续集成工具
白话容器
elk
linux基础
nginx
dockerfile
Gitlab-ci/cd
最后的净土
基础命令
gitops
jenkins
docker-compose
Istio
haproxy
saltstack
marksugar
累计撰写
690
篇文章
累计收到
139
条评论
首页
栏目
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
页面
About Me
推荐
weibo
github
搜索到
5
篇与
的结果
2022-06-28
linuxea:habor2.5的helm仓库和镜像仓库使用(5)
在早先,容器仓库有Portus和harbor最为瞩目,harbor是vmware的产品,而前者则是由suse团队维护,但在2019portus提供了最后一个版本。但随着时间的推移,harbor提供了更多与时俱进的功能服务,这也导致harbor愈发的收到关注和使用。并且harbor是由vmware中国区成员参与,众所周知,一款提供中文界面且有优秀的产品,往往都是更受欢迎的。harbor不仅可以存放容器镜像,还可以提供helm的仓库,简单列出他具备的功能云原生注册表:支持容器镜像和Helm图表,Harbor 充当云原生环境(如容器运行时和编排平台)的注册表。基于角色的访问控制:用户通过“项目”访问不同的存储库,并且用户可以对项目下的图像或 Helm 图表具有不同的权限。基于策略的复制:可以使用过滤器(存储库、标签和标签)基于策略在多个注册表实例之间复制(同步)图像和图表。如果遇到任何错误,Harbor 会自动重试复制。这可用于辅助负载平衡、实现高可用性以及促进混合和多云场景中的多数据中心部署。漏洞扫描:Harbor 定期扫描映像以查找漏洞,并进行策略检查以防止部署易受攻击的映像。LDAP/AD 支持:Harbor 与现有的企业 LDAP/AD 集成以进行用户身份验证和管理,并支持将 LDAP 组导入 Harbor,然后可以授予特定项目的权限。OIDC 支持:Harbor 利用 OpenID Connect (OIDC) 来验证由外部授权服务器或身份提供者认证的用户的身份。可以启用单点登录以登录到 Harbor 门户。图像删除和垃圾收集:系统管理员可以运行垃圾收集作业,以便可以删除图像(悬空清单和未引用的 blob)并定期释放它们的空间。Notary:支持使用 Docker Content Trust(利用 Notary)对容器镜像进行签名,以保证真实性和出处。此外,还可以激活防止部署未签名映像的策略。图形用户门户:用户可以轻松浏览、搜索存储库和管理项目。审计:通过日志跟踪对存储库的所有操作。RESTful API:提供 RESTful API 是为了方便管理操作,并且易于用于与外部系统集成。嵌入式 Swagger UI 可用于探索和测试 API。易于部署:Harbor 可以通过 Docker compose 以及 Helm Chart 进行部署,最近还添加了一个 Harbor Operator。以上内容特征从github获取,阅读本章,你将了解如何利用harbor配置基本的docker容器仓库和helm仓库的使用harbor如果你是nginx,则可以直接使用如下命令创建。openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout linuxea.key -out linuxea.crt -subj /C=CH/ST=ShangHai/L=Xian/O=Devops/CN=linuxea.test.com1.准备证书我们按照官方文档进行创建ssl证书与之不同的是我们尽可能的将证书配置的旧一些。因为无论在什么环境,证书最大的问题就是会过期,后期替换的时候会波及到正常使用。域名:harbor.local.com创建的证书目录:/data/cert-date +%F复制下面的命令在sh脚本中修改${YOU_DOMAIN}和${CERT_PATH}后执行即可CERT_PATH=/data/cert-`date +%F`/ YOU_DOMAIN=harbor.local.com mkdir -p ${CERT_PATH} openssl genrsa -out ca.key 4096 openssl req -x509 -new -nodes -sha512 -days 365000 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=${YOU_DOMAIN}" \ -key ca.key \ -out ca.crt openssl genrsa -out ${YOU_DOMAIN}.key 4096 openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=${YOU_DOMAIN}" \ -key ${YOU_DOMAIN}.key \ -out ${YOU_DOMAIN}.csr cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=${YOU_DOMAIN} DNS.2=yourdomain DNS.3=hostname EOF openssl x509 -req -sha512 -days 365000 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in ${YOU_DOMAIN}.csr \ -out ${YOU_DOMAIN}.crt cp ${YOU_DOMAIN}.crt ${YOU_DOMAIN}.key ${CERT_PATH} 2.harbor和docker接着将证书复制到harbor和docker的目录,使其生效1.复制crt和key 到harbor的证书目录cp ${YOU_DOMAIN}.crt ${YOU_DOMAIN}.key ${CERT_PATH} 2.转换yourdomain.com.crt为yourdomain.com.cert, 供 Docker 使用openssl x509 -inform PEM -in harbor.local.com.crt -out harbor.local.com.cert本机mkdir -p /etc/docker/certs.d/harbor.local.com/ cp harbor.local.com.cert /etc/docker/certs.d/harbor.local.com/ cp harbor.local.com.key /etc/docker/certs.d/harbor.local.com/ cp ca.crt /etc/docker/certs.d/harbor.local.com/ systemctl reload docker其他节点scp harbor.local.com.cert harbor.local.com.key ca.crt 172.16.15.136:/etc/docker/certs.d/harbor.local.com/ systemctl reload docker如果不是80端口请创建文件夹/etc/docker/certs.d/yourdomain.com:port或/etc/docker/certs.d/harbor_IP:port.3.harbor.yml经过过滤得到如下配置[root@b.linuxea.com harbor]# egrep -v "^$|^#|^ #|^ #" harbor.yml hostname: reg.mydomain.com http: port: 80 https: port: 443 certificate: /your/certificate/path private_key: /your/private/key/path harbor_admin_password: Harbor12345 database: password: root123 max_idle_conns: 100 max_open_conns: 900 data_volume: /data trivy: ignore_unfixed: false skip_update: false offline_scan: false insecure: false jobservice: max_job_workers: 10 notification: webhook_job_max_retry: 10 chart: absolute_url: disabled log: level: info local: rotate_count: 50 rotate_size: 200M location: /var/log/harbor _version: 2.5.0 proxy: http_proxy: https_proxy: no_proxy: components: - core - jobservice - trivy upload_purging: enabled: true age: 168h interval: 24h dryrun: false3.1.将服务器证书和密钥复制到 Harbor 主机上的 certficates 文件夹中。创建一个存储目录:mkdir /data/harbor/data配置文件。进行sed替换即可,主要修改如下:hostname:域名certificate: cert目录地址private_key: key目录地址harbor_admin_password: 登录密码data_volume: docker-compose的所有挂载目录sed -i 's@hostname: reg.mydomain.com@hostname: harbor.local.com@g' harbor.yml sed -i 's@certificate: /your/certificate/path@certificate: /data/cert-2022-06-28/harbor.local.com.crt@g' harbor.yml sed -i 's@private_key: /your/private/key/path@private_key: /data/cert-2022-06-28/harbor.local.com.key@g' harbor.yml sed -i 's@harbor_admin_password: Harbor12345@harbor_admin_password: admin@g' harbor.yml sed -i 's@data_volume: /data@data_volume: /data/harbor/data@g' harbor.yml4.安装harbor一切准备妥当,执行./install.sh脚本自动安装[root@b.linuxea.com harbor]# ./install.sh [Step 0]: checking if docker is installed ... Note: docker version: 19.03.6 [Step 1]: checking docker-compose is installed ... ....... [Step 5]: starting Harbor ... Creating network "harbor_harbor" with the default driver Creating harbor-log ... done Creating harbor-db ... done Creating registry ... done Creating redis ... done Creating harbor-portal ... done Creating registryctl ... done Creating harbor-core ... done Creating harbor-jobservice ... done Creating nginx ... done ✔ ----Harbor has been installed and started successfully.----5.测试容器仓库回到其他节点测试docker的应有配置目录结构如下[root@a.linuxea.com ~]# tree /etc/docker/ /etc/docker/ ├── certs.d │ └── harbor.local.com │ ├── ca.crt │ ├── harbor.local.com.cert │ └── harbor.local.com.key ├── daemon.json └── key.json 2 directories, 5 files (base) [root@a.linuxea.com ~]# cat /etc/docker/daemon.json {"insecure-registries":["172.16.100.150:8443",harbor.local.com]}登录测试[root@a.linuxea.com ~]# docker login harbor.local.com Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded上传镜像测试创建一个仓库harbor提供的命令如下docker push harbor.local.com/base/REPOSITORY[:TAG]测试[root@a.linuxea.com ~]# docker tag mysql:8.0.16 harbor.local.com/base/mysql:8.0.16 [root@a.linuxea.com ~]# docker push harbor.local.com/base/mysql:8.0.16 The push refers to repository [harbor.local.com/base/mysql] 605d208195c7: Pushed 9d87c3455758: Pushed 80f1020054a4: Pushed b0425df45fae: Pushed 680666c6bf72: Pushed 7e7fffcdabb3: Pushed 77737de99484: Pushed 2f1b41b24201: Pushed 007a7f930352: Pushed c6926fcee191: Pushed b78ec9586b34: Pushed d56055da3352: Pushed 8.0.16: digest: sha256:036b8908469edac85afba3b672eb7cbc58d6d6b90c70df0bb3fe2ab4fd939b22 size: 2828docker没有问题后配置helm仓库helm31.helm3安装在官网下载一个helm,解压后并将可执行文件放置sbin下wget https://get.helm.sh/helm-v3.8.2-linux-amd64.tar.gz tar xf helm-v3.8.2-linux-amd64.tar.gz cp linux-amd64/helm /usr/local/sbin安装完成[root@a.linuxea.com ~]# helm version version.BuildInfo{Version:"v3.8.2", GitCommit:"5cb9af4b1b271d11d7a97a71df3ac337dd94ad37", GitTreeState:"clean", GoVersion:"go1.17.5"}2.添加helm源添加一个azure源,并将其更新helm repo add stable http://mirror.azure.cn/kubernetes/charts/ helm repo list helm repo update helm search repo stable3.登录helm[root@a.linuxea.com ~]# helm registry login harbor.local.com Username: admin Password: Login Succeeded我们还需要让系统信任这个ca,于是我们将 /etc/docker/certs.d/harbor.local.com/ca.crt的内容追加到如/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem文件中,并复制ca.crt到/etc/pki/ca-trust/source/anchors/cp /etc/docker/certs.d/harbor.local.com/ca.crt /etc/pki/ca-trust/source/anchors/3.中转charts我们一个共有的mirros的包中转到私有的仓库上。在中转之前,需要添加一个源来提供现有的charts下载redishelm fetch stable/redis[root@a.linuxea.com ~]# ls redis-10.5.7.tgz redis-10.5.7.tgz推送到harbor.local.com推送 chart 到当前项目helm push redis-10.5.7.tgz oci://harbor.local.com/redis登录harbor查看点进这个Artifacts内,就能看到更多的信息4.上传本地charts现在在本地创建一个charts用作测试,上传到harbor中[root@a.linuxea.com data]# helm create test Creating test [root@a.linuxea.com data]# ls test/ charts Chart.yaml templates values.yaml打包推送[root@a.linuxea.com data]# helm package test Successfully packaged chart and saved it to: /data/test-0.1.0.tgz推送到helm服务器[root@a.linuxea.com data]# helm push test-0.1.0.tgz oci://harbor.local.com/redis Pushed: harbor.local.com/redis/test:0.1.0 Digest: sha256:1a86bc2ae87a8760398099a9c0966ce41141eacc7270673d03dfc4005bc349db5.使用私有charts回到仓库里面,鼠标放在拉取按钮上将会显示拉取的命令如下helm pull oci://harbor.local.com/redis/redis --version 10.5.7拉到本地[root@a.linuxea.com opt]# helm pull oci://harbor.local.com/redis/redis --version 10.5.7 Pulled: harbor.local.com/redis/redis:10.5.7 Digest: sha256:41643fa64d23797d0a874a2b264c9fc1f7323b08b9a02fb3010d72805b54bc3a [root@a.linuxea.com opt]# ls redis-10.5.7.tgz解压后使用template可以看到模板的配置清单信息[root@a.linuxea.com opt]# tar xf redis-10.5.7.tgz [root@a.linuxea.com redis]# helm template test ./安装测试helm upgrade --install -f values.yaml test-redis stable/redis --namespace redis --create-namespace--create-namespace: 如果名称空间不存在就创建upgrade: 如果存在就更新,不存在就创建[root@a.linuxea.com redis]# helm install -f values.yaml test-redis stable/redis --namespace redis --create-namespace WARNING: This chart is deprecated NAME: test-redis LAST DEPLOYED: Tue Jun 28 14:50:56 2022 NAMESPACE: redis STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: This Helm chart is deprecated Given the `stable` deprecation timeline (https://github.com/helm/charts#deprecation-timeline), the Bitnami maintained Redis Helm chart is now located at bitnami/charts (https://github.com/bitnami/charts/). The Bitnami repository is already included in the Hubs and we will continue providing the same cadence of updates, support, etc that we've been keepinghere these years. Installation instructions are very similar, just adding the _bitnami_ repo and using it during the installation (`bitnami/<chart>` instead of `stable/<chart>`) ```bash $ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm install my-release bitnami/<chart> # Helm 3 $ helm install --name my-release bitnami/<chart> # Helm 2 ``` To update an exisiting _stable_ deployment with a chart hosted in the bitnami repository you can execute ```bash $ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm upgrade my-release bitnami/<chart> ``` Issues and PRs related to the chart itself will be redirected to `bitnami/charts` GitHub repository. In the same way, we'll be happy to answer questions related to this migration process in this issue (https://github.com/helm/charts/issues/20969) created as a common place for discussion. ** Please be patient while the chart is being deployed ** Redis can be accessed via port 6379 on the following DNS name from within your cluster: test-redis-master.redis.svc.cluster.local To get your password run: export REDIS_PASSWORD=$(kubectl get secret --namespace redis test-redis -o jsonpath="{.data.redis-password}" | base64 --decode) To connect to your Redis server: 1. Run a Redis pod that you can use as a client: kubectl run --namespace redis test-redis-client --rm --tty -i --restart='Never' \ --env REDIS_PASSWORD=$REDIS_PASSWORD \ --image docker.io/bitnami/redis:5.0.7-debian-10-r32 -- bash 2. Connect using the Redis CLI: redis-cli -h test-redis-master -a $REDIS_PASSWORD To connect to your database from outside the cluster execute the following commands: kubectl port-forward --namespace redis svc/test-redis-master 6379:6379 & redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD查看密码[root@a.linuxea.com redis]# kubectl get secret --namespace redis test-redis -o jsonpath="{.data.redis-password}" | base64 --decode VeiervwDUG查看运行状态由于一些配置没有准备,此时redis是pending的,但是helm安装是成功的。我们的目的达到了[root@k8s-02 ~]# kubectl -n redis get all NAME READY STATUS RESTARTS AGE pod/test-redis-master-0 0/1 Pending 0 2m53s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/test-redis-headless ClusterIP None <none> 6379/TCP 2m53s service/test-redis-master ClusterIP 10.101.161.177 <none> 6379/TCP 2m53s NAME READY AGE statefulset.apps/test-redis-master 0/1 2m53s已经测试完成,现在卸载掉即可([root@a.linuxea.com redis]# helm -n redis ls NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION test-redis redis 1 2022-06-28 14:50:56.56116374 +0800 CST deployed redis-10.5.7 5.0.7 [root@a.linuxea.com redis]# helm -n redis uninstall test-redis release "test-redis" uninstalled [root@a.linuxea.com redis]# helm -n redis ls NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION基于ip的helm在很多场景中,我们需要把一个http的改成https并且还要他支持https,并且还是ip,这在harbor官网已经有说明,老话重提的。1.准备证书与此前不同的是,我们需要将subjectAltName = @alt_names的值也改成ip地址subjectAltName = IP:IPADDRESS如下CERT_PATH=/data/cert-`date +%F`/ YOU_DOMAIN=harbor.local.com mkdir -p ${CERT_PATH} openssl genrsa -out ca.key 4096 openssl req -x509 -new -nodes -sha512 -days 365000 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=${YOU_DOMAIN}" \ -key ca.key \ -out ca.crt openssl genrsa -out ${YOU_DOMAIN}.key 4096 openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=${YOU_DOMAIN}" \ -key ${YOU_DOMAIN}.key \ -out ${YOU_DOMAIN}.csr cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=${YOU_DOMAIN} DNS.2=yourdomain DNS.3=hostname EOF openssl x509 -req -sha512 -days 365000 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in ${YOU_DOMAIN}.csr \ -out ${YOU_DOMAIN}.crt cp ${YOU_DOMAIN}.crt ${YOU_DOMAIN}.key ${CERT_PATH} 以172.16.100.150为例CERT_PATH=/data/cert-`date +%F`/ YOU_DOMAIN=172.16.100.150:8443 mkdir -p ${CERT_PATH} openssl genrsa -out ca.key 4096 openssl req -x509 -new -nodes -sha512 -days 365000 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=${YOU_DOMAIN}" \ -key ca.key \ -out ca.crt openssl genrsa -out ${YOU_DOMAIN}.key 4096 openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=${YOU_DOMAIN}" \ -key ${YOU_DOMAIN}.key \ -out ${YOU_DOMAIN}.csr cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = IP:172.16.100.150 [alt_names] DNS.1=${YOU_DOMAIN} DNS.2=yourdomain DNS.3=hostname EOF openssl x509 -req -sha512 -days 365000 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in ${YOU_DOMAIN}.csr \ -out ${YOU_DOMAIN}.crt cp ${YOU_DOMAIN}.crt ${YOU_DOMAIN}.key ${CERT_PATH}2.harbor.yaml配置harbor.yaml部分配置hostname: 172.16.100.150 http: port: 8080 https: port: 8443 certificate: /etc/ssl/certs/172.16.100.150:8443.crt private_key: /etc/ssl/certs/172.16.100.150:8443.key配置完成后需要执行./prepare并且重启3.docker和ca仍然进行证书拷贝首先拷贝当前节点的 cp 172.16.100.150\:8443.* /etc/docker/certs.d/172.16.100.150\:8443/在将当前的证书打包拷贝到其他需要使用helm上传下载的节点 tar -zcf 8443.tar 172.16.100.150\:8443 scp 8443.tar 172.16.15.136:/etc/docker/certs.d/目录结构如下[root@docker-156 certs.d]# tree /etc/docker/certs.d/ /etc/docker/certs.d/ ├── 172.16.100.150:8443 │ ├── 172.16.100.150:8443.cert │ ├── 172.16.100.150:8443.crt │ ├── 172.16.100.150:8443.csr │ ├── 172.16.100.150:8443.key │ └── ca.crt仍然需要让系统信任这个ca,于是我们将 ca.crt的内容追加到如/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem文件中,并复制ca.crt到/etc/pki/ca-trust/source/anchors/cp /etc/docker/certs.d/harbor.local.com/ca.crt /etc/pki/ca-trust/source/anchors/而后就可以正常推送和下载了
2022年06月28日
1,702 阅读
0 评论
0 点赞
2022-06-05
linuxea: helm3变量/命名模板/共享模板等常见用法(3)
在helm中除了此前的那些内置函数和定义的一些valumes的值替换,这些对象和控制语句,还有一些管道之外,仍然提供了变量。大多数编程语言中,都有变量。如,在golang中以及groovy中都提到了全局变量和局部变量。 他们的作用域范围不同全局变量全局变量,顾名思义,所有都可以使用局部变量在某一块的代码内被使用,而代码块作用域外无法使用有了这些的支撑,更好理解变量的出现以及使用的问题变量而变量在helm中的用的和大多数编程语言不一样,helm中的变量能够用来简化代码。这通常配合with已经range。但是在helm中,定义一个变量的方式却非常有意思,似乎结合了shell和golang。$mark := .Release.Name示例1 变量仍然存在一个局部和全局的意思,比如:with {{ with .Values.mydata -}} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }}在如上代码块中是不能使用Release.Name的,解决这个问题的办法就是将对象分配给with的作用域之外。上面提到,定义一个变量的方式和shell,golang类似,随即定义一个Release.Name{{ $linuxea := .Release.Name -}}并将塔引入到with必须将变量定于在with之外,在with中的if之外 {{ $linuxea := .Release.Name -}} {{ with .Values.mydata -}} releasename: {{ $linuxea }} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }}如下apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ $linuxea := .Release.Name -}} {{ with .Values.mydata -}} releasename: {{ $linuxea }} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }} {{ indent 2 "test: ok" }} mylist: |- {{- range .Values.mylist }} - {{ . | title | quote }} {{- end }}执行PS H:\k8s-1.20.2\helm> helm template linuxea.com .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: linuxea.com-cmp labels: app: linuxea.com-cmp data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM releasename: linuxea.com status: ok test: ok mylist: |- - "Mark" - "Edwin" - "Sean"示例2 range在golang里面,range是可以将索引和值进行打印的了,而在helm中也可以这样使用。如下 mylist: |- {{- range $index,$value := .Values.mylist }} - {{ $index }}:{{ $value | title | quote }} {{- end }} values.yamlmydata: names: marksugar data: hi mark, my www.linuxea.com status: isok mylist: - mark - edwin - sean 如下apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ $linuxea := .Release.Name -}} {{ with .Values.mydata -}} releasename: {{ $linuxea }} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }} {{ indent 2 "test: ok" }} mylist: |- {{- range .Values.mylist }} - {{ . | title | quote }} {{- end }} {{- range $index,$value := .Values.mylist }} - {{ $index }}:{{ $value | title | quote }} {{- end }}渲染PS H:\k8s-1.20.2\helm> helm template linuxea.com .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: linuxea.com-cmp labels: app: linuxea.com-cmp data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM releasename: linuxea.com status: ok test: ok mylist: |- - "Mark" - "Edwin" - "Sean" - 0:"Mark" - 1:"Edwin" - 2:"Sean"map同样,可以渲染一个字典 {{- range $index,$value := .Values.mydata }} - {{ $index }}:{{ $value | title | quote }} {{- end }} values.yamlmydata: names: marksugar data: hi mark, my www.linuxea.com status: isok mylist: - mark - edwin - sean 如下apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ $linuxea := .Release.Name -}} {{ with .Values.mydata -}} releasename: {{ $linuxea }} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }} {{ indent 2 "test: ok" }} mylist: |- {{- range .Values.mylist }} - {{ . | title | quote }} {{- end }} {{- range $index,$value := .Values.mylist }} - {{ $index }}:{{ $value | title | quote }} {{- end }} {{- range $index,$value := .Values.mydata }} - {{ $index }}:{{ $value | title | quote }} {{- end }} 渲染PS H:\k8s-1.20.2\helm> helm template linuxea.com .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: linuxea.com-cmp labels: app: linuxea.com-cmp data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM releasename: linuxea.com status: ok test: ok mylist: |- - "Mark" - "Edwin" - "Sean" - 0:"Mark" - 1:"Edwin" - 2:"Sean" - data:"Hi Mark, My Www.Linuxea.Com" - names:"Marksugar" - status:"Isok"示例3 全局变量变量通常而言不是全局的,都在作用域之内,在range和with中作用域也只是在{{ rage }}和{{end}}之间的。为了解决这个问题,可以从顶部开始定义一个,或者使用$来引用外部变量$表示最外层的上下文顶部定义Release.Name有两种方式。第一种,在顶部定义,如下{{ $linuxea := .Release.Name -}} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: ... releasename: {{ $linuxea }} ...$引用Chart.Name{{ $linuxea := .Release.Name -}} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: ... chartname: {{ $.Chart.Name }} ...如下{{ $linuxea := .Release.Name -}} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ with .Values.mydata -}} releasename: {{ $linuxea }} chartname: {{ $.Chart.Name }} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }} 渲染PS H:\k8s-1.20.2\helm> helm template linuxea.com .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: linuxea.com-cmp labels: app: linuxea.com-cmp data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM releasename: linuxea.com chartname: linuxea status: ok到现在为止,一直都是使用一个模板来进行操作的,如果要进行多个模板,就需要使用到命名模板。命名模板命名模板也称为子模板。在文件内部定义,通常有两种方式创建,而使用方式较多一旦定义了命名模板,名称就是全局的,如果名称重复,最后被加载的模板会被使用。因此,命名需要注意不要冲突,而为了避免此事,大家开始约定,在定义的模板前添加chart名称,如{{ define "mylinuxea.name" }}通过这种特定的前缀避免相同名称带来的冲突问题如果希望渲染的是一段,那么template将很适用,否则include可以更适合嵌套helm模板允许创建命名进行嵌入式的方式在其他位置进行访问。命名约定:templates/ 目录下的文件被视为kubernetes资源清单以_开头的文件不会被当作资源清单文件以_下划线开头的文件可以被其他chart模板调用partials_开头的文件是helm中的partials,默认的名称模板就在_helpers.tpl文件中,而我们自己定义的也可以在其中。这些文件就是partials文件。而在chart的包中也能找到这个文件... templates/ | `-- tests ....... `-- _helpers.tpl ...._helpers.tpl中就定义了被其他chart调用define and templatedefine关键字可以在模板文件中创建命名模板,而后使用template来引用示例{{ define "linuxea.name" }} # describe {{ end }}定义一个标签{{- define "linuxea.labels" }} labels: generator: helm data: {{ now | htmlDate }} {{ end }}now为当前时间的函数,而htmlDate是格式化而使用则是使用template引用{{- template "linuxea.labels" }}如下{{ $linuxea := .Release.Name -}} {{- define "linuxea.labels" }} labels: generator: helm data: {{ now | htmlDate -}} {{ end }} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp {{- template "linuxea.labels" }} data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ with .Values.mydata -}} releasename: {{ $linuxea }} chartname: {{ $.Chart.Name }} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }} 渲染PS H:\k8s-1.20.2\helm> helm template linuxea.com .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: linuxea.com-cmp labels: generator: helm data: 2022-04-21 data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM releasename: linuxea.com chartname: linuxea status: ok_helpers.tpl那么按照刚说的,我们应该把她放在创建的_helpers.tpl文件中{{/ 注释 /}} 注释{{/* 注释 */}} {{- define "linuxea.labels" }} labels: generator: helm data: {{ now | htmlDate -}} {{ end }}其他不需要修改,仍然是可以进行调用的PS H:\k8s-1.20.2\helm> helm template linuxea.com .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: linuxea.com-cmp labels: generator: helm data: 2022-04-21 data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM releasename: linuxea.com chartname: linuxea status: ok访问范围那么此时,如果想要在_helpers.tpl中使用helm的内置函数对象,如:Release.Name类似的对象,就需要在template中传递一个..作为作用域,在_helpers.tpl中需要从template中传递过来,否则是无法正常被使用_helpers.tplchartName: {{ .Release.Name }}_helpers.tpl中的.是从template的尾部的.传递的,也就是作用域中的传递引用使用template的尾部加.{{- template "linuxea.labels" . }}如下{{/* labels */}} {{- define "linuxea.labels" }} labels: generator: helm data: {{ now | htmlDate }} chartName: {{ .Release.Name }} {{- end }}引用{{ $linuxea := .Release.Name -}} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp {{- template "linuxea.labels" . }} data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ with .Values.mydata -}} releasename: {{ $linuxea }} chartname: {{ $.Chart.Name }} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }} 渲染PS H:\k8s-1.20.2\helm> helm.exe template test .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-cmp labels: generator: helm data: 2022-04-23 chartName: test data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM releasename: test chartname: linuxea status: okincludetemplate作为一个函数用来渲染结果,是无法将模板调用给其他函数使用的,而要完成这样的操作就需要include,include可以将模板内容导入到当前的管道,传递给其他函数template只是将结果渲染,原封不动的渲染过来,而include可以做一些操作,比如,添加空格。而这在yaml格式中尤为重要定义一个mark.labels,如下{{- define "mark.labels" }} app: linuxea.com version: v0.1 {{- end }}引用metadata: name: {{ .Release.Name }}-cmp labels: {{- include "mark.labels" . | indent 4 }} include 后,indent 4 空出4个空格如下{{ $linuxea := .Release.Name -}} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: {{- include "mark.labels" . | indent 4 }} data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ with .Values.mydata -}} releasename: {{ $linuxea }} chartname: {{ $.Chart.Name }} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }} 渲染如下PS H:\k8s-1.20.2\helm> helm.exe template test .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-cmp labels: app: linuxea.com version: v0.1 data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM releasename: test chartname: linuxea status: ok.Files.Files可以更好的导入文件中的内容,上面的几种都是来使得模板使用变得容易,而.Files是注入内容,但是并不是通过模板渲染获得。但是.files在使用的时候需要注意一下3点:1,helm chart被限制必须不能大于1M,而.files的文件也会被打包,这意味着不能什么都加进去helm chart最终是以secret形式存放,而secret是存放在etcd中,etcd本身的限制2,出于安全考虑.Files不能访问template/和.helmgnore的排除文件3,chart不会与uninx系统信息挂钩,.files的文件权限不影响使用注意:文件内容必须是yaml格式或者json格式文件必须在template目录之上,和values.yaml同级别在templates目录之上创建三个文件否则会抛出: Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: error validating "": error validating data: [apiVersion not set, kind not set]错误所以目录结构必须正确Test.json test2.json test3.json如下PS H:\k8s-1.20.2\helm> dir .\liunuxea\ 目录: H:\k8s-1.20.2\helm\liunuxea Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2022-04-26 0:28 templates -a---- 2022-04-26 0:21 0 .helmignore -a---- 2022-04-26 0:24 102 Chart.yaml -a---- 2022-04-26 0:22 10 Test.json -a---- 2022-04-26 0:38 11 test2.json -a---- 2022-04-26 0:38 12 test3.json -a---- 2022-04-26 0:12 120 values.yaml而后使用range来遍历如下apiVersion: v1 kind: Secret metadata: name: mysecret namespace: default type: Opaque data: {{- $files := .Files }} {{- range tuple "Test.json" "test2.json" "test3.json"}} {{ . }}: |- {{ $files.Get . }} {{- end }} --- apiVersion: v1 kind: ConfigMap metadata: name: special-config data: {{- $files := .Files }} {{- range tuple "Test.json" "test2.json" "test3.json"}} {{ . }}: |- {{ $files.Get . }} {{- end }}$files赋值的值是.Files对象的引用,tuple函数来循环文件列表,而后打印每个文件夹的{{ . }}: 文件名 |- 换行,并且去掉行尾空格 {{ $files.Get . }} 打印文件内容渲染PS H:\k8s-1.20.2\helm> helm.exe install test --dry-run .\liunuxea\ NAME: test LAST DEPLOYED: Tue Apr 26 00:39:14 2022 NAMESPACE: default STATUS: pending-install REVISION: 1 TEST SUITE: None HOOKS: MANIFEST: --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: Secret metadata: name: mysecret namespace: default type: Opaque data: Test.json: |- names: 123 test2.json: |- names: 1234 test3.json: |- names: 12345 --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: special-config data: Test.json: |- names: 123 test2.json: |- names: 1234 test3.json: |- names: 12345configmap和secretspod中的configmap和secrets如果把文件内容同时加入到configmap和secrets中,在helm中有另外一个方法https://helm.sh/docs/chart_template_guide/accessing_files/#configmap-and-secrets-utility-functionsasconfigassecrets如果不想用这两个还可使用base64编码在templates目录之上创建三个文件否则会抛出: Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: error validating "": error validating data: [apiVersion not set, kind not set]错误所以目录结构必须正确{{ $linuxea := .Release.Name -}} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: {{- include "mark.labels" . | indent 4 }} data: token: |- {{ .Files.Get "test3.json" | b64enc }} --- apiVersion: v1 kind: Secret metadata: name: {{ .Release.Name }}-linuxea type: Opaque data: my.cnf: |- {{ .Files.Get "test2.json" | b64enc }}调试PS H:\k8s-1.20.2\helm> helm.exe install test --dry-run .\liunuxea\ NAME: test LAST DEPLOYED: Tue Apr 26 00:42:37 2022 NAMESPACE: default STATUS: pending-install REVISION: 1 TEST SUITE: None HOOKS: MANIFEST: --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: Secret metadata: name: test-linuxea type: Opaque data: my.cnf: |- bmFtZXM6IDEyMzQ= --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-cmp labels: app: linuxea.com version: v0.1 data: token: |- bmFtZXM6IDEyMzQ1NOTES.txt 文件NOTES.txt被用来打印一些信息的,比如在安装完成或者升级完成后,而使用模板可以自定义这些信息。而要使用这些,必须创建一个NOTES.txt的文件在templates目录下,纯文本内容。但是可以像模板一样进行处理并且和模板一样进行使用。在template模板下创建一个NOTES.txt,内容随便,如下:================================== hello thank you install {{ .Chart.Name }} describe: $ helm status {{ .Release.Name }} $ helm get {{ .Release.Name }}因为是安装后或者升级才能看到的,所以需要安装调试下才能看到PS H:\k8s-1.20.2\helm> helm.exe install test --dry-run .\liunuxea\ NAME: test LAST DEPLOYED: Tue Apr 26 23:02:27 2022 NAMESPACE: default STATUS: pending-install REVISION: 1 TEST SUITE: None HOOKS: MANIFEST: --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: Secret metadata: name: test-linuxea type: Opaque data: my.cnf: |- bmFtZXM6IDEyMzQ= --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-cmp labels: app: linuxea.com version: v0.1 data: token: |- bmFtZXM6IDEyMzQ1 NOTES: ================================== hello thank you install linuxea describe: $ helm status test $ helm get testsubcharts和全局值charts是可以有一些依赖项的,这种依赖的方式是subcharts,也可以称为子chart子chart注意信息:subcharts是独立的,不能依赖父chart子chart无法访问父级的值父级可以覆盖子chart的值helm中可以定义全局值,在父,子的chart都可以被访问子chart因此,我们在当前的liunxea的charts目录下下创建一个mycharthelm create mychart rm mychart/templates/*而后在templates下添加一个values.yaml,内容如下mark: "hello mark"在template下创建一个configmap.yaml,如下apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-mychart data: mychart: {{ .Values.mark }}在当前子chart中渲染两个chart是独立的,因此可以进行渲染PS H:\k8s-1.20.2\helm\liunuxea\mychart> helm.exe template test ./ --- # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-mychart data: mychart: hello mark如果此时要在主chart,也就是liunxea中覆盖子chart,就需要在主chart中添加同样的参数mychart: mark: "is master chart"而后直接渲染即可顶层的主chart覆盖了子chart的值,但是这种覆盖方式在模板引擎传递values值的时候就会配置作用域,当覆盖的时候,liunxea中的values的mychart值就会传递到mychart, 对于mychart模板中的.Vaules仅仅用域该子chart的值PS H:\k8s-1.20.2\helm\liunuxea> helm.exe template test . --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: Secret metadata: name: test-linuxea type: Opaque data: my.cnf: |- bmFtZXM6IDEyMzQ= --- # Source: linuxea/charts/mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-mychart data: mychart: is master chart --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-cmp labels: app: linuxea.com version: v0.1 data: token: |- bmFtZXM6IDEyMzQ1全局值全局值是可以从任何 chart 或子 chart 中都可以访问的值,全局值需要显示的声明,不能将现有的非全局对象当作全局对象使用。Values 数据类型具有一个名为 Values.global 的保留部分,可以在其中设置全局值,我们在 values.yaml 文件中添加一个全局值:global: name: marksugar分别在文件中引用 name2: {{ .Values.global.name }}渲染PS H:\k8s-1.20.2\helm> helm template test .\liunuxea\ # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: Secret metadata: name: test-linuxea name2: marksugar type: Opaque data: my.cnf: |- bmFtZXM6IDEyMzQ= --- # Source: linuxea/charts/mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-mychart data: mychart: is master chart name: marksugar --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-cmp labels: app: linuxea.com version: v0.1 data: token: |- bmFtZXM6IDEyMzQ1共享模板父级 chart 和子 chart 可以共享模板,任何 chart 中已定义的块都可以用于其他 chart。比如,我们可以定义一个简单的模板,如下所示:{{- define "labels" }}from: mychart{{ end }}前面我们提到过可以使用在模板中使用 include 和 template,但是使用 include 的一个优点是可以动态引入模板的内容:{{ include $mytemplate }}hookhelm提供一个钩子,可以在某个时间点进行干预,比如:在加载charts之前执行一个job备份数据库,安装完成后执行第二个job还原删除之前运行一个Job来关闭一些服务Hooks 的工作方式类似于普通的模板,但是他们具有特殊的注解,这些注解使 Helm 可以用不同的方式来使用他们。hooks在 Helm 中定义了如下一些可供我们使用的 Hooks:预安装pre-install:在模板渲染后,kubernetes 创建任何资源之前执行安装后post-install:在所有 kubernetes 资源安装到集群后执行预删除pre-delete:在从 kubernetes 删除任何资源之前执行删除请求删除后post-delete:删除所有 release 的资源后执行升级前pre-upgrade:在模板渲染后,但在任何资源升级之前执行升级后post-upgrade:在所有资源升级后执行预回滚pre-rollback:在模板渲染后,在任何资源回滚之前执行回滚后post-rollback:在修改所有资源后执行回滚请求测试test:在调用 Helm test 子命令的时候执行生命周期Hooks 允许开发人员在 release 的生命周期中的一些关键节点执行一些钩子函数,我们正常安装一个 chart 包的时候的生命周期如下所示:用户运行 helm install fooHelm 库文件调用安装 API经过一些验证,Helm 库渲染 foo 模板Helm 库将产生的资源加载到 kubernetes 中去Helm 库将 release 对象和其他数据返回给客户端Helm 客户端退出如果开发人员在 install 的生命周期中定义了两个 hook:pre-install和post-install,那么我们安装一个 chart 包的生命周期就会多一些步骤了:用户运行helm install fooHelm 库文件调用安装 API在 crds/ 目录下面的 CRDs 被安装经过一些验证,Helm 库渲染 foo 模板Helm 库将 hook 资源加载到 kubernetes 中,准备执行pre-install hooksHelm 库会根据权重对 hooks 进行排序(默认分配权重0,权重相同的 hook 按升序排序)Helm 库然后加载最低权重的 hookHelm 库会等待,直到 hook 准备就绪Helm 库将产生的资源加载到 kubernetes 中,注意如果添加了 --wait 参数,Helm 库会等待所有资源都准备好,在这之前不会运行 post-install hookHelm 库执行 post-install hook(加载 hook 资源)Helm 库等待,直到 hook 准备就绪Helm 库将 release 对象和其他数据返回给客户端Helm 客户端退出等待 hook 准备就绪,这是一个阻塞的操作,如果 hook 中声明的是一个 Job 资源,Helm 将等待 Job 成功完成,如果失败,则发布失败,在这个期间,Helm 客户端是处于暂停状态的。对于所有其他类型,只要 kubernetes 将资源标记为加载(添加或更新),资源就被视为就绪状态,当一个 hook 声明了很多资源是,这些资源是被串行执行的。另外需要注意的是 hook 创建的资源不会作为 release 的一部分进行跟踪和管理,一旦 Helm 验证了 hook 已经达到了就绪状态,它就不会去管它了。所以,如果我们在 hook 中创建了资源,那么不能依赖 helm uninstall 去删除资源,因为 hook 创建的资源已经不受控制了,要销毁这些资源,你需要将 helm.sh/hook-delete-policy 这个 annotation 添加到 hook 模板文件中,或者设置 Job 资源的生存(TTL)字段。编写hookHooks 就是 Kubernetes 资源清单文件,在元数据部分带有一些特殊的注解,因为他们是模板文件,所以你可以使用普通模板所有的功能,包括读取 .Values、.Release 和 .Template。例如,在 templates/post-install-job.yaml 文件中声明一个 post-install 的 hook:这个hook以job的形式在安装完成后触发,执行成功就删掉apiVersion: batch/v1 kind: Job metadata: .... annotations: # 因为添加了这个 hook,所以我们这个资源被定义为了 hook # 如果没有这行,则当前这个 Job 会被当成 release 的一部分内容。 "helm.sh/hook": post-install "helm.sh/hook-weight": "-5" "helm.sh/hook-delete-policy": hook-succeeded详细这个模板成为 hook 的原因就是添加这个注解:annotations: "helm.sh/hook": post-install一种资源也可以实现多个 hooks:annotations: "helm.sh/hook": post-install,post-upgrade类似的,实现给定 hook 的资源数量也没有限制,比如可以将 secret 和一个 configmap 都声明为 pre-install hook。当子 chart 声明 hooks 的时候,也会对其进行调用,顶层的 chart 无法禁用子 chart 所声明的 hooks。可以为 hooks 定义权重,这将有助于确定 hooks 的执行顺序:annotations: "helm.sh/hook-weight": "5"hook 权重可以是正数也可以是负数,但是必须用字符串表示,当 Helm 开始执行特定种类的 hooks 的时候,它将以升序的方式对这些 hooks 进行排序。渲染Chart.yamlapiVersion: v1 name: linuxea description: A Helm chart for Kubernetes type: application version: 0.1.2 appVersion: "1.16.0"job.yamlapiVersion: batch/v1 kind: Job metadata: name: "{{ .Release.Name }}" labels: app.kubernetes.io/managed-by: {{ .Release.Service | quote }} app.kubernetes.io/instance: {{ .Release.Name | quote }} app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" annotations: # 因为添加了这个 hook,所以我们这个资源被定义为了 hook # 如果没有这行,则当前这个 Job 会被当成 release 的一部分内容。 "helm.sh/hook": post-install "helm.sh/hook-weight": "-5" "helm.sh/hook-delete-policy": hook-succeeded spec: template: metadata: name: "{{ .Release.Name }}" labels: app.kubernetes.io/managed-by: {{ .Release.Service | quote }} app.kubernetes.io/instance: {{ .Release.Name | quote }} helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" spec: restartPolicy: Never containers: - name: post-install-job image: "alpine:3.3" command: ["/bin/sleep","{{ default "10" .Values.sleepyTime }}"]configmap.yaml{{ $linuxea := .Release.Name -}} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: {{- include "mark.labels" . | indent 4 }} data: token: |- {{ .Files.Get "test3.json" | b64enc }} --- apiVersion: v1 kind: Secret metadata: name: {{ .Release.Name }}-linuxea type: Opaque data: my.cnf: |- {{ .Files.Get "test2.json" | b64enc }}values.yamlmydata: names: marksugar data: hi mark, my www.linuxea.com status: isok mylist: - mark - edwin - sean mychart: mark: "is master chart" global: name: marksugar开始安装PS H:\k8s-1.20.2\helm> helm install mark .\liunuxea\此时打开另外一个终端观察PS C:\WINDOWS\system32> kubectl.exe get pod -w NAME READY STATUS RESTARTS AGE dpment-linuxea-6bdfbd7b77-fr4pn 1/1 Running 16 40d dpment-linuxea-a-5b98f7fb86-9ff2f 1/1 Running 24 52d mark-hlrpf 0/1 ContainerCreating 0 14s nfs-client-provisioner-597f7dd4b-h2nsg 1/1 Running 86 277d testv1-9c974bd5d-gl52m 1/1 Running 16 40d testv2-5767685995-mjd6c 1/1 Running 23 52d traefik-6866c896d5-dqlv6 1/1 Running 16 40d whoami-7d666f84d8-8wmk4 1/1 Running 22 50d whoami-7d666f84d8-vlgb9 1/1 Running 16 40d whoamitcp-744cc4b47-24prx 1/1 Running 16 40d whoamitcp-744cc4b47-xrgqp 1/1 Running 16 40d whoamiudp-58f6cf7b8-b6njt 1/1 Running 16 40d whoamiudp-58f6cf7b8-jnq6c 1/1 Running 22 50d mark-hlrpf 1/1 Running 0 21s mark-hlrpf 0/1 Completed 0 31s mark-hlrpf 0/1 Terminating 0 32s mark-hlrpf 0/1 Terminating 0 32s可以看到执行完成后就被删除了这个job当这里执行完成,渲染也结束PS H:\k8s-1.20.2\helm> helm install mark .\liunuxea\ NAME: mark LAST DEPLOYED: Sun May 15 22:45:38 2022 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: ================================== hello thank you install linuxea describe: $ helm status mark $ helm get mark通过ls查看PS H:\k8s-1.20.2\helm> helm ls NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION mark default 1 2022-05-15 22:45:38.6000054 +0800 CST deployed linuxea-0.1.2 1.16.0查看configmapPS H:\k8s-1.20.2\helm> kubectl.exe get configmap NAME DATA AGE istio-ca-root-cert 1 55d kube-root-ca.crt 1 339d mark-cmp 1 5m50s mark-mychart 2 5m50sdescribe查看内容PS H:\k8s-1.20.2\helm> kubectl.exe describe configmap mark-mychart Name: mark-mychart Namespace: default Labels: app.kubernetes.io/managed-by=Helm Annotations: meta.helm.sh/release-name: mark meta.helm.sh/release-namespace: default Data ==== mychart: ---- is master chart name: ---- marksugar Events: <none> PS H:\k8s-1.20.2\helm> kubectl.exe describe configmap mark-cmp Name: mark-cmp Namespace: default Labels: app=linuxea.com app.kubernetes.io/managed-by=Helm version=v0.1 Annotations: meta.helm.sh/release-name: mark meta.helm.sh/release-namespace: default Data ==== token: ---- bmFtZXM6IDEyMzQ1 Events: <none>hook删除策略还可以定义确定何时删除相应 hook 资源的策略,hook 删除策略可以使用下面的注解进行定义:annotations: "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded我们也可以选择一个或多个已定义的注解:before-hook-creation:运行一个新的 hook 之前删除前面的资源(默认)hook-succeeded:hook 成功执行后删除资源hook-failed:hook 如果执行失败则删除资源如果未指定任何 hook 删除策略注解,则默认情况下会使用 before-hook-creation 策略。
2022年06月05日
2,192 阅读
0 评论
0 点赞
2022-05-10
linuxea:helm3调试和基础函数if/with/range(3)
在开发一个chart的时候就需要对整个模板进行了解,从使用角度来说,是简单的。但是去开发的时候就需要一定的认识才能够完成一个模板的开发。而在其中用的较多的就是内置的一些函数,或者说是对象,通常,在helm的模板变量中,以大写开头的都是系统提供的,这由Go的函数约定。内置对象releaserelease:release是作为顶级对象的,与下面的其他不同的是她是内置函数。字面上release是发布的意思,这个对象描述了也是关于发布的一些信息,如下:Release.Name: 顾名思义,release名称Release.Namespace: release名称空间Release.IsUpgrade: release当在升级或者回滚的时候,值为trueRelease.IsInstall: 如果当前是安装则为trueRelease.Revision: release版本号,第一次安装是1,升级和回滚都会增加Release.Service: 渲染helm的服务values.yaml除此之外,还有values.yaml,这个文件的提供信息是传递到values的,而默认情况下是空的, 所以我们可以进去定制。values.yaml也是用的最多的文件Chart.yaml而chart.yaml的内容的值最终是被渲染到helm中的,这些使用helm ls的时候就可以看到,比如name和version等,这些信息可以进行定制值name: linuea Version: 1.1.1渲染后就变成了linuxea-1.1.1FilesFiles可以访问chart的非特殊文件,无法访问模板,提供以下参数Files.Get 或许文件,如: .Files.Get confuig.iniFiles.GetBytes 以bytes数组获取文件内函数Files.Glob 用于返回名称给到shell glob模式匹配的文件列表Files.Lines 逐行读取文件的函数,遍历每行内容Files.Assecrets 以Base64编码字符串返回Files.AsConfig 以yaml字典返回CapabilitiesCapabilities用于获取与kubernetes集群支持功能信息的对象Capabilities.APIVersion: 支持的版本Capabilities.APIVersion.Has.version 判断版本或者资源是否可用Capabilities.Kube.Version k8s版本,同时也是Capabilities.Kube 的缩写Capabilities.Kube.Major k8s主版本Capabilities.Kube.Minor k8s次版本TemplateTemplate包含当前正在执行的模板信息Name: 当前模板文件路径BasePath: 当前chart模板目录的路径创建chart使用create就可以进行创建,helm create --help可以看到帮助信息中有想要的参数,直接创建的将会是一个nginx的Deployment的yaml的清单,尝试创建即可helm create linuxea[root@linuxea.com /data/helm/mysql]# helm create linuxea WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config Creating linuxea目录结构如下[root@linuxea.com /data/helm/mysql]# tree linuxea/ linuxea/ ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml 3 directories, 10 filesvalues.yaml实际上我们不需要创建的这些文件,只需要一个目录结构即可,最重要的是values.yaml这个文件可以使用-f传递给helm install或helm upgradehelm install -f values.yaml linuxea再者,使用--set传递各个参数helm install --set image=123 linuxeavalues.yaml的是被用来渲染模板,而--set的值是优先于values.yaml的,因此--set可以覆盖values.yaml的值既然默认创建的chart并不是期望的,可以删除模板文件和vlaues.yaml的内容,或者手动创建目录结构即可手动创建目录mkdir -p liunuxea/{templates,charts} touch values.yaml liunuxea/ touch configmap.yaml liunuxea/templates/configmap.yamlcat > liunuxea/Chart.yaml << EOF apiVersion: v2 name: linuxea description: A Helm chart for Kubernetes type: application version: 0.1.0 appVersion: "1.16.0" EOF结构如下[root@linuxea.com /data/helm/mysql]# tree liunuxea/ liunuxea/ ├── charts ├── Chart.yaml ├── templates │ └── configmap.yaml └── values.yaml 2 directories, 3 files示例1此时渲染一个参数的值,比如,有一个configmapapiVersion: v1 kind: ConfigMap metadata: name: linuxea-cmp labels: app: linuxea-cmp data: test: 这里的test是空的,在values.yaml中定义一行mydata: hi mark, my www.linuxea.com而现在要想在configmap中使用values.yaml的mydata,就需要使用{{ .Vaules }}来使用apiVersion: v1 kind: ConfigMap metadata: name: linuxea-cmp labels: app: linuxea-cmp data: test: {{ .Values.mydata }}{{ .Values.mydata }}这种方式是go的模板方式helm使用template可以进行渲染,直接在windows就可以渲染模板以共查看PS H:\k8s-1.20.2\helm> helm.exe template test .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: linuxea-cmp labels: app: linuxea-cmp data: test: hi mark, my www.linuxea.com除此之外,当我们输入的是test的时候,我们希望test被替换城什么值的时候就可以使用Release比如,Release.NameapiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: test: {{ .Values.mydata }}这次chart名称换 marksugarhelm.exe template marksugar .\liunuxea\PS H:\k8s-1.20.2\helm> helm.exe template marksugar .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: marksugar-cmp labels: app: marksugar-cmp data: test: hi mark, my www.linuxea.com这里引用{{ .Release.Name }}的地方就被替换城了marksugar--set除此之外,还可以使用helm的--set来覆盖 --set mydata=linuxea.comPS H:\k8s-1.20.2\helm> helm.exe template marksugar --set mydata=linuxea.com .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: marksugar-cmp labels: app: marksugar-cmp data: test: linuxea.com--dry-runtemplate只是用来本地模板渲染,但是--dry-run是用来模拟安装,这两个在调试的时候有一些差别,--dry-run也可以使用--debughelm install marksugar --dry-run --set mydata=linuxea.com liunuxea/如下[root@linuxea.com /data/helm]# helm install marksugar --dry-run --set mydata=linuxea.com liunuxea/ WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config NAME: marksugar LAST DEPLOYED: Sat Apr 16 02:09:37 2022 NAMESPACE: default STATUS: pending-install REVISION: 1 TEST SUITE: None HOOKS: MANIFEST: --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: marksugar-cmp labels: app: marksugar-cmp data: test: linuxea.com示例2而values.yaml有多个值的时候,如mydata: names: linuxea data: hi mark, my www.linuxea.com引用的时候就发生了变化apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names }} test: {{ .Values.mydata.data }}本地渲染PS H:\k8s-1.20.2\helm> helm.exe template marksugar .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: marksugar-cmp labels: app: marksugar-cmp data: name: linuxea test: hi mark, my www.linuxea.com--set覆盖也是一样PS H:\k8s-1.20.2\helm> helm.exe template marksugar --set mydata.data=linuxea.com .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: marksugar-cmp labels: app: marksugar-cmp data: name: linuxea test: linuxea.com基本语法函数和管道函数values.yaml有些托拉,有时候更希望有一些函数更快的方式转换来提供数据,而这些函数大多数都由golang的template提供。这里面包含了一些逻辑和运算。另外,还有一些模板在sprig的包,如日期,时间等。阅读模板函数能更快了解quote: 转换成字符串,加上双引号upper: 转换大写with: 作用域.Values中的点(.)其实就是作用域。而with可以控制变量的作用域并且重新使用,调用就是对当前作用域的引用,.values是在当前作用域下查找values对象indent: 空格indent的用户是要顶行进行配置,比如想让test: ok前有两个空格,如下data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} status: ok namestatus: "true" defaultstaus: true {{ indent 2 "test: ok" }}管道管道非常常用,并没有什么特别的区别参数 | 函数 参数 | 函数 | 函数2如上:转换字符串的话{{ .Values.mydata.name | quote | upper }} {{ .Values.mydata.name | upper | quote }}repeat : repeat COUNT STRING 将字符串重复多少次如下apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names }} test: {{ .Values.mydata.data | upper | repeat 5 }}渲染PS H:\k8s-1.20.2\helm> helm.exe template marksugar .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: marksugar-cmp labels: app: marksugar-cmp data: name: linuxea test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMdefault : 如果没有给定参数就使用默认参数这个在shell中也很常用,在helm也非常常用,特别是在你的values.yaml中不能使用一个静态配置的时候,default就排上用场了举个例子,如果names变量为空,就默认赋值supperapiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }}values.yaml中把值删掉mydata: names: data: hi mark, my www.linuxea.com渲染下PS H:\k8s-1.20.2\helm> helm.exe template marksugar .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: marksugar-cmp labels: app: marksugar-cmp data: name: supper test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMprintfprintf和在go中的printf类似,用来打印字符串或者其他的数组,如下test: {{ .Vaules.test | default (printf "%s-1" (include "test" ))}}条件语句流程控制在go template中也是非常重要的一部分,和大多数判断语法一样,不但如此,还有一些声明和命名模板的操作,如下:if/else 条件with 作用域范围range 遍历的一种,类似与for eachdefine 在模板内声明新的命名模板template 导入一个命名模板blok 声明特殊的可填充模块区域if/else if 条件判断不管是在什么语言类型中,都是有一个结束标记的,而在helm中使用的是end结束{{ if TEST }} test {{ else if TEST2 }} test2 {{ elese }} default test {{ end }}如果test为真则test,如果test为test2则test2,否则defalut test判断的是管道而非values值,这里控制结构可以执行这个判断语句管道,而不仅仅是一个值,如果结果是如下几项,则为false,否则则是true:布尔 false0空字符串nil或者null空的集合,如map,slice,tuple,dict,array示例1 if以上个configmap为例,如果此时希望用一个判断语句来确定是否添加一个字段的话,就可以使用if来进行操作{{ if eq .Values.mydata.status "isok" }}status: ok{{ end }}如果此时使用的是换行的if,如{{ if eq .Values.mydata.status "isok" }} status: ok {{ end }}那么很有可能不在一行,解决这个问题的版本是加一个--是用来删除if之后和end之前的空格的,不可以加载if之前,加在前面就跳到上一行了{{ if eq .Values.mydata.status "isok" -}} status: ok {{- end }}如果Values.mydata.status等于"isok",就添加status: okapiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ if eq .Values.mydata.status "isok" }}status: ok{{ end }}values.yamlmydata: names: marksugar data: hi mark, my www.linuxea.com status: isok渲染PS H:\k8s-1.20.2\helm> helm.exe template marksugar .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: marksugar-cmp labels: app: marksugar-cmp data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM status: okelse if除此之外,还可以进行嵌套else {{ if eq .Values.mydata.status "isok" -}} status: ok {{ else if eq .Values.mydata.names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }}如果等于isok,就结束,否则就继续判断第二个else if,如果第二个else if等于marksugar就结束,否则就else的默认值。如下NAME -}}{{- NAME这里的-号是删除空格的意思apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ if eq .Values.mydata.status "isok" -}} status: ok {{ else if eq .Values.mydata.names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }}执行PS H:\k8s-1.20.2\helm> helm template .\liunuxea\ --- # Source: linuxea/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: release-name-cmp labels: app: release-name-cmp data: name: marksugar test: HI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COMHI MARK, MY WWW.LINUXEA.COM status: ok由于第一个if执行完成就是true,逻辑结束示例2 with上述的.Values是对当前模板引擎下的作用域内查找.vaules对象,而with是控制变量的作用域,并且和if语句类似with中默认是不能使用内置的函数,比如:.Release.Name之类的,如果要使用,需要另外的办法使用示例1的文件重新配置。如下 {{ with .Values.mydata -}} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }}一旦 {{ with .Values.mydata -}}配置之后,在whth中,就不在使用.Vaules.mydata.names来调用了,而是.namesapiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-cmp labels: app: {{ .Release.Name }}-cmp data: name: {{ .Values.mydata.names | default "supper" }} test: {{ .Values.mydata.data | upper | repeat 5 }} {{ with .Values.mydata -}} {{ if eq .status "isok" -}} status: ok {{- else if eq .names "marksugar" -}} namestatus: "true" {{ else -}} defaultstaus: true {{- end }} {{- end }} {{ indent 2 "test: ok" }}示例3 range通过在helm中使用range来遍历,比如使用range遍历一个列表或者字典首先定义一个列表mylistmylist: - mark - edwin - sean 而后使用range mylist: |- {{- range .Values.mylist }} - {{ . | title | quote }} {{- end }}这里的|-的作用,|是将以下的数据放在一个字符串中,如果不加|就不是一个字符串了。而-是换行而这里的.的作用域是在range中的,作用域与range开始,end结束|-和|+|-:|-的意思是将文末的换行符删掉|+|+的意思是将文末的换行符保留参考helm3的简单使用(1)helm3模板渲染(2)kubernetes helm概述(49)kubernetes helm简单使用(50)kubernetes 了解chart(51)kubernetes helm安装efk(52)
2022年05月10日
2,313 阅读
0 评论
0 点赞
2022-05-01
linuxea:helm3模板渲染(2)
helm说白了其实就是一个模板渲染系统,核心就在templates和values,模板使用了go template编写的,并且增加了sprig库,共计50个左右的附加模板函数和其他的一些函数。如果要进行使用,必然要遵循template的模板的约定),比如{{ if pipeline }} T1 {{ else }} {{ if pipeline }} T0 {{end}} { end} {{ range pipeline }} T1 {{ end }}if或者range开头的都需要end结尾,并且可以指定引用a模板{{ templete "a" }}这些,可以在go文档库中找到,但是这些还不够,sprig还能解决一些大小写等的问题。除此之外,helm的docs中也有自己的一些函数。而这些模板存储在templates目录下, 当helm渲染charts,就会通过模板引擎传递目录中文件,而values可以通过两种方式提供:Chart 开发人员可以在 chart 内部提供一个名为 values.yaml 的文件,该文件可以包含默认的 values 值内容。Chart 用户可以提供包含 values 值的 YAML 文件,可以在命令行中通过 helm install 来指定该文件。当用户提供自定义 values 值的时候,这些值将覆盖 chart 中 values.yaml 文件中的相应的值。简单示例mysql的包,目录结构如下[root@linuxea.com /data/helm/mysql]# tree ./ ./ ├── Chart.yaml ├── README.md ├── templates │ ├── configurationFiles-configmap.yaml │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── initializationFiles-configmap.yaml │ ├── NOTES.txt │ ├── pvc.yaml │ ├── secrets.yaml │ ├── serviceaccount.yaml │ ├── servicemonitor.yaml │ ├── svc.yaml │ └── tests │ ├── test-configmap.yaml │ └── test.yaml └── values.yaml 2 directories, 15 files打开svc.conf你会看到如下的格式,这种就是template的样式,这些值是通过value来进行替换成value中的值[root@linuxea.com /data/helm/mysql]# cat templates/svc.yaml apiVersion: v1 kind: Service metadata: name: {{ template "mysql.fullname" . }} namespace: {{ .Release.Namespace }} labels: app: {{ template "mysql.fullname" . }} chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" release: "{{ .Release.Name }}" heritage: "{{ .Release.Service }}" annotations: {{- if .Values.service.annotations }} {{ toYaml .Values.service.annotations | indent 4 }} {{- end }} {{- if and (.Values.metrics.enabled) (.Values.metrics.annotations) }} {{ toYaml .Values.metrics.annotations | indent 4 }} {{- end }} spec: type: {{ .Values.service.type }} {{- if (and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP))) }} loadBalancerIP: {{ .Values.service.loadBalancerIP }} {{- end }} ports: - name: mysql port: {{ .Values.service.port }} targetPort: mysql {{- if .Values.service.nodePort }} nodePort: {{ .Values.service.nodePort }} {{- end }} {{- if .Values.mysqlx.port.enabled }} - name: mysqlx port: 33060 targetPort: mysqlx protocol: TCP {{- end }} {{- if .Values.metrics.enabled }} - name: metrics port: 9104 targetPort: metrics {{- end }} selector: app: {{ template "mysql.fullname" . }} 以上面port: {{ .Values.service.port }}为例 ,values.yaml的值如下,意思就是替换城3306端口service: annotations: {} type: ClusterIP port: 3306而这种方式也可以通过--set 来进行替换预定义 Values在模板中用 .Values 可以获取到 values.yaml 文件(或者 --set 参数)提供的 values 值,此外,还可以在模板中访问其他预定义的数据。预定义可用于每个模板、并且不能被覆盖的 values 值,与所有 values 值一样,名称都是区分大小写的,而预定义的都是大写开头的,如下的values都可以在模板中获取到Release.Name:release 的名称(不是 chart),通过helm ls查看到的Release.Namespace:release 被安装到的命名空间Release.Service:渲染当前模板的服务,在 Helm 上,实际上该值始终为 HelmRelease.IsUpgrade:如果当前操作是升级或回滚,则该值为 trueRelease.IsInstall:如果当前操作是安装,则该值为 trueChart:Chart.yaml 文件的内容,可以通过 Chart.Version 来获得 Chart 的版本,通过 Chart.Maintainers 可以获取维护者信息Files: 一个包含 chart 中所有非特殊文件的 map 对象,这不会给你访问模板的权限,但是会给你访问存在的其他文件的权限(除非使用 .helmignore 排除它们),可以使用 {{ index .Files "file.name" }} 或者 {{ .Files.Get name }} 或者 {{ .Files.GetString name }} 函数来访问文件,你还可以使用 {{ .Files.GetBytes }} 以 []byte 的形式获取访问文件的内容Capabilities:也是一个类 map 的对象,其中包含有关 Kubernetes 版本({{ .Capabilities.KubeVersion }})和支持的 Kubernetes API 版本({{ .Capabilities.APIVersions.Has "batch/v1" }})信息。常被用来判断版本信息等注意任何未知的 Chart.yaml 字段都会被删除,在 Chart 对象内部无法访问他们,所以,Chart.yaml 不能用于将任意结构化的数据传递到模板中,但是可以使用 values 文件来传递。模板渲染当我们有一些模板是想渲染而不是执行到kubernetes的时候,就可以使用templatehelm template mysql stable/mysqlhelm install只是将上面的渲染直接安装了而已除次之外,也可以使用--dry-run --debug来查看整个渲染和执行的过程helm install --dry-run --debug mysql123 stable/mysql当然,他们都不会真的运行CRDhelm3中, 当定义后,CRD被使用之前都会先安装CRD目录下所有的CRD,而这些CRD不能使用模板。而一旦CRD被使用,就会等到CRD安装成功,否则是不会渲染模板并安装的因为CRD是全局安装的,所以在卸载的时候需要手动去卸载,并且CRD只有在安装操作的时候才会被创建,如果helm中的CRDS已经存在,且无论是什么版本,helm都不会重新安装或者升级。而一旦删除CRD,将会自动删除集群中所有namespace的CRD
2022年05月01日
1,921 阅读
0 评论
0 点赞
2022-04-22
linuxea:helm3的简单使用(1)
无论是debian还是redhat,亦或者其他linux发行版,都有一个包管理用来解决依赖问题,而在kubernetes中,helm是用来管理kubernetes应用程序,其中charts是可以定义一个可以进行安装升级的应用程序,同时也容易创建起来,并且进行版本管理。而在越复杂的应用程序来讲,helm可以作为一个开箱即用的,单单从使用角度来看,类似于yum或者apt的,使用起来,会更加流行。比如:我们创建一个应用程序,控制器使用deployment,同时需要一个service和关联其他的对象,并且还需配置一个ingress配置域名等作为入口,还可能需要部署一个有状态的,类似mysql的后端数据存储等等。这些如果需要一个个去安装维护将会麻烦很多,特别对于一个使用者来讲,更多时候,无需关注里面发生了什么,而更多的时候只想拿来即用的,helm就是用来打包这些程序。一个流行kubernetes生态的组件库中,你会发现必然会提供一个helm的方式。这正是因为helm的特色,得益于这种的易用性使得helm愈发的普及。作为一个charts提供的参数,对其中的内容进行渲染,从而生成yaml文件,安装到kubernetes中。helm就是解决这些事情的除此之外,我们还有一个kustomize也可以进行配置清单管理,kustomize解决的是另外一个问题,有机会在写这个kustomize。而helm2和helm3是有些不同的。安装helm是读取kubeconfig文件来访问集群的,因此,你至少能够使用kubectl访问集群才能使用helm在使用版本上v3版本比v2更好用一些,简化了集群内的一个服务换城了kubernetes CRD, 在v2中需要大量的权限控制,这样也会带来一个安全问题,而在v3中变成了一个客户端, 因此,我们使用v3稳定版本即可如果需要了解更多的概念,可以参考helm2的时候的一些文章对于helm2,可以查看如下kubernetes helm概述(49)kubernetes helm简单使用(50)kubernetes 了解chart(51)kubernetes helm安装efk(52)在helm的github下载对应系统的版本,比如:3.8.1的amd版本wget https://get.helm.sh/helm-v3.8.1-linux-amd64.tar.gz tar xf helm-v3.8.1-linux-amd64.tar.gz cp helm /usr/local/sbin/查看版本信息这里温馨的提示说我们的配置文件的权限太高# helm version WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config version.BuildInfo{Version:"v3.8.1", GitCommit:"5cb9af4b1b271d11d7a97a71df3ac337dd94ad37", GitTreeState:"clean", GoVersion:"go1.17.5"}常用的命令- helm search: 搜索以恶个 charts - helm pull: 下载 chart - helm install: 安装到 Kubernetes - helm list: 查看 chartshelm installhelm install可以通过多个源进行安卓,大致如下chart仓库本地chart压缩包本地解开的压缩包的目录中的路径在线url总之要能够访问的到,首先通过在线安装1.添加chart仓库源我们需要安装一个chart源来使用,这类似于yum的源一样,我们使用azure的仓库helm repo add stable http://mirror.azure.cn/kubernetes/charts/ helm repo list[root@linuxea.com ~]# helm repo add stable "stable" has been added to your repositories [root@linuxea.com ~]# helm repo list NAME URL stable http://mirror.azure.cn/kubernetes/charts/我们可以使用 helm search repo stable查看当前的包于此同时,使用helm repo update更新到最新的状态[root@linuxea.com ~]# helm repo update WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "stable" chart repository Update Complete. ⎈Happy Helming!⎈ [root@linuxea.com ~]# helm search repo stable WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config NAME CHART VERSION APP VERSION DESCRIPTION stable/acs-engine-autoscaler 2.2.2 2.1.1 DEPRECATED Scales worker nodes within agent pools stable/aerospike 0.3.5 v4.5.0.5 DEPRECATED A Helm chart for Aerospike in Kubern... stable/airflow 7.13.3 1.10.12 DEPRECATED - please use: https://github.com/air... stable/ambassador 5.3.2 0.86.1 DEPRECATED A Helm chart for Datawire Ambassador stable/anchore-engine 1.7.0 0.7.3 Anchore container analysis and policy evaluatio... stable/apm-server 2.1.7 7.0.0 DEPRECATED The server receives data from the El... stable/ark 4.2.2 0.10.2 DEPRECATED A Helm chart for ark stable/artifactory 7.3.2 6.1.0 DEPRECATED Universal Repository Manager support... stable/artifactory-ha 0.4.2 6.2.0 DEPRECATED Universal Repository Manager support... stable/atlantis 3.12.4 v0.14.0 DEPRECATED A Helm chart for Atlantis https://ww... ......2.安装 chart安装一个mysql,在安装之前我们可以show一下 helm show chart stable/mysql查看它的版本号等信息更详细的信息可以通过helm show all stable/mysql ,all来查看[root@linuxea.com ~]# helm show chart stable/mysql WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config apiVersion: v1 appVersion: 5.7.30 deprecated: true description: DEPRECATED - Fast, reliable, scalable, and easy to use open-source relational database system. home: https://www.mysql.com/ icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png keywords: - mysql - database - sql name: mysql sources: - https://github.com/kubernetes/charts - https://github.com/docker-library/mysql version: 1.6.9安装--generate-name生成一个名称# helm install stable/mysql --generate-name WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config WARNING: This chart is deprecated NAME: mysql-1649580933 LAST DEPLOYED: Sun Apr 10 04:55:35 2022 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: MySQL can be accessed via port 3306 on the following DNS name from within your cluster: mysql-1649580933.default.svc.cluster.local To get your root password run: MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql-1649580933 -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) To connect to your database: 1. Run an Ubuntu pod that you can use as a client: kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il 2. Install the mysql client: $ apt-get update && apt-get install mysql-client -y 3. Connect using the mysql cli, then provide your password: $ mysql -h mysql-1649580933 -p To connect to your database directly from outside the K8s cluster: MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 # Execute the following command to route the connection: kubectl port-forward svc/mysql-1649580933 3306 mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}而后我们可以观察到pod的状态[root@linuxea.com ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ... mysql-1649580933-8466b76578-gphkp 0/1 Pending 0 106s <none> <none> <none> <none> ...和svc[root@linuxea.com ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ... mysql-1649580933 ClusterIP 10.68.106.229 <none> 3306/TCP 2m23s ...以及一个pvc[root@linuxea.com ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-1649580933 Pending 4m33s一旦安装完成可以通过ls查看她的版本[root@linuxea.com ~]# helm ls WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION mysql-1649580933 default 1 2022-04-10 04:55:35.427415297 -0400 EDT deployed mysql-1.6.9 5.7.30 当我们能看到这个name的时候,就可以使用uninstall删除uninstalll 会删除这个包下的所有相关的这个包的资源。同时,可以使用--keep-history参数保留release的记录而使用了--keep-history的时候就可以使用helm ls -a查看被卸载掉的记录[root@linuxea.com ~]# helm uninstall mysql-1649580933 WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config release "mysql-1649580933" uninstalled参数配置如果直接install是默认的配置,但是更多时候,我们需要调整一下配置的参数,比如类似于端口等其他的选项参数,当然,这些参数必须是可以配置的的,一旦配置后,就会覆盖掉默认的值,通过helm show values来查看这些参数[root@linuxea.com ~]# helm show values stable/mysql比如配置密码,初始化,参数,调度,容忍,是否持久化等等。既然,我们要修改这些参数,那就需要一个覆盖的文件来进行操作,于是,创建一个文件,比如mvalule.yaml,在文件中配置想要修改的值, 如下指定用户和密码,并创建一个linuea的库,并且不进行数据持久化mysqlUser: linuxea mysqlPassword: linuxea.com mysqlDatabase: linuxea persistence: enabled: false而后只需要指定这个配置文件即可当你不使用 --generate-name的时候,只需要指定名称即可helm install mysql -f mvalule.yaml stable/mysql[root@linuxea.com /data/helm]# helm install -f mvalule.yaml stable/mysql --generate-name WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config WARNING: This chart is deprecated NAME: mysql-1649582722 LAST DEPLOYED: Sun Apr 10 05:25:23 2022 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: MySQL can be accessed via port 3306 on the following DNS name from within your cluster: mysql-1649582722.default.svc.cluster.local To get your root password run: MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql-1649582722 -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) To connect to your database: 1. Run an Ubuntu pod that you can use as a client: kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il .....此时,可以通过kubectl describe 来查看传入的变量[root@linuxea.com ~]# kubectl describe pod mysql-1649582722-dbcdcb895-tjvsr Name: mysql-1649582722-dbcdcb895-tjvsr Namespace: default .... Environment: MYSQL_ROOT_PASSWORD: <set to the key 'mysql-root-password' in secret 'mysql-1649582722'> Optional: false MYSQL_PASSWORD: <set to the key 'mysql-password' in secret 'mysql-1649582722'> Optional: false MYSQL_USER: linuxea MYSQL_DATABASE: linuxea ...pod启动完成,我们通过上面的提示进入到mysql[root@linuxea.com /data/helm]# MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql-1649582722 -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) [root@linuxea.com /data/helm]# echo $MYSQL_ROOT_PASSWORD 8FFSmw66je [root@linuxea.com /data/helm]# kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il If you don't see a command prompt, try pressing enter. root@ubuntu:/# root@ubuntu:/# apt-get update && apt-get install mysql-client -y ... Setting up mysql-client-5.7 (5.7.33-0ubuntu0.16.04.1) ... Setting up mysql-client (5.7.33-0ubuntu0.16.04.1) ... Processing triggers for libc-bin (2.23-0ubuntu11.3) ... ... root@ubuntu:/# mysql -h mysql-1649582722 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 5.7.30 MySQL Community Server (GPL) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | linuxea | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> 环境变量基本上使用两种方式来传递配置信息:value那么除了使用value 或者-f指定yaml文件来覆盖values的值外,还可以指定多个值set直接在命令行指定需要覆盖的配置,但是对于深度嵌套的不建议使用--set通常--set优先于-f,-f将值持久化在configmap中如果我们使用--value配置文件已经配置了enabled: false,同时有配置了--set persistence.enabled: true, 而此时的enabled是等于true的,--set优先于--value对于value可以通过get value查看[root@linuxea.com /data/helm]# helm get values mysql-1649582722 WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config USER-SUPPLIED VALUES: mysqlDatabase: linuxea mysqlPassword: linuxea.com mysqlUser: linuxea persistence: enabled: false对于一个已经运行的chart而言,使用helm upgrade来更新,或者使用--reset来删除--set--set可以接受0个或者多个键值对,最直接的常用的修改镜像,就是--set image:11,而对于多个,使用逗号隔开即可--set name:linuxea,image:11,如果在yaml文件中就换行,如下name: linuxea image: 11如果参数配置中所示,假如我们要修改的是mysql的参数[root@linuxea.com /data/helm]# cat mvalule.yaml mysqlUser: linuxea mysqlPassword: linuxea.com mysqlDatabase: linuxea persistence: enabled: false两种方式sethelm install mysql -f mvalule.yaml stable/mysql --set mysqlUser:linuxea,mysqlPassword:linuxea.com,mysqlDatabase:linuxea,persistence.enabled:false对于有换行的空格,使用.来拼接, persistence.enabled:false对应如下persistence: enabled: false其他1,如果有更多的参数,比如:--set args={run,/bin/start,--devel}args: - run - /bin/start - --devel2,除此之外,我们可以借用索引的方式,如下metadata: name: etcd-k8s namespace: monitoring这样的话,就变成了metadata[0].name=etcd-k8s,metadata[0].namespace=monitoring3,对于特殊字符可以使用反斜杠和双引号来做name: "a,b"这样的set明天就变成了--set name=a\,b4,其他包含反斜杠的nodeSelector: kubernetes.io/role: master这时候的--set就需要转义:--set nodeSelector."kubernetes\.io/role"=master本地安装通过fetch可以将chart放到本地[root@linuxea.com /data/helm]# helm fetch stable/mysql WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config [root@linuxea.com /data/helm]# ls mysql-1.6.9.tgz -ll -rw-r--r-- 1 root root 11589 Apr 10 06:14 mysql-1.6.9.tgz而后就可以直接使用helm安装[root@linuxea.com /data/helm]# helm install mysql mysql-1.6.9.tgz 或者解压[root@linuxea.com /data/helm]# tar xf mysql-1.6.9.tgz [root@linuxea.com /data/helm]# ls mysql Chart.yaml README.md templates values.yaml [root@linuxea.com /data/helm]# tree mysql mysql ├── Chart.yaml ├── README.md ├── templates │ ├── configurationFiles-configmap.yaml │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── initializationFiles-configmap.yaml │ ├── NOTES.txt │ ├── pvc.yaml │ ├── secrets.yaml │ ├── serviceaccount.yaml │ ├── servicemonitor.yaml │ ├── svc.yaml │ └── tests │ ├── test-configmap.yaml │ └── test.yaml └── values.yaml 2 directories, 15 files安装[root@linuxea.com /data/helm]# helm install mysql ./mysql升级与回滚helm的upgrade命令会更新你提供的信息,并且只会更新上一个版本,这种较小的更新更快捷每,进行一次upgrade都会生成新的配置版本,比如secret,默认似乎有15个版本,这将会是一个问题。添加一个mysqlRootPassword: www.linuxea.com 进行upgrademysqlUser: linuxea mysqlPassword: linuxea.com mysqlDatabase: linuxea mysqlRootPassword: www.linuxea.com persistence: enabled: falseupgradehelm upgrade mysql-1649582722 stable/mysql -f mvalule.yaml如下[root@linuxea.com /data/helm]# helm upgrade mysql-1649582722 stable/mysql -f mvalule.yaml WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config WARNING: This chart is deprecated Release "mysql-1649582722" has been upgraded. Happy Helming! NAME: mysql-1649582722 LAST DEPLOYED: Sun Apr 10 06:29:00 2022 NAMESPACE: default STATUS: deployed REVISION: 2 NOTES: MySQL can be accessed via port 3306 on the following DNS name from within your cluster: mysql-1649582722.default.svc.cluster.local ...更新完成后REVISION已经变成2了通过helm ls查看[root@linuxea.com /data/helm]# helm ls WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION mysql-1649582722 default 2 2022-04-10 06:29:00.717252842 -0400 EDT deployed mysql-1.6.9 5.7.30 而后可以通过helm get values mysql-1649582722 查看[root@linuxea.com /data/helm]# helm get values mysql-1649582722 WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config USER-SUPPLIED VALUES: mysqlDatabase: linuxea mysqlPassword: linuxea.com mysqlRootPassword: www.linuxea.com mysqlUser: linuxea persistence: enabled: false此时的mysql的新密码已经更新到secret,但是并没有在mysql生效的 ,我们就进行回滚下[root@linuxea.com /data/helm]# kubectl get secret --namespace default mysql-1649582722 -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo www.linuxea.comrollbackls查看helm的名称[root@linuxea.com /data/helm]# helm ls WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION mysql-1649582722 default 2 2022-04-10 06:29:00.717252842 -0400 EDT deployed mysql-1.6.9 5.7.30 查看mysql-1649582722历史版本[root@linuxea.com /data/helm]# helm history mysql-1649582722 WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Sun Apr 10 05:25:23 2022 superseded mysql-1.6.9 5.7.30 Install complete 2 Sun Apr 10 06:29:00 2022 deployed mysql-1.6.9 5.7.30 Upgrade complete进行rollback[root@linuxea.com /data/helm]# helm rollback mysql-1649582722 1 WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config Rollback was a success! Happy Helming!在来查看values[root@linuxea.com /data/helm]# helm get values mysql-1649582722 WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config USER-SUPPLIED VALUES: mysqlDatabase: linuxea mysqlPassword: linuxea.com mysqlUser: linuxea persistence: enabled: false在查看密码[root@linuxea.com /data/helm]# kubectl get secret --namespace default mysql-1649582722 -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo 8FFSmw66je而现在的history就是三个版本了[root@linuxea.com /data/helm]# helm history mysql-1649582722 WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Sun Apr 10 05:25:23 2022 superseded mysql-1.6.9 5.7.30 Install complete 2 Sun Apr 10 06:29:00 2022 superseded mysql-1.6.9 5.7.30 Upgrade complete 3 Sun Apr 10 06:39:44 2022 deployed mysql-1.6.9 5.7.30 Rollback to 1 这是因为版本是一直在新增,而3的版本就是回滚到1了,Rollback to 1 其他参数在整个helm中有一些非常有意思且重要的参数,比如常见的install和upgrade,当我们不确定一个程序是否被安装的时候,我们就需要安装,否则就是更新,于是可以使用upgrade --install,一般而言,我们可能还需要一个名称空间,那么就有了另外一个参数--create-namesapce,如果不存在就创建helm upgrade --install --create-namespace --namespace linuxea hmysql ./mysql如果名称空间不存在就创建,如果mysql没有install就install,否则就upgrade同时,当helm执行完成后, list列表中的状态已经为deployed,但是并不能说明pod已经装备好了,这两者之间并没有直接关系的,此时需要一些配置参数辅助--wait等待所有pod就绪,包含共享存储的pvc,就绪状态准备情况,以及svc,如果超过五分钟,这个版本就会标记失败-- timeout等待kubernetes命令完成,默认五分钟--no-hooks跳过命令的运行的hooks--recreate-pods仅适用于upgrade和rollback,在helm3中这个标志将导致重新创建所有的pod参考kubernetes helm概述(49)kubernetes helm简单使用(50)kubernetes 了解chart(51)kubernetes helm安装efk(52)
2022年04月22日
2,030 阅读
0 评论
0 点赞