A、ヘルムを導入しました
helm
ベースであるkubernetes
パッケージマネージャが。それは内だkubernetes
と同じようにyum
、その中にcentos
、pip
それをpython,npm
しますjavascript
それはhelm
それを助けることは、クラスタの管理のために導入しましたか?
- より簡単のような、インフラストラクチャを展開
gitlab
、postgres
、prometheus
、grafana
等 - もっと簡単に使用して、企業内のプロジェクトのために独自のアプリケーション、コンフィギュレーションチャートを展開
helm
単純なコマンドラインなどのアプリケーション展開K8Sに、CIの組み合わせを
1、ヘルム使用
ヘルムは、チャート、チャートにパッケージ化(などの展開、サービス、または入力、など)Kubernetesリソースを入れて、チャートが倉庫に保存されます。店舗と共有チャートを使用チャート倉庫によって。舵がそのリリース、アプリケーションの構成を簡素化バージョン管理Kubernetesデプロイアプリケーション、包装、解除、削除、更新などの操作を公開バージョン管理支援ように構成することができます。
APT UbuntuとCentOSのと少し似charts--事前設定されたインストールパッケージのリソースを、管理するためのパッケージ管理ツールのKubernetesとしてYUMです。
ヘルムは機能があります。
- 新しいグラフを作成します。
- TGZにパッケージグラフの形式
- 倉庫をグラフにグラフや倉庫のダウンロードチャートからのアップロード
- Kubernetesのクラスタチャートをインストールまたはアンインストール
- ヘルムで管理リリースサイクルは、チャートをマウント
使用ヘルムは、次のことを行うことができます。
- 管理Kubernetesマニフェストファイル
- ヘルムのインストールパッケージ管理チャート
- Kubernetesアプリケーションチャートの分布に基づいて、
2、ヘルムコンポーネントと関連用語
ヘルムヘルムと接触した際に発生する一般的な問題は、いくつかの概念や用語が非常に混乱していることですが、私はヘルムは、この問題が発生した学び始めました。
したがって、これらの概念とヘルムの用語での見てみましょう。
パッケージ管理ツール:
-
ヘルム:Kubernetesアプリケーションパッケージ化ツールだけでなく、コマンドラインツールの名前。
-
ヘルムCLI:ヘルムをローカルに実行することができ、クライアントであります
-
ティラー:ヘルムズサーバは、関連するコマンドのヘルムを処理するKubernetesクラスタにデプロイ。
役割ヘルム:centos7のyumコマンド、パッケージ管理が、管理ヘルムのような、ここではK8Sインストール上のさまざまなコンテナです。
ロール・ティラー:デポのcentos7のような、のような単純/etc/yum.repos.dディレクトリの下にxxx.repoのような。
-
Repoistory:ヘルムデポ、リポジトリは、ダウンロードのためのチャートパッケージを保持している、基本的にWebサーバで、クエリのチャートパックマニフェストファイルのリポジトリがあります。使用する場合、ヘルムは、いくつかの異なるリポジトリをドッキングすることができます。
-
チャート:ヘルムはミラー動作kubernetes必要なアプリケーション、依存関係とリソース定義を含むパッケージです。
-
リリース:アプリケーションのインスタンスを実行しているチャートの後、取得します。
特別な注意が必要で、通常はコンセプトバージョンで言及リリースヘルム、我々はリリースはこちらヘルムのためのアプリケーションパッケージの展開チャートの例を使用して理解することができる、異なっています。
実際には、リリースヘルムで、より適切な展開と呼ばれます。コンセプトはKubernetes使用されていますので、展開の推定値は、したがって、リリースヘルムは、この用語を採用しました。
コマンド
http://hub.kubeapps.com/
completion # 为指定的shell生成自动完成脚本(bash或zsh)
create # 创建一个具有给定名称的新 chart
delete # 从 Kubernetes 删除指定名称的 release
dependency # 管理 chart 的依赖关系
fetch # 从存储库下载 chart 并(可选)将其解压缩到本地目录中
get # 下载一个命名 release
help # 列出所有帮助信息
history # 获取 release 历史
home # 显示 HELM_HOME 的位置
init # 在客户端和服务器上初始化Helm
inspect # 检查 chart 详细信息
install # 安装 chart 存档
lint # 对 chart 进行语法检查
list # releases 列表
package # 将 chart 目录打包成 chart 档案
plugin # 添加列表或删除 helm 插件
repo # 添加列表删除更新和索引 chart 存储库
reset # 从集群中卸载 Tiller
rollback # 将版本回滚到以前的版本
search # 在 chart 存储库中搜索关键字
serve # 启动本地http网络服务器
status # 显示指定 release 的状态
template # 本地渲染模板
test # 测试一个 release
upgrade # 升级一个 release
verify # 验证给定路径上的 chart 是否已签名且有效
version # 打印客户端/服务器版本信息
dep # 分析 Chart 并下载依赖
3、コンポーネントアーキテクチャ
Helm Client
それは次のように責任があるユーザーのコマンドラインツール、次のとおりです。
- ローカルの開発・チャート
- 倉庫管理
- ティラーサーバ相互作用を持ちます
- チャートを送信プリインストールされています
- クエリのリリース情報
- アップグレードまたは既存のリリースをアンインストールするために必要な
Tiller Server
展開ですKubernetes
ヘルムクライアント、Kubernetes APIサーバの相互作用であるクラスタ内のサーバが。ティラーサーバーは、以下の役割があります。
- ヘルムクライアントはからの要求をリッスン
- チャートの建設は、その構成によって解放します
- インストールのチャートがする
Kubernetes
クラスタ、およびそれ以降のリリースを追跡します - することで
Kubernetes
、インタラクティブチャートをアップグレードまたはアンインストールします - 簡単に言えば、クライアント管理チャート、およびサーバーの管理と出版リリース
ヘルムクライアント
ヘルムクライアントはチャート、reprepositoryとリリースの管理を担当するコマンドラインツールです。これはティラーに要求を送信し、それはKubernetesリソースティラー対応によって管理さgPRC APIである(ローカルポートへのマッピングティラーのkubectlポートフォワード使用し、次いで分げつと通信ポートを介してマッピングされました)。
サーバーティラー
ティラー舵は、クライアントからの要求を受けて、管理を担当Kubernetes関連リソース、(など、クエリ、更新をインストール、または削除)とトラッキングKubernetesリソースへの操作を送信します。管理を容易にするために、情報の分げつ放出は内ConfigMapのkubernetesに格納されています。
外国エクスポージャーgRPC APIの分げつ、舵のためのクライアント・コール。
4、動作原理
プロセスをインストールします。チャート:
- 指定されたディレクトリやファイルをtgzから構成情報を解析ヘルムチャート
- ヘルムチャートの設定とgRPC通じティラー値に指定された情報
- ティラーと放出値にグラフを生成し、
- リリースティラーはKubernetesランに送信されます。
アップデートプロセスをチャート:
- 指定されたディレクトリやファイルをtgzから構成情報を解析ヘルムチャート
- ヘルムはティラーに情報を値、リリースチャートの名前と構造を更新されます
- 生成し、アップデートリリースは、リリース履歴の名前を指定しティラー
- ティラーはKubernetes実行リリースに送信されます
ロールバックチャート
- 舵はティラーにリリース名をロールバックされます
- 歴史の名前をリリースによるとティラー検索
- リリースにティラーから取得した履歴
- 現在のリリースkubernetesを置き換えるために送られたリリースにティラー
チャート依存症治療
Kubernetesに渡しながら、チャートの処理でティラー、およびすべてのチャートは、その依存リリースの一つに直接チャート。ブートシーケンスの間の依存関係を管理するための責任を負いませんので、ティラー。アプリケーションは、これらの依存関係をグラフに処理できるようにする必要があります。
第二に、展開ヘルムインストールツール(クライアント)
前提条件
- 上記Kubernetes1.5
- クラスタは、ミラーリポジトリにアクセスすることができます
- ヘルムコマンド実行ホストがkubernetesに、クラスタにアクセスすることができます
(1)パックの舵をダウンロード
[root@master ~]#docker pull gcr.io/kubernetes-helm/tiller:v2.14.3
[root@master ~]# wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
(2)ローカルコピーにヘルムコマンドパケット
[root@master helm]# mv linux-amd64/helm /usr/local/bin/
//移动命令目录到/usr/local/bin/
[root@master helm]# chmod +x /usr/local/bin/helm
//给予执行权限
[root@master helm]# helm help
//验证是否安装成功
(3)Setコマンドの自動補完
[root@master helm]# echo 'source <(helm completion bash)' >> /etc/profile
[root@master helm]# . /etc/profile
//刷新一下
2、インストールティラーサーバ(サーバ、あなたが許可されたユーザを作成する必要があります)
[root@master ~]# vim tiller-rbac.yaml #创建授权用户
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
実装について
[root@master ~]# kubectl apply -f tiller-rbac.yaml
環境の初期化(1)のティラーサーバ
[root@master helm]# helm init --service-account=tiller
//helm的服务端就是Tiller(因为是访问外国的网站,可能需要多次执行)
ルック
[root@master helm]# kubectl get deployment. -n kube-system
今になってないことが判明し、それがあるため、Googleのデフォルトのダウンロードミラーのダウンロードされていません
(2)aliyunにミラー元に配置され
[root@master helm]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
ルック
[root@master helm]# helm version
図3は、インスタンスヘルムの展開は、リリース名-n +チャートをインストールします。
1、このリリースについての説明。
2、このリリースのリソースの説明。
3、どのようにこのリリースを使用します。
(1)ヘルムは、MySQLサービスをインストールする展開。
[root@master ~]# helm search mysql
//查看关于mysqk的Charts包
[root@master ~]# helm install stable/mysql -n mysql
//基于stable/mysql包安装一个名为MySQL的服务
ルック
[root@master ~]# helm list
チャートアンパックディレクトリ後(2):
[root@master ~]# cd .helm/cache/archive
//查看helm缓存
[root@master archive]# ls
[root@master mysql]# helm fetch stable/mysql
//直接下载stable/mysql的chart包
[root@master archive]# tar -zxf mysql-0.3.5.tgz
//解压一下MySQL包
[root@master archive]# tree -C mysql
//树状图查看解压出来的mysql目录,-C:显示颜色
Chart.yaml:このチャートパック要約情報。(名前およびバージョン2は、任意他の必須です。)
READMEは、MD:このグラフはパッケージヘルプドキュメントを使用しています。
テンプレート:チャートオブジェクト内のリソースのテンプレートパック。
deployment.yaml:ゴーテンプレートファイルの配布コントローラ
helpers.tpl:以 开头的文件不会部署到 k8s 上,可用于定制通用信息
NOTES.txt:Chart 部署到集群后的一些信息
service.yaml:service 的 Go 模板文件
values.yaml:是这个chart包的默认的值,可以被templet内的yaml文件使用。
(3)Helm部署安装-个Mysql服务。
[root@master ~]# docker pull mysql:5.7.14
[root@master ~]# docker pull mysql:5.7.15
[root@master ~]# docker pull busybox:1.25.0
下载所需的mysql镜像
[root@master ~]# helm delete mysql --purge
//删除之前的MySQL服务并清除缓存
(4)设置共享目录
[root@master ~]# yum -y install rpcbind nfs-utils
//安装nfs
[root@master ~]# mkdir /data
//创建共享目录
[root@master ~]# vim /etc/exports
/data *(rw,sync,no_root_squash)
//设置共享目录权限
[root@master ~]# systemctl restart rpcbind
[root@master ~]# systemctl restart nfs-server
//重启nfs服务
测试一下
[root@master ~]# showmount -e
(5)创建pv
[root@master xgp]# vim nfs-pv1.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysqlpv
spec:
capacity:
storage: 8Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data/mysqlpv
server: 192.168.1.21
[root@master xgp]# mkdir /data/mysqlpv
//创建所需目录
执行一下
[root@master xgp]# kubectl apply -f nfs-pv1.yml
查看一下
[root@master xgp]# kubectl get pv
(6)创建一个mysql服务
[root@master xgp]# helm install stable/mysql -n bdqn-mysql --set mysqlRootPassword=123.com
查看一下
[root@master xgp]# kubectl get pod
(7)进入pod并查看一下
[root@master xgp]# kubectl exec -it bdqn-mysql-mysql-7b89c7b99-8ff2r -- mysql -u root -p123.com
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
4、mysql服务的升级与回滚
(1)mysql服务的升级
[root@master mysql]# helm upgrade --set imageTag=5.7.15 bdqn-mysql stable/mysql -f values.yaml
查看一下
[root@master mysql]# kubectl get deployments. -o wide
(2)mysql服务的回滚
[root@master mysql]# helm history bdqn-mysql
//查看历史版本
回滚到版本一
[root@master mysql]# helm rollback bdqn-mysql 1
查看一下
[root@master mysql]# kubectl get deployments. -o wide
三、小实验
在部署mysql的时候,如何开启storageclass,以及如何将service资源对象的类型更改为NodePort, 如何使用?
将上述部署的实例进行升级回滚操作。升级的时候镜像改为: mysql:5.7.15版本。回滚到最初的版本。
1、基于NFS服务,创建NFS服务。
下载nfs所需安装包
[root@node02 ~]# yum -y install nfs-utils rpcbind
创建共享目录
[root@master ~]# mkdir -p /xgp/wsd
创建共享目录的权限
[root@master ~]# vim /etc/exports
/xgp *(rw,sync,no_root_squash)
开启nfs和rpcbind(三台都要)
[root@master ~]# systemctl start nfs-server.service
[root@master ~]# systemctl start rpcbind
测试一下
[root@master ~]# showmount -e
2、创建StorageClass资源对象。
(1)创建rbac权限。
[root@master yaml]# vim rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-provisioner-runner
namespace: default
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get","create","list", "watch","update"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-provisioner"]
verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: default #必写字段
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
执行一下
[root@master yaml]# kubectl apply -f rbac.yaml
(2)创建Deployment资源对象,用Pod代替 真正的NFS服务。
[root@master yaml]# vim nfs-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: xgp
- name: NFS_SERVER
value: 192.168.1.21
- name: NFS_PATH
value: /xgp/wsd
volumes:
- name: nfs-client-root
nfs:
server: 192.168.1.21
path: /xgp/wsd
执行一下
[root@master yaml]# kubectl apply -f nfs-deployment.yaml
查看一下
[root@master yaml]# kubectl get pod
(3)创建storageclass的yaml文件
[root@master yaml]# vim xgp-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: xgp-nfs
provisioner: xgp #通过provisioner字段关联到上述Deploy
reclaimPolicy: Retain
执行一下
[root@master yaml]# kubectl apply -f test-storageclass.yaml
查看一下
[root@master yaml]# kubectl get sc
3、创建一个mysql服务
[root@master ~]# docker pull mysql:5.7.14
[root@master ~]# docker pull mysql:5.7.15
[root@master ~]# docker pull busybox:1.25.0
//下载所需镜像
[root@master yaml]# helm fetch stable/mysql
//直接下载stable/mysql的chart包
[root@master yaml]# tar -zxf mysql-0.3.5.tgz
//解压mysql包
[root@master yaml]# cd mysql/
[root@master mysql]# vim values.yaml
//修改values.yaml文件,添加storageClass存储卷和更改svc的模式为NodePort
[root@master mysql]# helm install stable/mysql -n xgp-mysql --set mysqlRootPassword=123.com -f values.yaml
//基于values.yaml和stable/mysql开启一个密码为123.com的mysqlpod
查看一下
[root@master mysql]# kubectl get svc
[root@master mysql]# kubectl get pod -o wide
4、进入pod并查看一下
[root@master mysql]# kubectl exec -it xgp-mysql-mysql-67c6fb5f9-dn7s2 -- mysql -u root -p123.com
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
5、mysql服务的升级与回滚
(1)mysql服务的升级
[root@master mysql]# helm upgrade --set imageTag=5.7.15 xgp-mysql stable/mysql -f values.yaml
查看一下
[root@master mysql]# kubectl get deployments. -o wide
(2)服务的回滚
[root@master mysql]# helm history xgp-mysql
//查看历史版本
回滚到版本一
[root@master mysql]# helm rollback xgp-mysql 1
查看一下
[root@master mysql]# kubectl get deployments. -o wide
6、进入pod并查看一下
[root@master mysql]# kubectl exec -it xgp-mysql-mysql-67c6fb5f9-dn7s2 -- mysql -u root -p123.com
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
四、总结
Helm作为kubernetes应用的包管理以及部署工具,提供了应用打包,发布,版本管理以及部署,升级,回退等功能。Helm以Chart软件包的形式简化Kubernetes的应用管理,提高了对用户的友好性。
使用心得
helm 客户端的功能非常简单,直接参考官网文档即可。
列一下相关使用心得:
- Helm 的所有功能都是围绕着 chart、release 和 repository 的;
- 仅初始化客户端相关配置且仅建立本地仓库,可执行
helm init --client-only --skip-refresh
; - 查找 chart 的方式是通过 HELM_HOME(默认是 ~/.helm 目录)下的 repositories 目录进行的,几个重要文件或目录为 cache、repositories/cache;
- 修改 chart index.yaml 的 url,可执行
helm serve --url http://demo.com
来重新 reindex; - 依赖关系管理,requirements定义,子 chart 值定义;
- install 、 update 的方式管理不方便,这样需要维护 chart 的版本关系,集成 install 和 update ,组成类似 k8s 中的 apply 命令;
- package 命令 -u 可以更新依赖,建议推到 repositiories 前先 package ,否则后期可能出现依赖检测不全的错误;
- release 相关的信息存储在 k8s 的 configmap 中,命名形式为 release_name.v1 的格式。 rollback 相关功能就是通过存储在 configmap 中的信息进行回滚的;
- Helm 客户端与 k8s 中的 TillerServer 是通过 k8s 提供的 port-forward 来实现的,而 port-forward 需要在指定节点上部署 socat;
- TillerServer 可以不部署在 k8s 中, 此时 Helm 客户端需要通过 HELM_HOST 环境变量来指定 TillerServer 的地址和端口;
- 建议 TillerServer 部署在 k8s 中,既然 Helm 为 CNCF 的一员,那么就尽量把云原生做到极致吧;
- 写 chart 时多参考官方最佳实践,The Chart Best Practices Guide;
不足
ヘルムが、ユーザーに圧力開放状態を維持する必要性をもたらすために、対応するリリースをインストールまたは更新するには、updateコマンドをインストールし提供しながら。たとえば、リリース前にインストールされていない、リリースが存在しない場合、更新操作は失敗します。逆にリリースを既存の、操作は失敗しますインストールしてください。実際には、ほとんどの場合、私は、コマンドが実行され、私は私の意図を願って、それが存在するか存在しないかどうか、状態の解除を知る必要がない、と私はコマンドを実行した後の状態を解除することができるように願っています。K8Sは、オーダーのこの点は非常に良いですが、それは国家の資源を維持するために、ユーザを必要としません適用されます。