k8s核心技术--Helm

| 标签 k8s 

1. 为什么引入Helm

首先在原来项目中都是基于yaml文件来进行部署发布的,而目前项目大部分微服务化或者模块化,会分成很多个组件来部署,每个组件可能对应一个deployment.yaml,一个service.yaml,一个Ingress.yaml还可能存在各种依赖关系,这样一个项目如果有5个组件,很可能就有15个不同的yaml文件,这些yaml分散存放,如果某天进行项目恢复的话,很难知道部署顺序,依赖关系等,而所有这些包括

  • 基于yaml配置的集中存放
  • 基于项目的打包
  • 组件间的依赖

但是这种方式部署,会有什么问题呢?

  • 如果使用之前部署单一应用,少数服务的应用,比较合适
  • 但如果部署微服务项目,可能有几十个服务,每个服务都有一套yaml文件,需要维护大量的yaml文件,版本管理特别不方便

Helm的引入,就是为了解决这个问题

  • 使用Helm可以把这些YAML文件作为整体管理
  • 实现YAML文件高效复用
  • 使用helm应用级别的版本管理

    2. Helm介绍

    Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的将之前打包好的yaml文件部署到kubernetes上。

Helm有三个重要概念

  • helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理
  • Chart:应用描述,一系列用于描述k8s资源相关文件的集合(把yaml打包,是yaml的集合)
  • Release:基于Chart的部署实体,一个chart被Helm运行后将会生成对应的release,将在K8S中创建出真实的运行资源对象。也就是应用级别的版本管理

3. Helm V3 变化

2019年11月13日,Helm团队发布了Helm v3的第一个稳定版本 该版本主要变化如下

  • 架构变化
    • 最明显的变化是Tiller的删除
    • 支持将 Chart 推送至 Docker 镜像仓库中
    • relesase可以在不同命名空间重用

V3之前 image.png V3之后 image.png

4. Helm安装

首先我们需要去 官网下载

  • 第一步,下载helm安装压缩文件,上传到linux系统中
  • 第二步,解压helm压缩文件,把解压后的helm目录复制到 usr/bin 目录中
  • 使用命令:helm ```shell [root@k8s-master ~]# tar -zxvf helm-v3.0.0-linux-amd64.tar.gz linux-amd64/ linux-amd64/helm linux-amd64/README.md linux-amd64/LICENSE [root@k8s-master ~]# ls anaconda-ks.cfg ds.yaml job.yaml linux-amd64 secret.yaml web1.yaml web.yaml cronjob.yaml helm-v3.0.0-linux-amd64.tar.gz kube-flannel.yml nginx.yaml service.yaml web2.yaml [root@k8s-master ~]# cd linux-amd64/ [root@k8s-master linux-amd64]# ls helm LICENSE README.md [root@k8s-master linux-amd64]# mv helm /usr/bin/ [root@k8s-master linux-amd64]# cd /usr/bin/ [root@k8s-master bin]# helm The Kubernetes package manager

Common actions for Helm:

  • helm search: search for charts
  • helm pull: download a chart to your local directory to view
  • helm install: upload the chart to Kubernetes
  • helm list: list releases of charts …
    我们都知道yum需要配置yum源,那么helm就就要配置helm源
    # 5. 配置Helm仓库
    ## 5.1 添加仓库
    ```shell
    helm repo add 仓库名  仓库地址 
    
    [root@k8s-master bin]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    "aliyun" has been added to your repositories
    [root@k8s-master bin]# helm repo list
    NAME    URL                                                   
    aliyun  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    
    # 配置微软源
    helm repo add stable http://mirror.azure.cn/kubernetes/charts
    # 配置阿里源
    helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    # 配置google源
    helm repo add google https://kubernetes-charts.storage.googleapis.com/
    

    5.2 更新仓库

    ```shell

    更新

    helm repo update

[root@k8s-master bin]# helm repo update Hang tight while we grab the latest from your chart repositories… …Successfully got an update from the “aliyun” chart repository …Successfully got an update from the “stable” chart repository Update Complete. ⎈ Happy Helming!⎈

## 5.3 删除仓库
```shell
[root@k8s-master bin]# helm repo remove stable
"stable" has been removed from your repositories
[root@k8s-master bin]# helm repo list
NAME    URL                                                   
aliyun  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

6. 使用Helm快速部署应用

6.1 使用命令搜索应用

首先我们使用命令,搜索我们需要安装的应用

helm search repo 名称

# 搜索 weave仓库
[root@k8s-master bin]# helm search repo weave
NAME                    CHART VERSION   APP VERSION     DESCRIPTION                                       
aliyun/weave-cloud      0.1.2                           Weave Cloud is a add-on to Kubernetes which pro...
aliyun/weave-scope      0.9.2           1.6.5           A Helm chart for the Weave Scope cluster visual...
stable/weave-cloud      0.3.9           1.4.0           DEPRECATED - Weave Cloud is a add-on to Kuberne...
stable/weave-scope      1.1.12          1.12.0          DEPRECATED - A Helm chart for the Weave Scope c...[root@k8s-master bin]# helm search repo weave
NAME                    CHART VERSION   APP VERSION     DESCRIPTION                                       
aliyun/weave-cloud      0.1.2                           Weave Cloud is a add-on to Kubernetes which pro...
aliyun/weave-scope      0.9.2           1.6.5           A Helm chart for the Weave Scope cluster visual...

6.2 根据搜索命令选择安装

搜索完成后,使用命令进行安装

helm install 安装之后的名字 搜索到的应用名字

[root@k8s-master bin]# helm install ui stable/weave-scope
NAME: ui
LAST DEPLOYED: Tue Feb 15 15:25:58 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
You should now be able to access the Scope frontend in your web browser, by
using kubectl port-forward:

