<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DevOps技术分享 &#187; helm</title>
	<atom:link href="http://www.showerlee.com/archives/tag/helm/feed" rel="self" type="application/rss+xml" />
	<link>http://www.showerlee.com</link>
	<description>与你共同学习运维开发</description>
	<lastBuildDate>Mon, 19 Oct 2020 05:51:41 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6</generator>
		<item>
		<title>Kubernetes之Helm包管理</title>
		<link>http://www.showerlee.com/archives/2455</link>
		<comments>http://www.showerlee.com/archives/2455#comments</comments>
		<pubDate>Sat, 14 Apr 2018 05:01:17 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[DevTools]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[helm]]></category>
		<category><![CDATA[k8s]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=2455</guid>
		<description><![CDATA[最近研究了下kubernetes用的比较火的Helm,&#160;Helm作为一个包管理工具, 它把Kuber [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	<a href="http://www.showerlee.com/archives/2455/kubernetes-helm"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2018/04/Kubernetes-Helm.png" alt="Kubernetes-Helm" width="800" height="480" class="alignnone size-full wp-image-2466" /></a>
</p>
<p>
	
</p>
<p>
	最近研究了下kubernetes用的比较火的Helm,&nbsp;Helm作为一个包管理工具, 它把Kubernetes资源(比如deployments、services或 ingress等) 打包到一个chart中，方便我们将其chart保存到chart仓库用来存储和分享, Helm支持发布应用配置的版本管理,&nbsp;<span>使发布可配置, 它最终</span>简化了Kubernetes部署应用的版本控制、打包、发布、删除、更新等操作。
</p>
<p>
	其实Helm和我们的ansible playbook有一些类似的地方就是, 它支持变量预定义, 使我们每一个kube脚本将一些重复的配置使用变量代替, 方便我们对一个project release的管理和批量部署, 升级, 回滚等操作.
</p>
<p>
	
</p>
<p>
	Let's roll out...
</p>
<p>
	
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;"><span style="font-family:Helvetica;background-color:#FFFFFF;"><strong>安装环境</strong></span></span>
</p>
<p>
	Local Desktop: MacOS
</p>
<p>
	Virtual Machine: Virtual Box
</p>
<p>
	Virtual System: CentOS 7.4
</p>
<p>
	Kubernetes: Kubernetes1.9
</p>
<p>
	Docker:&nbsp;17.03.2-ce
</p>
<p>
	Helm:&nbsp;<a href="http://www.showerlee.com/archives/tag/helm" title="查看helm中的全部文章" class="tag_link">helm</a>-v2.7.0
</p>
<p>
	kube-master 10.110.16.10
</p>
<p>
	<span>kube-node-1 10.110.16.11</span>
</p>
<p>
	<span><br />
</span>
</p>
<p>
	<span> </span>
</p>
<p>
	<span style="color:#337FE5;font-family:Helvetica;font-size:16px;background-color:#FFFFFF;"><strong>一. 系统环境配置</strong></span>
</p>
<p>
	<span style="color:#337FE5;">1.</span><span style="color:#337FE5;">关闭SELINUX和firewall</span>
</p>
<p>
	# vi /etc/sysconfig/selinux
</p>
<pre class="prettyprint lang-bsh">...
SELINUX=disabled 
...</pre>
<p><span># setenforce 0</span></p>
<p>
	# systemctl stop firewalld&nbsp; &amp;&amp; systemctl disable firewalld
</p>
<p>
	
</p>
<p>
	<span> </span>
</p>
<p>
	<span style="color:#337FE5;">2</span><span style="color:#337FE5;">.安装<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>环境.</span>
</p>
<p><a href="http://www.showerlee.com/archives/2200" rel="nofollow">http://www.showerlee.com/archives/2200</a></p>
<p>
	
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;"><strong>二. Helm配置</strong></span>
</p>
<p><span style="color:#337FE5;"></span><span style="color:#337FE5;">1.Helm安装</span> </p>
<p>
	<span># wget <a href="https://storage.googleapis.com/kubernetes-" rel="nofollow">https://storage.googleapis.com/kubernetes-</a><a href="http://www.showerlee.com/archives/tag/helm" title="查看helm中的全部文章" class="tag_link">helm</a>/<a href="http://www.showerlee.com/archives/tag/helm" title="查看helm中的全部文章" class="tag_link">helm</a>-v2.7.0-linux-amd64.tar.gz</span>
</p>
<p>
	<span># tar -zxvf <a href="http://www.showerlee.com/archives/tag/helm" title="查看helm中的全部文章" class="tag_link">helm</a>-v2.7.0-linux-amd64.tar.gz</span>
</p>
<p>
	<span># mv linux-amd64/<a href="http://www.showerlee.com/archives/tag/helm" title="查看helm中的全部文章" class="tag_link">helm</a> /usr/local/bin/</span>
</p>
<p>
	<span><br />
</span>
</p>
<p>
	<span style="color:#337FE5;">2.添加tiller到<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a> service account</span>
</p>
<p>
	<span># kubectl create serviceaccount --namespace kube-system tiller</span>
</p>
<p>
	<span># kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller</span>
</p>
<p>
	<span># kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'</span>
</p>
<p>
	<span><br />
</span>
</p>
<p>
	<span><span style="color:#337FE5;">3.</span><span style="color:#337FE5;">使用阿里云tiller镜像以及tiller账户</span><span style="color:#337FE5;">初始化helm, 将tiller部署到<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a> deployment下.</span></span>
</p>
<p>
	<span><span style="color:#337FE5;"><span style="color:#000000;"># vi ~/.helm/repository/repositories.yaml</span><br />
</span></span>
</p>
<p>
	<span><span style="color:#337FE5;"><span style="color:#000000;"><span style="color:#E53333;">Tip: username, password为你的阿里云账号密码</span><br />
</span></span></span>
</p>
<p>
	<span><span style="color:#337FE5;"><span style="color:#000000;"> </span></span></span>
</p>
<pre class="prettyprint">apiVersion: v1
generated: 2018-04-13T23:48:19.490774427-04:00
repositories:
- caFile: ""
  cache: /root/.helm/repository/cache/stable-index.yaml
  certFile: ""
  keyFile: ""
  name: stable
  password: "password"
  url: <a href="https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts" rel="nofollow">https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts</a>
  username: "username"
- caFile: ""
  cache: /root/.helm/repository/cache/local-index.yaml
  certFile: ""
  keyFile: ""
  name: local
  password: ""
  url: <a href="http://127.0.0.1:8879/charts" rel="nofollow">http://127.0.0.1:8879/charts</a>
  username: ""</pre>
<p>
	<span>#&nbsp; helm init --service-account tiller --upgrade --tiller-image=registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.7.0</span>
</p>
<p>
	<span><span style="color:#E53333;">Tip: 这里helm可以理解为一个操作tiller服务的客户端, tiller作为部署到<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>下的一个deployment, 负责去将我们的chart脚本解析给<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>去做进一步的部署工作.</span><br />
</span>
</p>
<p>
	<span><br />
<span style="color:#337FE5;">4.检查tiller是否部署到k8s</span></span>
</p>
<p>
	# kubectl get pods --namespace kube-system
</p>
<pre class="prettyprint lang-bsh">NAME                                  READY     STATUS    RESTARTS   AGE
etcd-kube-master                      1/1       Running   0          26d
kube-apiserver-kube-master            1/1       Running   0          26d
kube-controller-manager-kube-master   1/1       Running   1          26d
kube-dns-6f4fd4bdf-54smn              3/3       Running   0          26d
kube-flannel-ds-gwl2z                 1/1       Running   0          26d
kube-flannel-ds-m754s                 1/1       Running   0          26d
kube-proxy-697qx                      1/1       Running   0          26d
kube-proxy-cvfd9                      1/1       Running   0          26d
kube-scheduler-kube-master            1/1       Running   1          26d
tiller-deploy-cf797bfbf-rnk4k         1/1       Running   0          1h</pre>
<p>
	
</p>
<p>
	<span> <span style="color:#337FE5;">5.创建一个chart范例</span></span>
</p>
<p>
	<span># helm create helm-chart</span>
</p>
<p>
	<span># tree ./helm-chart<br />
</span>
</p>
<pre class="prettyprint lang-bsh">./helm-chart
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   └── service.yaml
└── values.yaml</pre>
<p>
	<span style="color:#E53333;">Tip: 可以看到helm默认创建了一个chart表结构, 这里的templates下面放的大部分为k8s的部署脚本, values.yaml和chart.yaml为主要的参数文件存放一些变量供k8s yaml文件调用, 有需要的小伙伴可以将自己的k8s脚本与默认进行替换.</span>
</p>
<p>
	<span><br />
<span style="color:#337FE5;">6.检查chart语法</span></span>
</p>
<p>
	<span># helm lint ./helm-chart</span>
</p>
<p>
	<span><br />
<span style="color:#337FE5;">7.使用默认chart部署到k8s</span></span>
</p>
<p>
	<span># helm install --name example1 ./helm-chart --set service.type=NodePort</span>
</p>
<p>
	<span><span style="color:#E53333;">Tip: 这里 --name命名我们这个chart release的名称,&nbsp;</span><span style="color:#E53333;">--set service.type=NodePort为将我们的任意node的ip映射到我们部署的pod, 以供访问.</span><span style="color:#E53333;"></span></span>
</p>
<p>
	<span> </span>
</p>
<pre class="prettyprint lang-bsh"># helm install --name example1 ./helm-chart --set service.type=NodePort
NAME:   example1
LAST DEPLOYED: Sat Apr 14 01:08:16 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==&gt; v1/Service
NAME                 TYPE      CLUSTER-IP     EXTERNAL-IP  PORT(S)       AGE
example1-helm-chart  NodePort  10.105.111.66  &lt;none&gt;       80:25146/TCP  0s

==&gt; v1beta1/Deployment
NAME                 DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
example1-helm-chart  1        1        1           0          0s

==&gt; v1/Pod(related)
NAME                                  READY  STATUS             RESTARTS  AGE
example1-helm-chart-7975cbf9b7-86vx5  0/1    ContainerCreating  0         0s


NOTES:
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services example1-helm-chart)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo <a href="http://$NODE_IP:$NODE_PORT" rel="nofollow">http://$NODE_IP:$NODE_PORT</a></pre>
<p>我们可以使用上面的NOTES去访问我们的部署网站</p>
<p>
	
</p>
<p>
	<span># curl 10.110.16.10:25146</span>
</p>
<p>
	<span> </span>
</p>
<pre class="prettyprint lang-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
&lt;style&gt;
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;
&lt;p&gt;If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.&lt;/p&gt;

&lt;p&gt;For online documentation and support please refer to
&lt;a href="http://nginx.org/"&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;
Commercial support is available at
&lt;a href="http://nginx.com/"&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;/em&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>
	
</p>
<p>
	<span> </span>
</p>
<p>
	<span style="color:#337FE5;">8.查看当前的部署列表</span>
</p>
<p>
	# helm ls
</p>
<pre class="prettyprint lang-bsh">NAME    	REVISION	UPDATED                 	STATUS  	CHART           	NAMESPACE
example1	1       	Sat Apr 14 01:08:16 2018	DEPLOYED	helm-chart-0.1.0	default</pre>
<p># kubectl get deployment</p>
<pre class="prettyprint lang-bsh">NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
example1-helm-chart   1         1         1            1           4m</pre>
<p>
	
</p>
<p>
	<span> <span style="color:#337FE5;">9.打包chart</span></span>
</p>
<p>
	<span># helm package ./helm-chart --debug</span>
</p>
<p>
	<span><br />
<span style="color:#337FE5;">10.使用包去做release部署</span></span>
</p>
<p>
	<span># helm install --name example2 helm-chart-0.1.0.tgz --set service.type=NodePort</span>
</p>
<p>
	
</p>
<p>
	<span> <span style="color:#337FE5;">11.升级当前release</span></span>
</p>
<p>
	<span># helm upgrade example2 ./helm-chart</span>
</p>
<p>
	<span><br />
<span style="color:#337FE5;">12.回滚当前release</span></span>
</p>
<p>
	# helm rollback example2 1
</p>
<p>
	<span><br />
<span style="color:#337FE5;">13.删除该release</span></span>
</p>
<p>
	<span># helm delete example2</span>
</p>
<p>
	<span>#&nbsp;helm del --purge example2</span>
</p>
<p>
	<span><br />
<span style="color:#337FE5;">14.查看release历史删除记录</span></span>
</p>
<p>
	<span><span style="color:#337FE5;"><span style="color:#E53333;">Tip: 如果删除时未使用</span><span style="color:#E53333;">--purge参数可查看删除记录</span></span></span>
</p>
<p>
	<span># helm ls --deleted -d</span>
</p>
<p>
	<span> </span>
</p>
<pre class="prettyprint lang-bsh">NAME    	REVISION	UPDATED                 	STATUS 	CHART           	NAMESPACE
example2	2       	Sat Apr 14 00:14:54 2018	DELETED	helm-chart-0.1.0	default</pre>
<p>
	
</p>
<p>
	这里作者就不继续介绍helm chart的一些语法结构了, 有需要的小伙伴可以直接访问Helm官方去查看相关文档
</p>
<p><a href="https://docs.helm.sh" rel="nofollow">https://docs.helm.sh</a></p>
<p>
	
</p>
<p>
	Finished...</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/2455">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="Kubernetes之Helm包管理" href="http://www.showerlee.com/archives/2455">http://www.showerlee.com/archives/2455</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/2455/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
