目录
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 客户端安装包
3. 拷贝helm客户端文件helm 到 /opt/kubectl/bin/ 下
cd linux-amd64 mv helm /opt/kube1/bin/ |
4. 安装helm 服务端
检测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为Pod和Replica 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 添加仓库
3.2 查看所有仓库
3.3 更新仓库,如果向仓库中添加了chart 应用,必须更新 仓库
3.3 创建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
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应用
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 文件
4.5 修改 service.yaml 文件
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 访问 应用