kubectl -n default port-forward $(kubectl -n default get endpoints \
ui-weave-scope -o jsonpath='{.subsets[0].addresses[0].targetRef.name}') 8080:4040

then browsing to http://localhost:8080/.
For more details on using Weave Scope, see the Weave Scope documentation:

https://www.weave.works/docs/scope/latest/introducing/

查看安装后的状态

[root@k8s-master bin]# helm list
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
ui      default         1               2022-02-15 15:25:58.659637765 +0800 CST deployed        weave-scope-1.1.12      1.12.0     
[root@k8s-master bin]# helm status ui
NAME: ui
LAST DEPLOYED: Tue Feb 15 15:25:58 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
You should now be able to access the Scope frontend in your web browser, by
using kubectl port-forward:

kubectl -n default port-forward $(kubectl -n default get endpoints \
ui-weave-scope -o jsonpath='{.subsets[0].addresses[0].targetRef.name}') 8080:4040

then browsing to http://localhost:8080/.
For more details on using Weave Scope, see the Weave Scope documentation:

https://www.weave.works/docs/scope/latest/introducing/

但是我们通过查看 svc状态,发现没有对象暴露端口

[root@k8s-master bin]# kubectl get svc
NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes       ClusterIP   10.96.0.1      <none>        443/TCP   2d22h
ui-weave-scope   ClusterIP   10.111.94.41   <none>        80/TCP    3m19s

所以我们需要修改service的yaml文件,添加NodePort

[root@k8s-master bin]# kubectl edit svc ui-weave-scope
service/ui-weave-scope edited

image.png

[root@k8s-master bin]# kubectl get svc
NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.96.0.1      <none>        443/TCP        2d22h
ui-weave-scope   NodePort    10.111.94.41   <none>        80:30939/TCP   7m18s

然后我们通过http://10.211.55.15:30939/即可访问 image.png

7. 如何自己创建Chart

1、使用命令,自己创建Chart

[root@k8s-master ~]# helm create mychart
Creating mychar在templates文件夹创建两个文件t
[root@k8s-master ~]# cd mychart/
[root@k8s-master mychart]# ls
charts  Chart.yaml  templates  values.yaml
  • templates:编写yaml文件存放到这个目录
  • values.yaml:存放的是全局的yaml文件
  • chart.yaml:当前chart属性配置信息

2、在templates文件夹创建两个文件 我们创建以下两个

  • deployment.yaml
  • service.yaml

我们可以通过下面命令创建出yaml文件

# 导出deployment.yaml
kubectl create deployment web1 --image=nginx --dry-run -o yaml > deployment.yaml
# 导出service.yaml 【可能需要先创建 deployment,不然会报错】
kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > service.yaml

3、安装mychart 执行命令创建

[root@k8s-master ~]# helm install web1 mychart/
NAME: mychart
LAST DEPLOYED: Tue Feb 15 16:02:39 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@k8s-master ~]# kubectl get pod
NAME                                            READY   STATUS              RESTARTS   AGE
filebeat-7mh82                                  1/1     Running             0          21h
filebeat-rg6p9                                  1/1     Running             0          21h
weave-scope-agent-ui-cs578                      1/1     Running             0          36m
weave-scope-agent-ui-mh4jm                      1/1     Running             0          36m
weave-scope-agent-ui-qfcp9                      0/1     Pending             0          36m
weave-scope-cluster-agent-ui-7498b8d4f4-dt59p   1/1     Running             0          36m
weave-scope-frontend-ui-649c7dcd5d-dx4wm        1/1     Running             0          36m
web1-7f87dfbd56-gnzh5                           0/1     ContainerCreating   0          7s
[root@k8s-master ~]# kubectl get svc
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP        2d23h
ui-weave-scope   NodePort    10.111.94.41    <none>        80:30939/TCP   37m
web1             NodePort    10.100.43.246   <none>        80:31311/TCP   23s
[root@k8s-master ~]# 

4、应用升级 当我们修改了mychart中的东西后,就可以进行升级操作

[root@k8s-master ~]# helm upgrade web1 mychart/
Release "web1" has been upgraded. Happy Helming!
NAME: web1
LAST DEPLOYED: Tue Feb 15 16:07:19 2022
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None

8. Chart实现yaml文件高效复用

通过传递参数,动态渲染模板,yaml内容动态从传入参数生成

刚刚我们创建mychart的时候,看到有values.yaml文件,这个文件就是一些全局的变量,然后在templates中能取到变量的值,下面我们可以利用这个,来完成动态模板

[root@k8s-master mychart]# ls
charts  Chart.yaml  templates  values.yaml
  • 在values.yaml定义变量和值
  • 具体yaml文件,获取定义变量值
  • yaml文件中大体有几个地方不同
    • image
    • tag
    • label
    • name
    • port
    • replicas

1、在values.yaml文件中定义变量和值

replicas: 1
image: nginx
tag: 1.16
label: nginx
port: 80

2、在templates的yaml文件中使用values.yaml定义变量 我们通过表达式形式 使用全局变量 例如: image.pngimage.png

3、安装应用 在我们修改完上述的信息后,就可以尝试的创建应用了

[root@k8s-master ~]# helm install --dry-run web2 mychart/
NAME: web2
LAST DEPLOYED: Tue Feb 15 16:30:50 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: web2-svc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
status:
  loadBalancer: {}
---
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: web2-depoly
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: map[pullPolicy:IfNotPresent repository:nginx]
        name: nginx
        resources: {}
status: {}

真正创建

[root@k8s-master ~]# helm install web2 mychart/
NAME: web2
LAST DEPLOYED: Tue Feb 15 16:31:59 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

上一篇     下一篇