Helm入门操作

 

目录

1.helm介绍

 1.1 helm 组件      

 1.2 helm 安装

2. kubernetes 资源对象

2.1 Pod  

2.2 Replication Controller  

2.3 Deployment 

2.4  Service 

3 helm 常用指令

3.1 添加仓库

3.2  查看所有仓库

3.3  更新仓库,如果向仓库中添加了chart 应用,必须更新 仓库

3.3  创建chart 应用 

3.4  安装应用 

3.5  打包应用

3.6 应用升级

3.7 应用回滚

3.8 应用删除

3.9  宿主机通过域名地址访问我们应用  nginx

3.10 宿主机通过端口访问mynginx

4 helm 实战操作

4.1 准备工作     

4.2 创建一个chart应用

4.3 修改value.yaml 文件

4.4 修改 deployment.yaml 文件

4.5  修改 service.yaml 文件

4.6  安装应用

4.7 访问 应用


Helm中文参考文档

https://whmzsu.github.io/helm-doc-zh-cn/quickstart/using_helm-zh_cn.html

1.helm介绍

     Helm 是安装在Kubernetes中的一个客户端工具,主要为了简化Kubernetes对应用的安装,升级操作。

     Helm 由Helm客户端、Tiller服务器端和Chart仓库所组成;Tiller服务器部署在Kubernetes中,Helm客户端从Chart仓库中获取Chart安装包,并将其安装部署到Kubernetes集群中。   

     Helm是管理Kubernetes包的工具,Helm能提供下面的能力:

  • 创建新的charts
  • 将charts打包成tgz文件
  • 与chart仓库交互
  • 安装和卸载Kubernetes的应用
  • 管理使用Helm安装的charts的生命周期

 

      Helm中,有三个需要了解的重要概念:

  • chart:是创建Kubernetes应用实例的信息集合;
  • config:创建发布对象的chart的配置信息
  • release:chart的运行实例,包含特定的config

 1.1 helm 组件      

           在Helm中有两个主要的组件,既Helm客户端和Tiller服务器:

           Helm客户端:这是一个供终端用户使用的命令行工具,客户端负责如下的工作:

  • 本地chart开发
  • 管理仓库
  • 与Tiller服务器交互
  • 发送需要被安装的charts
  • 请求关于发布版本的信息
  • 请求更新或者卸载已安装的发布版本

          Tiller服务器: Tiller服务部署在Kubernetes集群中,Helm客户端通过与Tiller服务器进行交互,并最终与Kubernetes API服务器进行交互。 Tiller服务器负责如下的工作:

  • 监听来自于Helm客户端的请求
  • 组合chart和配置来构建一个发布
  • 在Kubernetes中安装,并跟踪后续的发布
  • 通过与Kubernetes交互,更新或者chart

            客户端负责管理chart,服务器发展管理发布。

 1.2 helm 安装

         第一种方式:通过setup程序,安装k8s集群,则会自动安装helm客户端和服务端。

         第二种方式:手动安装

                 1. 下载 helm客户端安装包

                 2. 解压helm 客户端安装包

tar -zxvf helm-v2.11.0-linux-amd64.tar.gz

                 3. 拷贝helm客户端文件helm 到 /opt/kubectl/bin/ 下

cd linux-amd64

 

 

mv helm /opt/kube1/bin/

 

                 4. 安装helm 服务端  

# 执行安装helm服务端命令:         

helm init --service-account tiller --tiller-namespace kube-system --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.11.0  --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --force-upgrade

               

      检测helm是否安装成功:

# 显示客户端,服务端版本

 

helm version

 

Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}

Server: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}

2. kubernetes 资源对象

2.1 Pod  

         Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。

        一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。

2.2 Replication Controller  

        Controller 可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。

2.3 Deployment 

        Deployment为PodReplica Set(升级版的 Replication Controller)提供声明式更新。

       你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。

 

2.4  Service 

        Service 是对一组提供相同功能的 Pods 的抽象,并为它们提供一个统一的入口。借助 Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service 通过标签来选取服务后端,一般配合 Replication Controller 或者 Deployment 来保证后端容器的正常运行。这些匹配标签的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。

