惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
NISL@THU
NISL@THU
S
Secure Thoughts
P
Palo Alto Networks Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
AWS News Blog
AWS News Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
L
LINUX DO - 最新话题
L
LINUX DO - 热门话题
O
OpenAI News
C
Cyber Attacks, Cyber Crime and Cyber Security
Google DeepMind News
Google DeepMind News
Schneier on Security
Schneier on Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
www.infosecurity-magazine.com
www.infosecurity-magazine.com
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
Forbes - Security
Forbes - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Securelist
S
Security Affairs
博客园 - 三生石上(FineUI控件)
V2EX - 技术
V2EX - 技术
Apple Machine Learning Research
Apple Machine Learning Research
D
Darknet – Hacking Tools, Hacker News & Cyber Security
人人都是产品经理
人人都是产品经理
IT之家
IT之家
T
Threat Research - Cisco Blogs
博客园 - 司徒正美
J
Java Code Geeks
C
Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
N
News and Events Feed by Topic
P
Privacy International News Feed
V
Visual Studio Blog
博客园_首页
量子位
C
Cybersecurity and Infrastructure Security Agency CISA
Y
Y Combinator Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
The Exploit Database - CXSecurity.com
Security Archives - TechRepublic
Security Archives - TechRepublic
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
News and Events Feed by Topic
D
DataBreaches.Net
The Cloudflare Blog

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程 开发 Tips(5)
Kubernetes 的包管理器 -- Helm
微信公众号 · 2019-07-24 · via 陈少文的网站

1. 为什么需要 Helm

Kubernetes 中一个重要的设计理念就是,声明式的操作。用户通过设置系统的预期状态来改变系统。例如,现在的副本数量是 2 ,需要调整为 3。声明式的处理方式是,修改配置文件中副本数量为 3 ;命令式的处理方式是,发送增加一个副本的命令,+1。

使用申明式配置的系统更关注结果,对系统设计要求更高。在分布式系统中,任何组件都不是 100 % 可靠的,对使用者来说,声明式配置的系统更加友好。

Kubernetes 采用 yaml 作为配置文件。在 Kubernetes 中部署一个简单的 Jenkins 服务,就得写两个 yaml 文件: jenkins-deployment.yaml 和 jenkins-service.yaml。参考,Kubectl 部署 Jenkins 。再加上其他服务,考虑到多套环境,需要维护的 yaml 文件数量会很大。

直接维护 yaml,进行部署 ,既不利于项目组织,也不利于维护更新。我们需要一个工具简化应用部署和管理流程。

2. 什么是 Helm

Helm 是 Deis 发起的一个 Kubernetes 包管理器,类似于 Linux 中的 apt 和 yum 工具。Deis 公司已经被微软收购。

2.1 基本概念

  • Chart

Chart 用来封装 yaml 文件,包含了运行应用所需的镜像、依赖、资源、服务定义等。

  • Release

Chart 在 Kubernetes 集群上的实例。每次安装都会创建一个新的 Release ,一个 Chart 可以对应很多个实例。

  • Repository

用于发布和存储 Chart 的仓库。

2.2 基本组件

Helm 采用 C/S 架构,组件有:

  • Helm CLI

Helm CLI 是 Helm 客户端,运行在本地,负责与其他组件的交互。

  • Tiller

Tiller 是服务器端组件,运行在 Kubernetes 集群上,用于管理 Helm 部署的应用。

  • Repository

Repository 是 Chart 仓库。

2.3 Helm 提供的功能

  • 应用打包
  • 应用分发
  • 版本管理
  • 依赖检查

3. Chart

通过创建特定目录结构的文件夹,chart 描述了一组应用资源,用于指导应用部署。

Wordpress 的 chart 包结构:

1
2
3
4
5
6
7
8
9
Wordpress/
  Chart.yaml          # Yaml文件,用于描述 Chart 的基本信息,包括名称版本等
  LICENSE             # [可选] 文本格式的协议
  README.md           # [可选] 应用介绍、使用说明
  requirements.yaml   # [可选] 用于存放当前 Chart 依赖的其它 Chart 的说明文件
  values.yaml         # Chart 的默认值配置文件
  charts/             # [可选] 该目录中放置当前 Chart 依赖的其它 Chart
  templates/          # [可选] 部署文件模版目录,模版填入 values.yaml 中相应值,生成最终的 kubernetes 配置文件
  templates/NOTES.txt # [可选] 使用指南

