k8s--helm部署

292 阅读5分钟

Helm在k8s集群中的部署

(1)将Helm安装在master01节点上

//在github中下载所需版本的二进制 Helm client 安装包
https://github.com/helm/helm/tags 
 
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm version

image.png 添加helm的自动补全功能,方便后续使用:

vim /etc/bashrc
source <(helm completion bash)

image.png

(2)使用 helm 安装 Chart

###helm添加chat的语法格式:
helm repo add  chart仓库名   chart仓库地址
 
###添加常用的chart仓库############
#一个开源项目的仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
#微软chart仓库,推荐使用,内容基本与官方仓库保持一致
helm repo add stable http://mirror.azure.cn/kubernetes/charts
#阿里chart仓库,应有尽有
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#官方仓库,国内网络问题,不太推荐应用
helm repo add incubator https://charts.helm.sh/incubator

image.png

3)对chart仓库的基本使用

 

更新和查看 charts 列表 

helm repo update          
helm repo list 

image.png

查看某chart仓库的可用chart列表 

//查看 stable 仓库可用的 charts 列表
helm search repo stable 

image.png

删除指定的chart仓库

//eg:因为官方仓库使用起来太慢,删除 incubator 仓库
helm repo remove incubator 

image.png

查看 chart 信息

helm show chart stable/mysql     #查看指定 chart 的基本信息

image.png

helm show all stable/mysql         #获取指定 chart 的所有信息

image.png

4)安装 chart

helm install my-redis bitnami/redis [-n default]   #指定 release 的名字为 my-redis,-n 指定部署到 k8s 的 namespace
 
helm install bitnami/redis --generate-name    #不指定 release 的名字时,需使用 –generate-name 随机生成一个名字

image.png

5)对chart的基本管理

 1)查看所有的release

helm ls 
helm list

image.png

 2)查看指定的 release 状态

helm status my-redis 

image.png

 3)删除指定的release

helm uninstall my-redis 

image.png

Helm的自定义模板

charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。

在镜像仓库中拉取chart,查看chart的包结构

#拉取chart 到本地目录(现在所在的目录中)
helm pull stable/mysql
 
#对该拉取的chart压缩包进行解压
tar xf mysql-1.6.9.tgz

image.png

image.png

由上图可以看出:一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。

chart 是包含至少两项内容的helm软件包:

(1)软件包自描述文件 Chart.yaml,这个文件必须有 name 和 version(chart版本) 的定义

(2)一个或多个模板,其中包含 Kubernetes 清单文件:

  • NOTES.txt:chart 的“帮助文本”,在用户运行 helm install 时显示给用户
  • deployment.yaml:创建 deployment 的资源清单文件
  • service.yaml:为 deployment 创建 service 的资源清单文件
  • ingress.yaml: 创建 ingress 对象的资源清单文件
  • _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用

自定义创建一个chart 

(1)使用命令行创建生成一个模板

helm create nginx
 
tree nginx

image.png

cat nginx/templates/deployment.yaml

image.png

在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 nginx/values.yaml 中定义的,只需要修改 nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。

比如在 deployment.yaml 中定义的容器镜像:

image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"

image.png

总结:所以实际操作中,大多数情况下,我们只需要通过操作Chart.yaml和values.yaml文件进行自定义chart的设置,其他文件均是由变量来获取values.yaml中的值

(2)进行模板文件的修改,生成自定义chart

vim nginx/Chart.yaml
apiVersion: v2
name: nginx                     #chart名字
description: A Helm chart for Kubernetes
type: application               #chart类型,application或library
version: 0.1.0                  #chart版本
appVersion: 1.16.0              #application部署版本

image.png

vim nginx/values.yaml
replicaCount: 1
 
image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "latest"                 #设置镜像标签
 
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
 
serviceAccount:
  create: true
  annotations: {}
  name: ""
 
podAnnotations: {}
 
podSecurityContext: {}
  # fsGroup: 2000
 
securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000
 
service:
  type: ClusterIP
  port: 80
 
ingress:
  enabled: true                 #开启 ingress
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: www.test.com         #指定ingress域名
      paths:
        - path: /
          pathType: Prefix      #指定ingress路径类型
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local
 
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi
 
autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80
 
nodeSelector: {}
 
tolerations: []
 
affinity: {}

3)进行chart打包 

//打包 chart
helm lint nginx        #检查依赖和模版配置是否正确
 
helm package nginx     #打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz

image.png

(4)利用自定义chart包进行k8s资源部署

helm install nginx ./nginx --dry-run --debug    #使用 --dry-run 参数验证 Chart 的配置,并不执行安装
 
helm install nginx ./nginx -n default           #部署 chart,release 版本默认为 1
或者
helm install nginx ./nginx-0.1.0.tgz
 
#可根据不同的配置来 install,默认是 values.yaml
helm install nginx ./nginx -f ./nginx/values-prod.yaml

image.png

(5)部署 ingress

wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml

image.png

kubectl get pod,svc -n ingress-nginx
kubectl get ingress

image.png 进行客户机测试:(随便启用一台k8s集群以外的客户机

vim /etc/hosts
192.168.73.107 www.test.com 

image.png

(6)进行修改变动,进行chart的升级更新

//修改为 NodePort 访问后,升级
vim nginx/values.yaml
service:
  type: NodePort
  port: 80
  nodePort: 30080
 
ingress:
  enabled: false
 
vim nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "nginx.fullname" . }}
  labels:
    {{- include "nginx.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
      nodePort: {{ .Values.service.nodePort }}              #指定 nodePort
  selector:
    {{- include "nginx.selectorLabels" . | nindent 4 }}

image.png

image.png

升级 release,release 版本加 1
helm upgrade nginx nginx 

image.png

image.png 进行访问测试:

image.png

7)自定义chart的版本回滚 (根据release版本)

helm history nginx              #查看 release 版本历史
 
helm rollback nginx 1           #回滚 release 到版本1
 
#通常情况下,在配置好 templates 目录下的 kubernetes 清单文件后,后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。

image.png

在命令行使用 --set 指定参数来部署(install,upgrade)release #注:此参数值会覆盖掉在 values.yaml 中的值,如需了解其它的预定义变量参数,可查看 helm 官方文档。 helm upgrade nginx nginx --set image.tag='1.15' (相当于k8s中打补丁设置的方式)