Service 有四种类型:

  • ClusterIP:默认类型,自动分配一个仅 cluster 内部可以访问的虚拟 IP
  • NodePort:在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务。如果 kube-proxy 设置了 –nodeport-addresses=10.240.0.0/16(v1.10 支持),那么仅该 NodePort 仅对设置在范围内的 IP 有效。
  • LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort
  • ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。需要 kube-dns 版本在 1.7 以上。

 

3 helm 常用指令

3.1 添加仓库

helm repo add [name] [url]

 

例如:

     helm repo add k2 http://lib.paastest.nebulogy.com/charts

3.2  查看所有仓库

helm repo list

3.3  更新仓库,如果向仓库中添加了chart 应用,必须更新 仓库

helm repo update

3.3  创建chart 应用 

#  创建一个 demochart 应用, 默认从docker官方仓库 拉取nginx镜像,可以查看 values.yaml文件

 

 

helm create demochart

 

cd demochart

 

tree demochart

 

├── charts                       #  该目录中放置当前Chart依赖的其它Chart

├── Chart.yaml                   #  用于描述Chart的基本信息,包括名称版本等

├── templates                    #  部署文件模版目录,模版使用的值来自values.yaml和由Tiller提供的值

│   ├── deployment.yaml         #   kubernetes Deployment object

│   ├── _helpers.tpl

│   ├── ingress.yaml

│   ├── NOTES.txt

│   └── service.yaml            #   kubernetes Serivce

└── values.yaml                  #  Chart的默认配置文件

3.4  安装应用 

cd demochart    # 切换到创建应用目录

 

 

helm install --name mynginx ./

 

 

# 查看应用是否运行

kubectl get pod

 

NAME                                 READY     STATUS    RESTARTS   AGE

mynginx-demochart-6f6788f898-lfzlc   1/1       Running   0          2m

 

 

# 查看mynginx Pod 对应的 service 

kubectl get svc

 

NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE

kubernetes          ClusterIP   10.68.0.1      <none>        443/TCP   16h

mynginx-demochart   ClusterIP   10.68.66.195   <none>        80/TCP    2m

 

 

# 访问mynginx 应用 (内部方法)

curl  10.68.66.195:80

 

3.5  打包应用

cd demochart

 

 

# 打包应用

helm package ./

 

 

Successfully packaged chart and saved it to: /root/appchart/demochart/demochart-0.1.0.tgz


3.6 应用升级

修改 chart.yaml 文件 ,将version版本从 0.1.0 ----》 0.2.0

 

 

cd demochart

vim Chart.yaml

 

 

    apiVersion: v1

    appVersion: "1.0"

    description: A Helm chart for Kubernetes

    name: demochart

    version: 0.2.0

 

# 打包应用

helm package ./

 

 

# 查询demochart版本

helm search demochart -l

 

 

NAME            CHART VERSION   APP VERSION DESCRIPTION               

local/demochart 0.2.0           1.0         A Helm chart for Kubernetes

local/demochart 0.1.0           1.0         A Helm chart for Kubernetes

 

# 升级demochart 应用

helm upgrade demochart local/demochart

 

 

# 查看demochart 历史版本

helm history demochart

REVISION    UPDATED                     STATUS      CHART           DESCRIPTION    

1           Wed Dec 12 19:08:39 2018    SUPERSEDED  demochart-0.1.0 Install complete

2           Wed Dec 12 19:12:48 2018    DEPLOYED    demochart-0.2.0 Upgrade complet

 

 

 

 

helm list

 

 

NAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE

demochart   2           Wed Dec 12 19:12:48 2018    DEPLOYED    demochart-0.2.0 1.0         default

 

 

可以看到CHART 版本发生了变化,使用0.2.0 版本

 

3.7 应用回滚

helm rollback [ReleaseName] [version]

 

例如:

      helm rollback mynginx  1

 

 

上次我们的CHART 版本使用的是:0.2.0

 

 

helm list

NAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE

