一、helm简介
什么是helm? Helm为团队提供了在Kubernetes内部创建、安装和管理应用程序时需要协作的工具。 Helm的主要功能有:
查找要安装和使用的预打包软件(Chart);
轻松创建和托管自己的软件包;
将软件包安装到任何K8s集群中;
查询集群已安装和正在运行的程序包;
更新、删除、回滚或查看已安装软件包的历史记录;
...
总的来说,通过Helm可以轻松在Kubernetes中运行应用程序。 Helm 3以Helm 2的核心功能为基础,对Chart repo、发行版管理、安全性和library Charts进行了改进。 相比Helm 2,Helm 3最明显的变化是Tiller的删除,它新增丰富功能,某些功能已被弃用或重构,与Helm 2不再兼容。此外,Helm 3还引入了一些新的实验功能,包括OCI支持。 Helm Go SDK已重构为通用,目标是共享和重用Go社区开源代码。 Helm 3的新变化 Helm 2描述了用于创建、安装和管理Chart的工作流程。Helm 3建立在该工作流程的基础上,更改了基础架构,以满足不断发展的生态系统的需求。 1.移除Tiller 在Helm 2开发周期中,Helm团队引入了Tiller。它使多个不同的操作员可以与同一组发行版进行交互,对于在共享集群中工作的团队非常有用。但Kubernetes v1.6默认启用基于角色的访问控制(RBAC),这之后在生产环境中用Tiller会变得难以管理。同时出于安全策略考虑,Helm 3移除了Tiller,安全模型从根本上得以简化。 2.三方战略合并补丁 Helm 2使用双向战略合并补丁,在升级过程中,它会比较最新Chart清单与建议Chart清单的差异,以确定需要对Kubernetes中的资源进行哪些更改。 在Helm 3中,它现在使用三向战略合并补丁。生成补丁时,Helm会考虑旧清单、当前状态和新清单,充分保障资源能回滚到以前的状态。 3.Release Names现在位于命名空间 随着Tiller的删除,在Helm 3中,有关特定版本的版本信息现在存储在与版本本身相同的命名空间中。 4.Secrets作为默认存储驱动程序 Helm 2默认情况下使用ConfigMaps存储发行信息。在Helm 3中,现在将Secrets用作默认存储驱动程序。 5.Go导入路径更改 在Helm 3中,它将Go导入路径从k8s.io/helm切换为/helm/v3。 6.使用JSON Schema验证Chart值 Helm现在可以将JSON Schema强加于Chart值。这样可以确保用户提供的值遵循Chart维护者设计的架构,当用户为Chart提供一组错误值时,它能提供更好的错误报告。 7.合并 Chart依赖关系管理系统已从requirements.yaml和requirements.lock移至Chart.yaml和Chart.lock。 8.安装时现在需要名称 在Helm 2中,如果未提供名称,它会给出一个自动生成的名称。但在Helm 3中,如果未提供名称,则会引发错误。 9.将Chart推送到OCI注册中心 对于Chart的远程托管,Helm 3希望实现Docker Registry那样的功能,借助OCI Registry As Storage,根据镜像OCI标准规范,复用Registry来存储Chart。 Helm的下阶段规划 Helm的下一个开发阶段将围绕稳定性新功能和对现有功能的增强。
增强Helm test的功能;
对Helm OCI集成的改进;
Go客户端库的增强功能;
而对于Helm 2,开发团队将继续接受错误修复并修复出现的任何安全问题,但不会接受任何新功能。所有功能开发将移至Helm 3。在Helm 3公开发布6个月后,团队将停止接受除安全问题以外的Helm 2错误修复。 charts:包。releases:实例。 可以直接从GitHub网站上获取helm项目
[root@master ~]# mkdir helm
[root@master ~]# cd helm/
[root@master helm]# wget https://get./helm-v3.2.0-linux-amd64.tar.gz
解压二进制包,移动到对应目录下并给执行权限
[root@master helm]# tar -zxf helm-v3.2.0-linux-amd64.tar.gz
[root@master helm]# ls
helm-v3.2.0-linux-amd64.tar.gz linux-amd64
[root@master helm]# cd linux-amd64/
[root@master linux-amd64]# ls
helm LICENSE README.md
[root@master linux-amd64]# mv helm /usr/local/sbin/
[root@master linux-amd64]# chmod +x /usr/local/sbin/helm
helm默认没有命令自动补全功能,这里可以设置一下
[root@master linux-amd64]# source <(helm completion bash)
追加到用户环境变量
[root@master linux-amd64]# echo 'source <(helm completion bash)' >> ~/.bashrc
查看配置信息
[root@master linux-amd64]# helm env
HELM_BIN='helm'
HELM_DEBUG='false'
HELM_KUBEAPISERVER=''
HELM_KUBECONTEXT=''
HELM_KUBETOKEN=''
HELM_NAMESPACE='default'
HELM_PLUGINS='/root/.local/share/helm/plugins'
HELM_REGISTRY_CONFIG='/root/.config/helm/registry.json'
HELM_REPOSITORY_CACHE='/root/.cache/helm/repository'
HELM_REPOSITORY_CONFIG='/root/.config/helm/repositories.yaml'
添加公用的仓库
[root@master ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou./charts
'aliyun' has been added to your repositories
[root@master ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the 'aliyun' chart repository
Update Complete. ⎈ Happy Helming!⎈
[root@master ~]# helm repo list
NAME URL
aliyunhttps://kubernetes.oss-cn-hangzhou./charts
指定对应的k8s集群 这一步非常关键,它是helm与k8s通讯的保证,这一步就是把k8s环境变量KUBECONFIG进行配置。
[root@master ~]# export KUBECONFIG=/root/.kube/config
可以写到/etc/profile里
[root@master ~]# vim /etc/profile
...
KUBECONFIG=/root/.kube/config
[root@master ~]# source /etc/profile
查询一个charts
[root@master ~]# helm search repo mysql
NAME CHART VERSIONAPP VERSIONDESCRIPTION
aliyun/mysql 0.3.5 Fast, reliable, scalable, and easy to use open-...
aliyun/percona 0.3.0 free, fully compatible, enhanced, open source d...
aliyun/percona-xtradb-cluster0.0.2 5.7.19 free, fully compatible, enhanced, open source d...
aliyun/gcloud-sqlproxy 0.2.3 Google Cloud SQL Proxy
aliyun/mariadb 2.1.6 10.1.31 Fast, reliable, scalable, and easy to use open-...
helm的hub网址
Helm基本概念 在安装某个Charts包之前,可以先去查找,由于国内网络环境原因,通常我们直接在上述添加的阿里云的Charts仓库内查找。比如要下载一个MySQL服务。
[root@master ~]# helm search repo mysql
NAME CHART VERSIONAPP VERSIONDESCRIPTION
aliyun/mysql 0.3.5 Fast, reliable, scalable, and easy to use open-...
aliyun/percona 0.3.0 free, fully compatible, enhanced, open source d...
aliyun/percona-xtradb-cluster0.0.2 5.7.19 free, fully compatible, enhanced, open source d...
aliyun/gcloud-sqlproxy 0.2.3 Google Cloud SQL Proxy
aliyun/mariadb 2.1.6 10.1.31 Fast, reliable, scalable, and easy to use open-...
部署helm的charts包
[root@master ~]# helm install test-mysql aliyun/mysql
NAME: test-mysql
LAST DEPLOYED: Thu Nov 12 21:53:24 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
test-mysql-mysql.default.svc.cluster.local
To get your root password run:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default test-mysql-mysql -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 test-mysql-mysql -p
To connect to your database directly from outside the K8s cluster:
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Execute the following commands to route the connection:
export POD_NAME=$(kubectl get pods --namespace default -l 'app=test-mysql-mysql' -o jsonpath='{.items[0].metadata.name}')
kubectl port-forward $POD_NAME 3306:3306
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
注意:helm 2版本在部署的时候,如果不自定名称,会生产自定义的名称,但在helm 3版本中,如果没有自定义名称会报错。 可以去查看一下刚才安装过后的Charts包的信息,注意,一个Charts包在部署安装过后,我们称之为一个releases版本。
[root@master ~]# helm list
NAME NAMESPACEREVISIONUPDATED STATUS CHART APP VERSION
test-mysqldefault 1 2020-11-12 21:53:24.857864969 -0500 ESTdeployedmysql-0.3.5
在我们部署安装一个releases之后,会在/root/.cache/helm/repository目录下生产一些文件,并且会有一个tar包。
[root@master ~]# cd .cache/helm/repository/
[root@master repository]# ls
aliyun-charts.txt aliyun-index.yaml mysql-0.3.5.tgz
上述mysql-0.3.4.tgz这个包,就是我们所部署安装的Charts包,解压查看一下,里边到底有什么东西。
[root@master repository]# tar -zxf mysql-0.3.5.tgz
[root@master repository]# tree -C mysql
mysql
├── Chart.yaml
├── README.md
├── templates
│ ├── configmap.yaml
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── NOTES.txt
│ ├── pvc.yaml
│ ├── secrets.yaml
│ └── svc.yaml
└── values.yaml
1 directory, 10 files
分析Chart包解压过后的文件 1.Chart.yaml 这是一个chart包的概要信息。其中name和version字段相对重要一些。 2.README.md 记录了关于这个Chart包的使用描述信息。 3.values.yaml 这个yaml文件,描述了整个Chart包的所有资源对象涉及到的默认的值。 在安装某个Chart包之前,可以先将Chart包下载下来,然后解压对应的Chart包,查看详细信息。比如我们要部署一个redis的服务。 在repo仓库中,先查找某个Chart包。
[root@master repository]# helm search repo redis
NAME CHART VERSIONAPP VERSIONDESCRIPTION
aliyun/redis 1.1.15 4.0.8 Open source, advanced key-value store. It is of...
aliyun/redis-ha2.0.1 Highly available Redis cluster with multiple se...
aliyun/sensu 0.2.0 Sensu monitoring framework backed by the Redis ...
下载对应Chart包。
[root@master repository]# helm pull aliyun/redis
下载过后,会在.cacahe目录中
[root@master repository]# pwd
/root/.cache/helm/repository
不下载Chart包,也可以查看对应的信息。
[root@master repository]# helm show --help
...
Available Commands:
all shows all information of the chart
chart shows the chart's definition
readme shows the chart's README
values shows the chart's values
...
二、实例演示:Helm部署MySQL服务
在部署MySQL实例前,可以先查看对应Chart包的信息,需要提前做依赖的环境,当然也可以直接部署,然后一步一步推理、排错。 这里我们直接部署安装一次MySQL,安装之前,先将之前的实例删除,使用uninstall命令。
[root@master repository]# helm uninstall test-mysql
release 'test-mysql' uninstalled
直接部署安装MySQL实例。
[root@master repository]# cd mysql/
[root@master mysql]# helm install new-mysql aliyun/mysql
可以查看安装部署的详细信息。
[root@master mysql]# helm list
[root@master mysql]# helm status new-mysql
首先确认都产生了什么资源对象。
[root@master mysql]# ls templates/
configmap.yaml _helpers.tpl pvc.yaml svc.yaml
deployment.yaml NOTES.txt secrets.yaml
查看pod和pvc的详细信息
[root@master mysql]# kubectl get pod
NAME READY STATUS RESTARTS AGE
new-mysql-mysql-6cf95546fb-vzvrg 0/1 Pending 0 3m24s
[root@master mysql]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
new-mysql-mysql Pending 4m33s
可以判断,由于PVC没有PV支持,所以PVC现在一直处于Pending的状态,导致Pod绑定这个PVC之后,也会出现问题,所以,解决思路是给这PVC创建一个PV。 这里做基于NFS服务的PV服务,先开启NFS服务。
[root@master mysql]# yum -y install nfs-utils rpcbind
[root@master mysql]# mkdir /nfsdata
[root@master mysql]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
[root@master mysql]# systemctl start rpcbind
[root@master mysql]# systemctl enable rpcbind
[root@master mysql]# systemctl start nfs-server
[root@master mysql]# systemctl enable nfs-server
[root@master ~]# showmount -e
Export list for master:
/nfsdata *
为PVC创建一个PV
[root@master mysql]# cd templates/
[root@master templates]# mkdir /nfsdata/new-pv
[root@master templates]# vim new-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: new-pv
spec:
capacity:
storage: 8Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /nfsdata/new-pv
server: 192.168.229.187
[root@master templates]# kubectl apply -f new-pv.yaml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
查看对应的PV,PVC状态,已经成功绑定。
[root@master templates]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
new-pv 8Gi RWO Retain Bound default/new-mysql-mysql 69s
[root@master templates]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
new-mysql-mysql Bound new-pv 8Gi RWO 12m
此时查看Pod,已经正常运行了。
[root@master templates]# kubectl get pod
NAME READY STATUS RESTARTS AGE
new-mysql-mysql-6cf95546fb-vzvrg 0/1 PodInitializing 0 12m
[root@master templates]# kubectl get pod
NAME READY STATUS RESTARTS AGE
new-mysql-mysql-6cf95546fb-vzvrg 1/1 Running 0 13m
Releases的升级与回滚 目前releases的镜像版本为:5.7.14版本,假设将此镜像版本升级为5.7.15
[root@master mysql]# helm upgrade --set imageTag=5.7.15 new-mysql aliyun/mysql
[root@master templates]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
new-mysql-mysql 1/1 1 1 15m new-mysql-mysql mysql:5.7.15 app=new-mysql-mysql
helm也有查看历史版本的命令。
[root@master templates]# helm history new-mysql
REVISIONUPDATED STATUS CHART APP VERSIONDESCRIPTION
1 Thu Nov 12 22:09:57 2020supersededmysql-0.3.5 Install complete
2 Thu Nov 12 22:24:57 2020deployed mysql-0.3.5 Upgrade complete
helm回滚(helm可以回滚到指定版本)
[root@master ~]# helm rollback new-mysql 1
Rollback was a success! Happy Helming!
[root@master templates]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
new-mysql-mysql 1/1 1 1 17m new-mysql-mysql mysql:5.7.14 app=new-mysql-mysql
[root@master templates]# helm history new-mysql
REVISIONUPDATED STATUS CHART APP VERSIONDESCRIPTION
1 Thu Nov 12 22:09:57 2020supersededmysql-0.3.5 Install complete
2 Thu Nov 12 22:24:57 2020supersededmysql-0.3.5 Upgrade complete
3 Thu Nov 12 22:26:45 2020deployed mysql-0.3.5 Rollback to 1
重新部署一个MySQL实例,以自己的名称命名,并且在部署的时候,要求使用StorageClass资源,并且对应的MYSQL_ROOT_PASSWORD=123.com。 首先创建一个SC资源。 1.部署NFS 2.RBAC的权限
[root@master ~]# vim rbac-rolebind.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-provisioner-runner
rules:
- apiGroups: ['']
resources: ['persistentvolumes']
verbs: ['get', 'list', 'watch', 'create', 'delete']
- apiGroups: ['']
resources: ['persistentvolumeclaims']
verbs: ['get', 'list', 'watch', 'update']
- apiGroups: ['storage.k8s.io']
resources: ['storageclasses']
verbs: ['get', 'list', 'watch']
- apiGroups: ['']
resources: ['events']
verbs: ['watch', 'create', 'update', 'patch']
- apiGroups: ['']
resources: ['services', 'endpoints']
verbs: ['get','create','list', 'watch','update']
- apiGroups: ['extensions']
resources: ['podsecuritypolicies']
resourceNames: ['nfs-provisioner']
verbs: ['use']
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
[root@master ~]# kubectl apply -f rbac-rolebind.yaml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
3.部署nfs-client-provisoner
[root@master ~]# vim nfs-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou./open-ali/nfs-client-provisioner
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: bdqn-provisioner
- name: NFS_SERVER
value: 192.168.229.187
- name: NFS_PATH
value: /nfsdata
volumes:
- name: nfs-client-root
nfs:
server: 192.168.229.187
path: /nfsdata
[root@master ~]# kubectl apply -f nfs-deployment.yaml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
4.创建storageclass资源。
[root@master ~]# vim storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: mysql-sc
provisioner: bdqn-provisioner
reclaimPolicy: Retain
[root@master ~]# kubectl apply -f storageclass.yaml
根据要求,我们需要更改默认的values.yaml文件,打开storageClass字段,并将上述sc资源的名称写入。
[root@master mysql]# pwd
/root/.cache/helm/repository/mysql
[root@master mysql]# vim values.yaml
54 ##
55 storageClass: 'mysql-sc'
56 accessMode: ReadWriteOnce
57 size: 8Gi
接下来就可以直接部署MySQL了,不过还有要求。 mysql_root_password,这个在README.md文档内有提示,可以直接使用。
[root@master mysql]# helm install bdqn-mysql --set mysqlRootPassword=123.com -f ~/.cache/helm/repository/mysql/values.yaml aliyun/mysql
验证服务全部运行之后,可以登录MySQL服务
[root@master mysql]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
bdqn-mysql-mysql-7b89c7b99-jtt4s 1/1 Running 0 56s 10.244.1.3 node1 <none> <none>
[root@master mysql]# kubectl exec -it bdqn-mysql-mysql-7b89c7b99-mlntq -- mysql -u root -p123.com
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
三、创建自己的Chart
创建自定义Chart包。
[root@master helm]# helm create mychart
Creating mychart
[root@master helm]# ls
mychart
[root@master helm]# tree -C mychart/
mychart/
├── 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 files
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
要求:自己创建的chart包,使用自定义镜像:v1版本,replicas:4。然后这个项目单只需要一个Deployment资源和Service(type:NodePort,nodePort:30010)资源即可。 根据要求,修改values.yaml文件对应的值。
[root@master mychart]# pwd
/opt/helm/mychart
[root@master mychart]# vim values.yaml
5 replicaCount: 4
6
7 image:
8 repository: 192.168.229.187:5000/httpd
9 pullPolicy: IfNotPresent
10 # Overrides the image tag whose default is the chart version.
11 tag: 'v1'
关于Service资源部分
39 service:
40 type: NodePort
41 port: 80
42 nodePort: 30010
关于禁用hpa、serviceaccount、Ingress资源,直接在values.yaml文件中,选择不启用即可。
69 autoscaling:
70 enabled: false
17 serviceAccount:
18 # Specifies whether a service account should be created
19 create: false
44 ingress:
45 enabled: false
在安装Chart包之前,可以使用lint选项对chart包做语法检查。
[root@master helm]# helm lint mychart/
==> Linting mychart/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
Chart包的几种部署方式 1.安装仓库中的Chart包
[root@master helm]# helm install new-mysql aliyun/mysql
2.通过helm pull下来的tar包也是可以安装的。
[root@master repository]# helm install test-redis ./redis-1.1.15.tgz
3.可以通过tar包解压过后的一个完整的目录去安装。
[root@master repository]# helm install new-redis ./redis
4.可以通过URL指定的某个路径下去安装。
[root@master ~]# helm install test-url https:///charts/nginx-1.2.tgz
注意:自定义的chart目录,也可以使用helm package命令达成tar包。
[root@master helm]# helm package mychart/
Successfully packaged chart and saved it to: /opt/helm/mychart-0.1.0.tgz
部署自定义Chart包。
[root@master helm]# helm install bdqn mychart -f mychart/values.yaml
NAME: bdqn
LAST DEPLOYED: Thu Nov 12 23:42:27 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath='{.spec.ports[0].nodePort}' services bdqn-mychart)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
echo http://$NODE_IP:$NODE_PORT
部署完成之后,查看对应的资源生产情况,根据实际的情况,再去做服务的优化及依赖服务的部署(比如:镜像的私有仓库)
[root@master helm]# kubectl get pod
NAME READY STATUS RESTARTS AGE
bdqn-mychart-584c477f64-78qw7 1/1 Running 0 3m12s
bdqn-mychart-584c477f64-gtxqm 1/1 Running 0 3m12s
bdqn-mychart-584c477f64-hgrnv 1/1 Running 0 3m12s
bdqn-mychart-584c477f64-ppl2m 1/1 Running 0 3m12s
bdqn-mysql-mysql-7b89c7b99-jtt4s 1/1 Running 0 29m
new-mysql-mysql-6cf95546fb-tp97p 1/1 Running 1 78m
nfs-client-provisioner-5bd6f6b659-vvvlr 1/1 Running 0 32m
[root@master helm]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bdqn-mychart NodePort 10.96.237.244 <none> 80:30862/TCP 3m57s
bdqn-mysql-mysql ClusterIP 10.100.102.192 <none> 3306/TCP 30m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 47d
new-mysql-mysql ClusterIP 10.102.88.140 <none> 3306/TCP 96m
注意:查看对应的资源的情况中,我们发现svc资源,并没有像values.yaml文件中指定的nodePort端口。这是因为,template目录下的service.yaml文件中,并没有对应的nodePort字段,所以默认值引用失败,需要在service.yaml文件中添加。
[root@master templates]# pwd
/opt/helm/mychart/templates
[root@master templates]# vim service.yaml
14 nodePort: {{ .Values.service.nodePort }}
删除releases再重新部署即可
[root@master templates]# helm uninstall bdqn
release 'bdqn' uninstalled
[root@master templates]# cd ..
[root@master mychart]# cd ..
[root@master helm]# helm install bdqn mychart -f mychart/values.yaml
NAME: bdqn
LAST DEPLOYED: Thu Nov 12 23:49:43 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath='{.spec.ports[0].nodePort}' services bdqn-mychart)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
echo http://$NODE_IP:$NODE_PORT
[root@master helm]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bdqn-mychart NodePort 10.108.86.229 <none> 80:30010/TCP 42s
bdqn-mysql-mysql ClusterIP 10.100.102.192 <none> 3306/TCP 34m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 47d
new-mysql-mysql ClusterIP 10.102.88.140 <none> 3306/TCP 100m
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
注意:如果是自定义的Chart包,进行升级操作,或者说是在部署releases的时候,指定了values.yaml文件的位置了,那么在更新的时候,单纯的使用upgrade命令就做不到完全的更新了。
[root@master helm]# helm upgrade --set imageTag=v2 bdqn mychart
Release 'bdqn' has been upgraded. Happy Helming!
NAME: bdqn
LAST DEPLOYED: Fri Nov 13 00:00:56 2020
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath='{.spec.ports[0].nodePort}' services bdqn-mychart)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
echo http://$NODE_IP:$NODE_PORT
[root@master helm]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
bdqn-mychart 4/4 4 4 13m mychart 192.168.229.187:5000/httpd:v1 app.kubernetes.io/instance=bdqn,app.kubernetes.io/name=mychart
bdqn-mysql-mysql 1/1 1 1 47m bdqn-mysql-mysql mysql:5.7.14 app=bdqn-mysql-mysql
new-mysql-mysql 1/1 1 1 112m new-mysql-mysql mysql:5.7.14 app=new-mysql-mysql
nfs-client-provisioner 1/1 1 1 50m nfs-client-provisioner registry.cn-hangzhou./open-ali/nfs-client-provisioner app=nfs-client-provisioner
[root@master helm]# curl 127.0.0.1:30010
111111
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
这里在对releases进行升级操作是可以直接指定新的values.yaml文件。
[root@master helm]# vim mychart/values.yaml
...
11 tag: 'v2'
...
[root@master helm]# helm upgrade bdqn mychart -f mychart/values.yaml
Release 'bdqn' has been upgraded. Happy Helming!
NAME: bdqn
LAST DEPLOYED: Fri Nov 13 00:03:57 2020
NAMESPACE: default
STATUS: deployed
REVISION: 3
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath='{.spec.ports[0].nodePort}' services bdqn-mychart)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
echo http://$NODE_IP:$NODE_PORT
[root@master helm]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
bdqn-mychart 3/4 2 3 14m mychart 192.168.229.187:5000/httpd:v2 app.kubernetes.io/instance=bdqn,app.kubernetes.io/name=mychart
bdqn-mysql-mysql 1/1 1 1 48m bdqn-mysql-mysql mysql:5.7.14 app=bdqn-mysql-mysql
new-mysql-mysql 1/1 1 1 114m new-mysql-mysql mysql:5.7.14 app=new-mysql-mysql
nfs-client-provisioner 1/1 1 1 51m nfs-client-provisioner registry.cn-hangzhou./open-ali/nfs-client-provisioner app=nfs-client-provisioner
[root@master helm]# curl 127.0.0.1:30010
222222
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
四、创建chart仓库
任何的HTTP Server都可以作为chart仓库。在node1节点上,部署一个httpd server。 1.在node1节点启动一个httpd服务。
[root@node1 ~]# docker run -d -p 8081:80 -v /var/www:/usr/local/apache2/htdocs httpd
2.通过helm package命令将mycahrt目录打成tar包。
[root@master helm]# helm package mychart/
Successfully packaged chart and saved it to: /root/helm/mychart-0.1.0.tgz
[root@master helm]# ls
helm-v3.2.0-linux-amd64.tar.gz linux-amd64 mychart mychart-0.1.0.tgz mysql
3.执行helm repo index生产仓库的index文件。
[root@master helm]# mkdir myrepo
[root@master helm]# mv mychart-0.1.0.tgz myrepo/
[root@master helm]# helm repo index myrepo --url http://192.168.229.209:8081/charts
[root@master helm]# ls myrepo/
index.yaml mychart-0.1.0.tgz
[root@master helm]# cat myrepo/index.yaml
apiVersion: v1
entries:
mychart:
- apiVersion: v2
appVersion: 1.16.0
created: '2020-11-13T00:12:06.500273231-05:00'
description: A Helm chart for Kubernetes
digest: b759df835ba8e7196e2d590f62226b8eaf7b0e53323074af7016e147ec3cbfb4
name: mychart
type: application
urls:
- http://192.168.229.209:8081/charts/mychart-0.1.0.tgz
version: 0.1.0
generated: '2020-11-13T00:12:06.499507222-05:00'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
注意:Helm会扫描myrepo目录中所有的tgz的包,并生产index.yaml文件。–url指定的是新的仓库的访问路径。新生产的index.yaml记录了当前仓库中素有的chart信息。 4.将mychart-0.1.0.tgz包和index.yaml上传到node1:/var/www/charts目录中。
在node1上创建
[root@node1 ~]# mkdir /var/www/charts
回到master节点,复制文件。
[root@master myrepo]# pwd
/root/helm/myrepo
[root@master myrepo]# scp index.yaml mychart-0.1.0.tgz node1:/var/www/charts
index.yaml 100% 427 507.2KB/s 00:00
mychart-0.1.0.tgz 100% 3615 3.0MB/s 00:00
5.通过helm repo add命令将新仓库添加到Helm
[root@master myrepo]# helm repo add newrepo http://192.168.229.209:8081/charts
'newrepo' has been added to your repositories
[root@master myrepo]# helm repo list
NAME URL
aliyun https://kubernetes.oss-cn-hangzhou./charts
newrepohttp://192.168.229.209:8081/charts
6.直接从newrepo中部署服务。
[root@master myrepo]# helm search repo mychart
NAME CHART VERSIONAPP VERSIONDESCRIPTION
newrepo/mychart0.1.0 1.16.0 A Helm chart for Kubernetes
[root@master helm]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the 'newrepo' chart repository
...Successfully got an update from the 'aliyun' chart repository
Update Complete. ⎈ Happy Helming!⎈
[root@master helm]# helm uninstall bdqn
release 'bdqn' uninstalled
[root@master helm]# helm install new-http newrepo/mychart
NAME: new-http
LAST DEPLOYED: Fri Nov 13 00:19:13 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath='{.spec.ports[0].nodePort}' services new-http-mychart)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
echo http://$NODE_IP:$NODE_PORT
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
7.如果现在再生产一个自定义Chart包,把它加入到newrepo中。
[root@master helm]# helm create new-chart
Creating new-chart
[root@master helm]# helm package new-chart/
Successfully packaged chart and saved it to: /root/helm/new-chart-0.1.0.tgz
[root@master helm]# mv new-chart-0.1.0.tgz myrepo/
[root@master helm]# helm repo index myrepo --url http://192.168.229.209:8081/charts
[root@master helm]# cat myrepo/index.yaml
apiVersion: v1
entries:
mychart:
- apiVersion: v2
appVersion: 1.16.0
created: '2020-11-13T00:20:56.104575929-05:00'
description: A Helm chart for Kubernetes
digest: b759df835ba8e7196e2d590f62226b8eaf7b0e53323074af7016e147ec3cbfb4
name: mychart
type: application
urls:
- http://192.168.229.209:8081/charts/mychart-0.1.0.tgz
version: 0.1.0
new-chart:
- apiVersion: v2
appVersion: 1.16.0
created: '2020-11-13T00:20:56.105061371-05:00'
description: A Helm chart for Kubernetes
digest: d8bc6f5ca9a3bfc6c64a82b7d896c34d664452bf4ac1582f5ed690b6d2fdc424
name: new-chart
type: application
urls:
- http://192.168.229.209:8081/charts/new-chart-0.1.0.tgz
version: 0.1.0
generated: '2020-11-13T00:20:56.103683237-05:00'
[root@master helm]# scp myrepo/* node1:/var/www/charts
index.yaml 100% 787 424.9KB/s 00:00
mychart-0.1.0.tgz 100% 3615 1.9MB/s 00:00
new-chart-0.1.0.tgz 100% 3579 2.6MB/s 00:00
[root@master helm]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the 'newrepo' chart repository
...Successfully got an update from the 'aliyun' chart repository
Update Complete. ⎈ Happy Helming!⎈
[root@master helm]# helm search repo new-chart
NAME CHART VERSIONAPP VERSIONDESCRIPTION
newrepo/new-chart0.1.0 1.16.0 A Helm chart for Kubernetes
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
|