k8s之部署helm以及自定义模板

GitHub地址:https://github.com/helm/helm/blob/master/docs/charts.md

介绍

在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本管理和控制,很大程度上简化了 Kubernetes 应用的部署和管理。Helm 本质就是让 K8s 的应用管(Deployment,Service 等 ) 可配置,能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml,service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。
Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart 和 release。chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。
Helm 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示:
在这里插入图片描述Helm 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互。

helm部署
  1. 获取helm

    ntpdate ntp1.aliyun.com
    wget https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz
    tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
    cd linux-amd64/
    cp helm /usr/local/bin/
    
  2. 分配角色
    因为 Kubernetes APIServer 开启了 RBAC 访问控制,所以需要创建 tiller 使用的 service account: tiller 并分配合适的角色给它。这里简单起见直接分配cluster- admin 这个集群内置的 ClusterRole 给它。创建 rbac-config.yaml 文件。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: tiller
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: tiller
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: tiller
      namespace: kube-system
    
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
kubectl create -f rbac-config.yaml
helm init --service-account tiller --skip-refresh
vim /root/.kube/tiller.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: helm
    name: tiller
  name: tiller-deploy
  namespace: kube-system
spec:
  replicas: 1
  strategy: {}
  selector:
    matchLabels:
      app: helm
      name: tiller
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: helm
        name: tiller
    spec:
      automountServiceAccountToken: true
      containers:
      - env:
        - name: TILLER_NAMESPACE
          value: kube-system
        - name: TILLER_HISTORY_MAX
          value: "0"
        image: gcr.io/kubernetes-helm/tiller:v2.13.1
        imagePullPolicy: Never
        livenessProbe:
          httpGet:
            path: /liveness
            port: 44135
          initialDelaySeconds: 1
          timeoutSeconds: 1
        name: tiller
        ports:
        - containerPort: 44134
          name: tiller
        - containerPort: 44135
          name: http
        readinessProbe:
          httpGet:
            path: /readiness
            port: 44135
          initialDelaySeconds: 1
          timeoutSeconds: 1
        resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: helm
    name: tiller
  name: tiller-deploy
  namespace: kube-system
spec:
  ports:
  - name: tiller
    port: 44134
    targetPort: tiller
  selector:
    app: helm
    name: tiller
  type: ClusterIP
status:
  loadBalancer: {}

...

kubectl apply -f tiller.yaml

tiller 默认被部署在 k8s 集群中的 kube-system 这个namespace 下

kubectl get pod -n kube-system -l app=helm 
helm version
  1. 自定义helm模板

     mkdir ./hello-world
     cd ./hello-world
     vim ./Chart.yaml #创建自描述文件 Chart.yaml , 这个文件必须有 name 和 version 定义
    	 name: hello-world 
    	 version: 1.0.0
    
    ./values.yaml
    image:
      repository: daocloud.io/library/nginx
      tag: "latest"
    
     mkdir ./templates 
     vim ./templates/deployment.yaml #创建模板文件, 用于生成 Kubernetes 资源清单
     apiVersion: extensions/v1beta1
     kind: Deployment
     metadata:
       name: hello-world
     spec:
       replicas: 1
       template:
         metadata:
           labels:
             app: hello-world
         spec:
           containers:
             - name: hello-world
               image: {{ .Values.image.repository }}:{{ .Values.image.tag }}  #image: daocloud.io/library/nginx
               ports:
                 - containerPort: 8080
                   protocol: TCP
    
    ./templates/service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: hello-world
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: hello-world
    

    使用命令 helm install RELATIVE_PATH_TO_CHART 创建一次Release

    helm install .
    
    helm ls # 列出已经部署的 Release
    helm status RELEASE_NAME # 查询一个特定的 Release 的状态
    helm delete cautious-shrimp # 移除所有与这个 Release 相关的 Kubernetes 资源
    helm rollback cautious-shrimp 1 #回滚到指定版本
    helm delete --purge cautious-shrimp # 使用 helm delete --purge RELEASE_NAME 移除所有与指定 Release 相关的 Kubernetes 资源和所有这个 Release 的记录
    helm ls --deleted 
    helm install --set image.tag='latest' . # 在 values.yaml 中的值可以被部署 release 时用到的参数 --values YAML_FILE_PATH 或 --set key1=value1, key2=value2 覆盖掉
    helm upgrade -f values.yaml test . # 升级版本
    # 使用模板动态生成K8s资源清单,非常需要能提前预览生成的结果。 使用--dry-run --debug 选项来打印出生成的清单文件内容,而不执行部署
    helm install . --dry-run --debug --set image.tag=latest
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值