• helm3


    Helm客户端


    安装

    wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz
    tar zxvf helm-v3.0.0-linux-amd64.tar.gz 
    mv linux-amd64/helm /usr/bin/
    

    配置仓库

    helm repo add stable http://mirror.azure.cn/kubernetes/charts
    helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 
    helm repo update
    

    • 查看配置的存储库
    helm repo list
    helm search repo stable
    

    • 删除存储库
    helm repo remove aliyun
    

    案例1


    helm create mychart
    cd mychart/
    rm -rf /root/mychart/templates/*
    

    • Chart.yaml (helm create mychart 自动生成的文件)
    apiVersion: v2
    name: nginx
    description: A Helm chart for Kubernetes
    type: application
    version: 0.1.0
    appVersion: 1.16.0
    

    1. 生成模板deployment文件

    kubectl create deployment mychart --image=nginx:1.16 -o yml -o yaml --dry-run > deployment.yaml
    

    2. 修改deployment文件

    • deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: {{ .Values.name }} 
    spec:
      replicas: {{ .Values.replicas }} 
      selector:
        matchLabels:
          app: mychart
      template:
        metadata:
          labels:
            app: mychart
        spec:
          containers:
          - image: {{ .Values.image }}:{{ .Values.imageTag }}
            name: nginx
            resources: {}
    

    • values.yaml
    replicas: 3
    name: hello
    image: nginx
    imageTag: 1.17
    

    3. 安装

    helm install hello /root/mychart/
    

    4. 验证

    kubectl get pods -owide
    


    curl -I 192.168.236.233
    


    5. 修改nginx版本并升级

    • values.yaml
    replicas: 3
    name: hello
    image: nginx
    imageTag: 1.12
    

    helm upgrade hello /root/mychart/
    

    helm history hello
    


    6. 回滚到上一个版本

    helm rollback hello 1
    

    kubectl get pods -owide
    


    curl -I 192.168.236.240
    


    7. 将nginx版本下降到1.8

    helm upgrade --set imageTag=1.8 hello /root/mychart/
    

    helm history hello
    



    案例2


     helm create nginx
     cd nginx/
    

    • 目录结构
    ├── charts
    ├── Chart.yaml   # 可以被templates下面的文件引用
    ├── templates
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   ├── ingress.yaml
    │   ├── NOTES.txt
    │   ├── serviceaccount.yaml
    │   ├── service.yaml
    │   └── tests
    │       └── test-connection.yaml
    └── values.yaml  # 定义变量, 可以被templates下面的文件引用
    

    手动deploy

    rm -rf /root/nginx/templates/*
    kubectl create deployment web --image=nginx --dry-run -o yaml>/root/nginx/templates/deployment.yaml
    kubectl apply -f /root/nginx/templates/deployment.yaml
    kubectl expose deployment web --port=80 --target-port=80 --dry-run -o yaml > service.yaml
    

    • deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        app: web
      name: web
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: web
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: web
        spec:
          containers:
          - image: nginx
            name: nginx
            resources: {}
    status: {}
    

    • service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: null
      labels:
        app: web
      name: web
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: web
    status:
      loadBalancer: {}
    

    • 查看pod
    kubectl get pods
    


    • 查看service
    kubectl get svc
    


    helm 安装

    kubectl delete -f /root/nginx/templates/
    kubectl delete -f /root/nginx/
    helm install web /root/nginx/
    


    • 查看部署状态
    helm ls
    


    • 查看dashboard


    helm定义变量安装


    • helm全局变量
    Release.Name release 名称
    Release.Name helm install时候 的 release 名字
    Release.Namespace release 命名空间
    Release.Service release 服务的名称
    Release.Revision release 修订版本号,从1开始累加

    • deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        chart: {{ .Chart.Name }}
        app: {{ .Release.Name }}
      name: {{ .Release.Name }}
    spec:
      replicas: {{ .Values.replicas }}
      selector:
        matchLabels:
          app: {{ .Values.label }}
      template:
        metadata:
          labels:
            app: {{ .Values.label }}
        spec:
          containers:
          - image: {{ .Values.image }}:{{ .Values.imageTag}}
            name: {{ .Release.Name }}
            resources: {}
    status: {}
    

    • service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        chart: {{ .Chart.Name }}
        app: {{ .Release.Name }}
      name: {{ .Release.Name }}
    spec:
      ports:
      - port: {{ .Values.port }}
        protocol: TCP
        targetPort: {{ .Values.targetPort }}
      selector:
        app: {{ .Values.label }}
    

    • values.yaml
    replicas: 3
    image: nginx
    imageTag: 1.17
    label: nginx_label
    port: 80
    targetPort: 80
    

    • Chart.yaml
    apiVersion: v2
    name: nginx
    description: A Helm chart for Kubernetes
    type: application
    version: 0.1.0
    appVersion: 1.16.0
    

    • 安装
     helm install lyysb  /root/nginx/
    

    • 更新
    helm upgrade lyysb --set replicas=1   /root/nginx/
    

    --set 定义的变量的值的优先级最高


    • 删除
    helm delete lyysb
    

    helm语法


    条件判断(if)


    条件判断中被对比的对象不支持数字, 单引号'', 必须使用双引号""

    案例1

    • deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        chart: {{ .Chart.Name }}
        app: {{ .Release.Name }} 
      name: {{ .Release.Name }}
    spec:
      replicas: {{ .Values.replicas }}
      selector:
        matchLabels:
          app: {{ quote .Values.label }}
      template:
        metadata:
          labels:
            app: {{ .Values.label }} 
            {{- if eq .Values.test "lyysb" }}
            develop: lyysb
            {{- else }}
            develop: lyysupersb
            {{- end }}
        spec:
          containers:
          - image: {{ .Values.image }}:{{ .Values.imageTag}}
            name: {{ .Release.Name }}
            resources: {}
    status: {}
    

    • values.yaml
    replicas: 3
    image: nginx
    imageTag: 1.17
    label: nginx_label
    port: 80
    targetPort: 80
    test: 'lyysb'
    

    案例2

    • values.yaml
    replicaCount: 3 
    image:
      repository: nginx
      tag: 1.17
      pullPolicy: IfNotPresent
    imagePullSecrets: []
    nameOverride: ""
    fullnameOverride: ""
    serviceAccount:
      create: true
      name:
    podSecurityContext: {}
    securityContext: {}
    service:
      type: ClusterIP
      port: 80
    ingress:
      enabled: true 
      annotations: {}
      hosts:
        - host: chart-example.local
          paths: []
      tls: []
    resources: {}
    nodeSelector: {}
    tolerations: []
    affinity: {}
    

    • deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        chart: {{ .Chart.Name }}
        app: {{ .Release.Name }} 
      name: {{ .Release.Name }}
    spec:
      replicas: {{ .Values.replicaCount }}
      selector:
        matchLabels:
          app:  {{ .Release.Name }}
          chart:  {{ .Chart.Name }}
      template:
        metadata:
          labels:
            app:  {{ .Release.Name }}
            chart:  {{ .Chart.Name }}
        spec:
          containers:
          - image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
            name: {{ .Release.Name }}
            resources: {}
    status: {}
    

    {{- if .Values.ingress.enabled }}
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: test-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - http:
          paths:
          - path: /testpath
            backend:
              serviceName: test
              servicePort: 80
    {{- end }}
    

    条件判断(with)


    • values.yaml
    nodeSelector: 
      team: a
      gpu: ok 
    

    • deployment.yaml

      {{- toYaml . | nindent 8 }} 可以写成 如下形式

      {{ .team}}

      {{ .gpu }}

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        chart: {{ .Chart.Name }}
        app: {{ .Release.Name }} 
      name: {{ .Release.Name }}
    spec:
      replicas: {{ .Values.replicaCount }}
      selector:
        matchLabels:
          app:  {{ .Release.Name }}
          chart:  {{ .Chart.Name }}
      template:
        metadata:
          labels:
            app:  {{ .Release.Name }}
            chart:  {{ .Chart.Name }}
        spec:
          {{-  with .Values.nodeSelector }}
          nodeSelector:
          {{- toYaml . | nindent 8 }}
          {{- end }}
          containers:
          - image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
            name: {{ .Release.Name }}
            resources: {}
    status: {}
    

    • 验证下
    helm install web2 /root/helm/nginx/ --dry-run 
    


    循环(range)


    • values.yaml
    test: 
      - 'lzzsb'
      - 'lyysb'
      - 'lxxsb'
    

    • configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}
    data: 
      test: 
        {{- range .Values.test }}
        {{ . }}
        {{- end }}
    

    • 验证
    helm install web2 /root/helm/nginx/ --dry-run
    


    变量


    with 无法引用全局变量的解决办法

    • values.yaml
    nodeSelector: 
      team: a
      gpu: ok 
    

    • deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        chart: {{ .Chart.Name }}
        app: {{ .Release.Name }} 
      name: {{ .Release.Name }}
    spec:
      replicas: {{ .Values.replicaCount }}
      selector:
        matchLabels:
          app:  {{ .Release.Name }}
          chart:  {{ .Chart.Name }}
      template:
        metadata:
          labels:
            app:  {{ .Release.Name }}
            chart:  {{ .Chart.Name }}
        spec:
          {{-  with .Values.nodeSelector }}
          nodeSelector:
            name: {{ .Release.Name }}
          {{- toYaml . | nindent 8 }}
          {{- end }}
          containers:
          - image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
            name: {{ .Release.Name }}
            resources: {}
    status: {}
    

    • 此时执行部署会出现报错

      Error: template: nginx/templates/deployment.yaml:22:25: executing "nginx/templates/deployment.yaml" at <.Release.Name>: nil pointer evaluating interface {}.Name


    • 解决方法

      在全局变量前面加上$ 或者 在with 前面将全局变量的值赋值给一个变量, with内调用这个变量

    spec:
          {{-  with .Values.nodeSelector }}
          nodeSelector:
            name: {{ $.Release.Name }}
          {{- toYaml . | nindent 8 }}
          {{- end }}
    

    spec:
          {{- $releasename := $.Release.Name -}}
          {{-  with .Values.nodeSelector }}
          nodeSelector:
            name: {{ $releasename }}
          {{- toYaml . | nindent 8 }}
          {{- end }}
    

    range解压赋值

    • values.yaml
    env:
      jvm.options:
        -Xms128M
        -Xmx128M
      path: /usr/local/elasticsearch-6.6.0/data
      log: /usr/local/elasticsearch-6.6.0/logs
      network: 127.0.0.1
      port: 9200
    

    • deployment.yaml
    spec:
          {{- $releasename := $.Release.Name -}}
          {{-  with .Values.nodeSelector }}
          nodeSelector:
            name: {{ $releasename }}
          {{- toYaml . | nindent 8 }}
          {{- end }}
          containers:
          - image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
            name: {{ .Release.Name }}
            env:
            {{- range $k, $v := .Values.env }}
            - name: {{ $k }}
              value: {{ $v }}
            {{- end }}
            resources: {}
    

    • 验证下
    helm install web2 /root/helm/nginx/ --dry-run
    


    命名模板


    • helper.tpl
    {{- define "name" -}}
    {{ .Chart.Name }}-{{ .Release.Name }}
    {{- end -}}
    
    {{- define "labels" -}}
    chart: {{ .Chart.Name }}-{{ .Chart.Version }}
    app: {{ template "name" . }}
    {{- end -}}
    

    • deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        {{- include "labels" . | nindent 4 }}
      name: {{ template "name" . }}
    spec:
      replicas: {{ .Values.replicaCount }}
      selector:
        matchLabels:
          app:  {{ .Release.Name }}
          chart:  {{ .Chart.Name }}
      template:
        metadata:
          labels:
            app:  {{ .Release.Name }}
            chart:  {{ .Chart.Name }}
        spec:
          {{- with .Values.nodeSelector }}
          nodeSelector:
          {{- toYaml . |nindent 8 }}
          {{- end }}
          containers:
          - image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
            name: {{ .Release.Name }}
            resources: {}
    status: {}
    

    • 验证
    helm install web /root/helm/nginx/ --dry-run
    


    helm搭建私有仓库


    参考: https://blog.51cto.com/14268033/2455006?source=dra


    安装minio服务端

    wget  https://dl.min.io/server/minio/release/linux-amd64/minio
    chmod +x minio
    mkdir  -p  /chart
    ./minio server /chart
    


    • 输入 http://172.16.240.100:9000/minio/login ,通过浏览器访问


    • 在启动日志中获取access key和secret key


    安装minio客户端

    wget  https://dl.min.io/client/mc/release/linux-amd64/mc
    chmod +x mc
    

    连接到服务端

    命令在启动日志中有

    ./mc config host add myminio http://192.168.189.217:9000 minioadmin minioadmin
    

    创建bucket

    ./mc mb myminio/minio-helm-repo
    

    设置bucket和objects匿名访问

    ./mc policy set download myminio/minio-helm-repo
    mkdir /root/helm/repo
    helm repo index helm/repo/
    ./mc  cp  helm/repo/index.yaml  myminio/minio-helm-repo
    

    helm创建与仓库连接的index.yaml文件

    mkdir /root/helm/repo
    helm repo index helm/repo/
    

    helm与minio仓库进行连接


    1. 将index.yaml文件推送到backet中去

    ./mc  cp  helm/repo/index.yaml  myminio/minio-helm-repo
    

    2. helm连接私有仓库

    helm repo add myrepo http://172.16.240.100:9000/minio-helm-repo
    


    3. 更新repo仓库

    helm  repo  update
    


    4 .查看repo

    helm repo list
    


    5. 查看repo中的文件

     ./mc ls helm/repo/
    

  • 相关阅读:
    开放源码的对象关系映射工具ORM.NET 插入数据 Insert/Update Data
    开放源码的对象关系映射工具ORM.NET 快档开发入门 Quick Start
    .NET 动态脚本语言Script.NET 开发指南
    开放源码的对象关系映射工具ORM.NET 删除数据 Deleting Records using ORM.NET
    .NET Remoting过时了吗?为什么公司的项目还是选择用.NET Remoting,而不是WCF?
    开放源码的对象关系映射工具ORM.NET 查看和显示数据 View and Display data using ORM.NET
    开放源码的对象关系映射工具ORM.NET 查询表 调用存储过程 增加自定义代码
    技术人生:坚持,每日一博
    CQRS:CQRS + DDD + MDP 实现快速应用程序开发
    NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用
  • 原文地址:https://www.cnblogs.com/cjwnb/p/12571199.html
Copyright © 2020-2023  润新知