Helm基础
Helm 是 Kubernetes 的软件包管理工具,可理解为Centos系统上yum或者Ubuntu系统上的apt一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成,能够将一组K8S资源打包统一管理,是查找、共享和使用为Kubernetes构建的软件的最佳方式。
Helm类似于yum安装指令,统一对安装服务进行管理,使得用户不需要关系服务之间的依赖关系。
Helm能解决k8s部署应用的什么问题?
K8s有非常多资源对象,过于分散,部署一个服务时候,往往需要操作多个服务资源对象,且资源对象相互依赖,非常不好管理。
Helm帮助管理资源对象可以:
1.统一管理、配置和更新这些分散的 k8s 的应用资源文件
2.分发和复用一套应用模板
3.将应用的一系列资源当做一个软件包管理
Helm三大核心概念
chart Helm的打包格式叫做chart,所谓chart就是一系列文件, 它描述了一组相关的 k8s 集群资源
release 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release
Repoistory Helm chart 的仓库,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引文件和压缩包
Helm3.x安装
# 官方下载地址
$ wget https://get.helm.sh/helm-v3.5.3-linux-amd64.tar.gz
$ tar -zxvf helm.sh/helm-v3.5.3-linux-amd64.tar.gz
$ mv linux-amd64/helm /usr/bin/helm
# 查看版本
$ helm version
version.BuildInfo{Version:"v3.5.4", GitCommit:"1b5edb69df3d3a08df77c9902dc17af864ff05d1", GitTreeState:"clean", GoVersion:"go1.15.11"}
创建一个Chart工程并用helm发布
1.创建Chart.yaml
1-1.创建项目目录(工程名称)
mkdir jkyy-nginx
cd jky-nginx
1-2.创建自描述文件 Chart.yaml (这个文件必须有 name 和 version 定义)
cat << 'EOF' > ./Chart.yaml
name: jkyy-nginx
version: 1.0.0
EOF
2. 创建Values.yaml
将镜像地址和版本信息单独存放在values.yaml方便后面引用
cat << 'EOF' > ./values.yaml
image:
repository: harbor.hw.xxxx.com:5000/k8s-test/mynginx
tag: 'v1'
EOF
3. 创建templates目录
在此下面创建各种k8s资源文件(注: templates目录的名字是固定写法,不可变)
mkdir templates
3-1. 创建Deployment资源
cat << 'EOF' > ./templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jkyy-nginx-helm
labels:
app: jkyy-nginx-helm
spec:
replicas: 1
selector:
matchLabels:
app: jkyy-nginx-helm
template:
metadata:
labels:
app: jkyy-nginx-helm
spec:
containers:
- name: jkyy-nginx-helm
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
EOF
注意: image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
为模板引用values.yaml中的变量,经常可变的值一般都单独写在values.yaml中,在模板中引入上面的配置,在模板文件中可以通过 .VAlues对象访问到
3-2. 创建Service资源
cat << EOF > ./templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: jkyy-nginx-svc
spec:
type: NodePort
selector:
app: jkyy-nginx-helm
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 31800
EOF
4. 部署应用
先来看下目录结构
$ ~/helm-project# tree .
.
└── jkyy-nginx
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml
部署jkyy-nginx这个工程
helm install jkyy-nginx .
查看状态
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
jkyy-nginx default 1 2023-01-31 17:27:32.921803812 +0800 CST deployed jkyy-nginx-1.0.0
$ helm status jkyy-nginx
NAME: jkyy-nginx
LAST DEPLOYED: Tue Jan 31 17:27:32 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
此时v1版本页面:
$ curl k8s01.test.hw:31800
<html><title>AppName: Jkyy-Nginx</title>
AppVersion: v1</html>
更新应用
将v2新的页面重新打包新镜像harbor.hw.xxx.com:5000/k8s-test/mynginx:v2
更改values.yml文件(更新为v2版本)
image:
repository: harbor.hw.jiankangyouyi.com:5000/k8s-test/mynginx
tag: 'v2'
执行更新
helm upgrade jkyy-nginx .
现在发现已经更新了v2版本
$ curl k8s01.test.hw:31800
<html><title>AppName: Jkyy-Nginx</title>
AppVersion: v2</html>
问题: 使用helm更新时发现不能远端机器不能自动拉取镜像,手动Pull是可以的, 如果是公共仓库的镜像也没问题,我这个是私有仓库镜像。
解决: 新增secret资源文件,创建dockerlogin秘钥就可以了。
templates下创建secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: habor-pull-token
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
网友评论