demochart   3           Wed Dec 12 19:20:45 2018    DEPLOYED    demochart-0.1.0 1.0         default 

 

 

回滚之后,demochart版本回滚到0.1.0

 

3.8 应用删除

helm delete --purge [releaseName]

例如:

    helm delete --purge mynginx

 

3.9  宿主机通过域名地址访问我们应用  nginx

#卸载 mynginx

helm delete --purge mynginx

 

#安装nginx

cd demochart

helm install --name mynginx ./

 

# 升级 mynginx

helm upgrade mynginx ./ --set ingress.enabled=true --set ingress.hosts[0]=k2.example.172.18.10.41.nip.io

 

 

# 查看ingress

 

kubectl get ing

 

NAME                HOSTS                            ADDRESS   PORTS     AGE

mynginx-demochart   k2.example.172.18.10.41.nip.io             80        7s

 

 

在浏览器输入:k2.example.172.18.10.41.nip.io

3.10 宿主机通过端口访问mynginx

# 修改mynginx 访问方式:采用端口暴露的方式 service.type = NodePort   这种方式外网可以访问我们的应用

 

cd demochart

 

helm upgrade mynginx ./  --set service.type=NodePort

 

# 查看已安装应用,可以看到 mynginx 的 REVISION 变成 2

helm list  

 

NAME    REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE

mynginx 2           Wed Dec 12 15:26:33 2018    DEPLOYED    demochart-0.1.0 1.0         default 

 

 

# 查看 mynginx 应用的服务

kubectl get svc

 

 

NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)       AGE

kubernetes          ClusterIP   10.68.0.1      <none>        443/TCP       17h

mynginx-demochart   NodePort    10.68.66.195   <none>        80:1999/TCP   35m

 

可以看到我们mynginx的访问方式变成了NodePort ,且暴露的端口为1999

 

 

 

 

在浏览器中输入: 虚拟机地址:暴露端口

我自己虚拟机地址:172.18.10.41

 

 

浏览器中输入:http://172.18.10.41:1999/ 访问

 

4 helm 实战操作

4.1 准备工作     

          # 查看是否 添加了私有仓库地址:docker.paastest.nebulogy.com

         cat /etc/docker/daemon.json

     

        

4.2 创建一个chart应用

# 创建应用

 

 

helm create demoappchart

 

 

cd demoappchart

 

 

tree

.

├── charts

├── Chart.yaml

├── templates

│   ├── deployment.yaml

│   ├── _helpers.tpl

│   ├── ingress.yaml

│   ├── NOTES.txt

│   └── service.yaml

└── values.yaml

 

4.3 修改value.yaml 文件

vim value.yaml

 

 

# Default values for demoappchart.

# This is a YAML-formatted file.

# Declare variables to be passed into your templates.

 

replicaCount: 1

 

image:

  # 自己私有仓库项目镜像地址

  repository: docker.paastest.nebulogy.com/docker-maven-demo

  # 镜像项目版本

  tag: v1.0.0

  pullPolicy: IfNotPresent

  # docker私有仓库密钥,保证可以访问docker仓库拉取项目

  pullSecret: registrysecret

 

nameOverride: ""

fullnameOverride: ""

 

service:

  # 修改 service 访问方式  NodePort 端口暴露

  type: NodePort

  port: 80

  # 对外暴露的端口

  nodePort: 30001

 

ingress:

  enabled: false

  annotations: {}

    kubernetes.io/ingress.class: nginx

    kubernetes.io/tls-acme: "true"

  path: /

  hosts:

    chart-example.local

  tls: []

  #  - secretName: chart-example-tls

  #    hosts:

  #      - chart-example.local

 

resources: {}

  # We usually recommend not to specify default resources and to leave this as a conscious

  # choice for the user. This also increases chances charts run on environments with little

  # resources, such as Minikube. If you do want to specify resources, uncomment the following

  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.

  # limits:

  #  cpu: 100m

  #  memory: 128Mi

  # requests:

  #  cpu: 100m

  #  memory: 128Mi

 

nodeSelector: {}

 

tolerations: []

 

affinity: {}

4.4 修改 deployment.yaml 文件