Chart.yaml 文件内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: [必须] Chart API 版本,可用值 v1
name: [必须] Chart 名称
version: [必须] 版本,遵循 [SemVer 2 标准](https://semver.org/)
kubeVersion: [可选] 兼容的 Kubernetes 版本,遵循 [SemVer 2 标准](https://semver.org/)
description: [可选] 一句话的应用描述
keywords:
  - [可选] 应用关键字列表
home: [可选] 应用主页 URL
sources:
  - [可选] 当前应用下载地址列表
maintainers: [可选]
  - name: [必须] name
    email: [可选] email
    url: [可选] url
engine: [可选] 模板引擎,默认值是 gotpl
icon: [可选] SVG 或者 PNG 格式的图片地址
appVersion: [可选] 应用版本
deprecated: [可选] boolean 类型,是否不建议使用
tillerVersion: [可选] Chart 需要的 Tiller 版本,遵循 [SemVer 2 标准](https://semver.org/),需要 ">2.0.0"

4. 安装和使用

由于 Helm 采用的是 C/S 架构,安装分为两部分: 客户端和服务器。不同操作系统,具体命令会有所不同,可以参考 Helm 官方指导文档。这里以 OS X 客户端和 CentOS 服务端 minikube 为例。

4.1 客户端安装

OS X 执行:

1
brew install kubernetes-helm

CentOS 执行:

1
2
3
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.2-linux-amd64.tar.gz
tar -zxvf helm-v2.12.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

查看镜像源:

1
2
3
4
helm repo list
NAME  	URL
stable	https://kubernetes-charts.storage.googleapis.com
local 	http://127.0.0.1:8879/charts

建议更新镜像源:

1
2
helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories

4.2 服务端安装

  • 安装 tiller

由于配置了远程开发环境(参考: 搭建远程 Kubernetes 开发环境),在 OS X 上执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
helm init --history-max 200
Creating /Users/username/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /Users/username/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation

对于 Kubernetes 1.16.0 以上的版本,会碰到 Error: error installing: the server could not find the requested resource 。这是由于 extensions/v1beta1 已经被 apps/v1 替代。执行如下命令进行安装:

1
helm init --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -

tiller 将被安装到 kube-system 空间中,可以通过 kubectl get pods --namespace kube-system 命令查看。

  • 创建访问角色

执行命令:

1
2
3
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

4.3 查看 Helm 是否可用

执行 helm version 命令时,会检查本地和服务器安装是否就绪。

1
2
3
4
helm version
helm  version
Client: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}

如果 Server 端报错,可能是由于 Node 节点上缺失某些包导致,例如,socat 。需要登录服务器,执行 yum install -y socat

4.4 创建一个 Chart 部署

  • 新建一个 chart
1
2
helm create hello-chart
Creating hello-chart

在 values.yaml 中,可以看到,默认创建的是一个 Nginx 应用。为了方便外网访问测试,将 values.yaml 中 service 的属性修改为:

1
2
3
service:
  type: NodePort
  port: 30003
  • 部署到服务器
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
helm install ./hello-chart
NAME:   alert-koala
LAST DEPLOYED: Wed Jul 24 14:21:58 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME                     READY  UP-TO-DATE  AVAILABLE  AGE
alert-koala-hello-chart  0/1    1           0          1s

==> v1/Pod(related)
NAME                                      READY  STATUS   RESTARTS  AGE
alert-koala-hello-chart-86cdd48bfc-b9dqv  0/1    Running  0         1s

==> v1/Service
NAME                     TYPE      CLUSTER-IP     EXTERNAL-IP  PORT(S)          AGE
alert-koala-hello-chart  NodePort  10.10.10.10  <none>       30003:32046/TCP  1s
  • 查看部署应用

稍等几秒,应用就运行起来了。打开地址: http://10.10.10:32046 ,即可看到 Nginx 的页面。

  • 查看 release
1
2
3
4
helm list
helm list
NAME       	REVISION	UPDATED                 	STATUS  	CHART            	APP VERSION	NAMESPACE
alert-koala	1       	Wed Jul 24 14:21:58 2019	DEPLOYED	hello-chart-0.1.0	1.0        	default
  • 打包 chart
1
2
3
helm package hello-chart
helm package hello-chart
Successfully packaged chart and saved it to: /Users/username/Code/Kubernetes/hello-chart-0.1.0.tgz

注意,需要在 hello-chart 所在上一级目录执行。打包就是压缩 hello-chart 文件夹为一个 tgz 文件。

  • 删除 release:
1
2
helm delete alert-koala --purge
release "alert-koala" deleted

删除之后,应用也就被移除。

5. 参考