K8s的Helm
Helm介绍
在没有使用helm之前,向Kubernetes部署应用,我们要一次部署deployment、svc等,步骤繁琐。并且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。
Helm的本质就是K8s的应用管理可以配置,能动态生成。通过动态生产K8s的资源清单文件。然后kubectl自动执行K8s资源部署。
- 使用helm可以把这些YAML文件作为整体管理
- 使用YAML文件高效复用
- 使用helm应用级别的版本管理
Helm的组成及架构
Helm是官方提供的类似于YUM的包管理器,是部署环境的流程封装。Helm有两个重要的概念:chart和release
- chart,应用描述,是创建一个应用的信息集合,包括各种Kubernetes对象的配置模板、定义参数、依赖关系、文档说明等。chart是应用部署的自包含逻辑单元。可以将chart比作apt、yum中的软件安装包
- release是chart的运行实例,代表了一个正在运行的应用。一个chart被helm运行后将会生成对应的release,将在K8s中创建出真实的运行资源对象。也就是应用级别的版本管理
- Repository:用于发布和存储chart的仓库
Helm采用CS架构,由一下组件组成:
- Helm客户端,可以在本地执行,负责chart和release的创建和管理,以及和Tiller的交互。
- Tiller服务器,在Kubernetes集群上运行,并管理Kunernetes应用程序。负责吹Helm客户端的请求,与Kubernetes APIServer交互。
- Repository是chart仓库,Helm客户端通过HTTP协议来访问Chart索引文件和压缩包
Helm v3变化
2019年11月13日,Helm发布了Helm v3的第一个稳定版本。主要变化如下:
- Tiller的删除
- release可以在不同名称空间重用
Helm部署
下载压缩包 .
- 下载helm安装压缩文件,上传到Linux系统中
- 解压helm压缩文件,把解压后的helm目录复制到/usr/bin目录下
- 使用helm
为tiller创建Service Account
##我这里直接把cluster-admin绑定给了tiller
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
kubectl create -f rbac-config.yaml
helm init --service-account tiller --skip-refresh
kubectl get pod -n kube-system -l app=helm
使用以下命令就可以查看helm版本(安装成功会显示出来)
helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
这里我在初始化的时候遇到了问题
解决方法:
helm init --output yaml > tiller.yaml
#增加selector字段
vim tiller.yaml
spec:
replicas: 1
strategy: {}
selector:
matchLabels:
app: helm
name: tiller
...
kubectl apply -f tiller.yaml
Helm自定义模板
创建文件夹
mkdir ./hello-world
cd /hello-world
创建自描述模板Chart.yaml
这个文件必须有name和version定义
cat <<'EOF' > ./Chart.yaml
name: hello-world
version: 1.0.0
EOF
创建模板文件,用于生成Kubernetes资源清单(manifests)
mkdir ./templates
cat <<'EOF' > ./templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: nginx
ports:
- containerPort: 8080
protocol: TCP
EOF
cat <<'EOF' > ./templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: hello-world
EOF
使用命令helm install RELATIVE_PATH_TO_CHART 创建release
helm install .
配置体现在配置文件 values.yaml
cat <<'EOF' > ./values.yaml
image:
repository: gcr.io/google-samples/node-hello
tag: '1.0'
EOF
##这个文件中定义的值,在模板文件中可以通过.values对象访问到
cat <<'EOF' > ./templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
ports:
- containerPort: 8080
protocol: TCP
EOF
在values.yaml中的值可以被部署到release时用到的参数 --values YAML_FILE_PATH或者-- set key1=value1,key2-value2覆盖掉
helm install --set image.tag='latest'
查看仓库
helm repo list
添加仓库/移除仓库
helm repo add 仓库名 仓库地址
helm repo remove 仓库名
更新仓库
helm repo update
安装资源
helm install --name RELEASE_NAME 仓库名/资源
升级版本
helm upgrade RELEASE_NAME 仓库名/资源
列出已经部署的release
helm list
helm list --all
查询一个特定的release的状态
helm status RELEASE_NAME
移除所有与这个release相关的Kuberbetes资源
helm delete RELEASE_NAME
回滚
helm rollback RELEASE_NAME VRESION_NUMBER
移除所有指定release相关的Kubernetes资源和所有这个release的记录
helm delete --purge RELEASE_NAME
打印生册生成的清单文件内容而不执行
helm install . --dry-run --debug --set image.tag=latest
.