cd templates

 

 

vim deployment.yaml

 

 

apiVersion: apps/v1beta2

kind: Deployment

metadata:

  name: {{ include "demoappchart.fullname" . }}

  labels:

    app.kubernetes.io/name: {{ include "demoappchart.name" . }}

    helm.sh/chart: {{ include "demoappchart.chart" . }}

    app.kubernetes.io/instance: {.Release.Name }}

    app.kubernetes.io/managed-by: {.Release.Service }}

spec:

  replicas: {.Values.replicaCount }}

  selector:

    matchLabels:

      app.kubernetes.io/name: {{ include "demoappchart.name" . }}

      app.kubernetes.io/instance: {.Release.Name }}

  template:

    metadata:

      labels:

        app.kubernetes.io/name: {{ include "demoappchart.name" . }}

        app.kubernetes.io/instance: {.Release.Name }}

    spec:

# deployment 中引入 vulues中 secret

{{- if .Values.image.pullSecret }}

      imagePullSecrets:

        - name: {.Values.image.pullSecret }}

{{- end }}

 

      containers:

        - name: {.Chart.Name }}

          image: "{.Values.image.repository }}:{.Values.image.tag }}"

          imagePullPolicy: {.Values.image.pullPolicy }}

          ports:

            - name: http

              # 容器端口号,和项目端口一致

              containerPort: 8080

              protocol: TCP

          # 探针  检测项目是否存活

          livenessProbe:

            httpGet:

              path: /api/show

              port: http

            initialDelaySeconds: 10

            periodSeconds: 60

          # 探针  检测项目是否启动成功

          readinessProbe:

            httpGet:

              path: /api/show

              port: http

            initialDelaySeconds: 30

            periodSeconds: 60

          resources:

{{ toYaml .Values.resources | indent 12 }}

    {{- with .Values.nodeSelector }}

      nodeSelector:

{{ toYaml . | indent 8 }}

    {{- end }}

    {{- with .Values.affinity }}

      affinity:

{{ toYaml . | indent 8 }}

    {{- end }}

    {{- with .Values.tolerations }}

      tolerations:

{{ toYaml . | indent 8 }}

    {{- end }}

4.5  修改 service.yaml 文件

vim service.yaml

 

 

apiVersion: v1

kind: Service

metadata:

  name: {{ include "demoappchart.fullname" . }}

  labels:

    app.kubernetes.io/name: {{ include "demoappchart.name" . }}

    helm.sh/chart: {{ include "demoappchart.chart" . }}

    app.kubernetes.io/instance: {.Release.Name }}

    app.kubernetes.io/managed-by: {.Release.Service }}

spec:

  type: {.Values.service.type }}

  ports:

    - port: {.Values.service.port }}

      targetPort: http

      # 添加nodePort

      nodePort: {.Values.service.nodePort }}

      protocol: TCP

      name: http

  selector:

    app.kubernetes.io/name: {{ include "demoappchart.name" . }}

    app.kubernetes.io/instance: {.Release.Name }}

4.6  安装应用

# 检测是否有问题

helm lint

 

 

# 检测修改的chart yaml 文件是否正确

helm install --debug --dry-run --name demo-chart ./

 

 

如果没有什么问题,则install安装应用

 

 

helm install --name demo-chart ./

 

 

# 查看应用是否启动完成

kubectl get pod

NAME                                       READY     STATUS    RESTARTS   AGE

demo-chart-demoappchart-86765866bc-wd6zh   1/1       Running   0          34m

 

 

# 查看应用详细信息

kubectl describe pod demo-chart-demoappchart-86765866bc-wd6zh

 

 

# 查看应用服务,访问方式,对外暴露端口

 

 

kubectl get svc

NAME                      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE

demo-chart-demoappchart   NodePort    10.68.34.142   <none>        80:30001/TCP   36m

kubernetes                ClusterIP   10.68.0.1      <none>        443/TCP        1d

4.7 访问 应用

# 在浏览器输入 虚拟机ip:端口/api/show

 

 

172.18.10.41:30001/api/show

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值