美文网首页
Helm入门

Helm入门

作者: 阿当运维 | 来源:发表于2023-01-31 14:55 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:Helm入门

          本文链接:https://www.haomeiwen.com/subject/jyfbhdtx.html