1. はじめに
Helm は k8s 用のパッケージ管理ツールで、Linux システムで一般的に使用される apt、yum およびその他のパッケージ管理ツールに似ており、go 言語に基づいて開発されています。Helm を使用すると、k8s アプリケーションのデプロイメントを簡素化できます
2. 基本的な考え方
Helm の基本概念
- チャート: アプリケーションの実行に必要なイメージ、依存関係、およびリソース定義を含む Helm パッケージ。また、Homebrew の式、APT の dpkg、または Yum の rpm ファイルに似た、Kubernetes クラスター内のサービス定義も含まれる場合があります。
- リリース: Kubernetes クラスター上で実行される Chart のインスタンス。同じクラスター上に、Chart は何度でもインストールできます。インストールするたびに新しいリリースが作成されます。たとえば、MySQL チャートの場合、サーバー上で 2 つのデータベースを実行する場合は、チャートを 2 回インストールできます。各インストールでは、独自のリリース名を持つ独自のリリースが生成されます。
- リポジトリ: チャートを公開および保存するためのリポジトリ。
3. 構造
チャートのインストールプロセス:
- Helm は、指定されたディレクトリまたは tgz ファイルからチャート構造情報を解析します。
- Helm は、指定された Chart 構造と Values 情報を gRPC 経由で Tiller に渡します
- Tiller はチャートと値に基づいてリリースを生成します
- Tiller は、実行のためにリリースを Kubernetes に送信します。
チャート更新プロセス:
- Helm は、指定されたディレクトリまたは tgz ファイルからチャート構造情報を解析します。
- Helm は、更新するリリースの名前、チャート構造、および値の情報を Tiller に渡します。
- Tiller はリリースを生成し、指定された名前でリリースの履歴を更新します
- Tiller は実行のために Release を Kubernetes に送信します
4. ヘルムをインストールする
Helm は主に Helm クライアントと Tiller サーバーの 2 つの部分で構成されており、Tiller は k8s クラスターにデプロイされます。
ps: Alibaba Cloud Container Service の kubernetes バージョンを使用する場合、helm サーバー (Tiller) はデフォルトでインストールされているため、helm クライアントをインストールするだけで済みます。
独自の環境に応じて、github アドレスから対応するインストール パッケージをダウンロードできます。
ダウンロード アドレス: Releases helm/helm GitHub
- Windows 64 ビット バージョン: https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-windows-amd64.zip
- Linux 64 ビット バージョン: https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-arm64.tar.gz
ダウンロード後、任意のディレクトリに解凍し、対応する PATH 環境変数を設定します。
デフォルトでは、helm は k8s クラスターを操作します。これには、kubectl コマンドのクラスター構成が必要です。ここで kubectl コマンドの構成を参照できます - ( k8s アプリケーション構成の詳細)。もちろん、--kubeconfig パラメーターを直接指定して、 Helm コマンドを使用して、k8s クラスター証明書のパスを指定します。
#これは、--kubeconfig パラメーターで k8s 証明書を指定して k8s クラスターを操作することです #次のコマンドは、app-demo という名前のアプリケーションをデプロイすることです。helm パッケージは ./chart ディレクトリ/ alidata/server/helmにあります-v2.13.1/ helm --kubeconfig ./config/k8s.conf install app-demo ./chart
サーバーをインストールします。
helm init コマンドを使用して、ワンクリックでインストールします。
ps: チャート ウェアハウス (リポジトリ) については、helm コマンド helmserve でウェアハウス サービスを開始できますが、通常は各プロジェクトの独自のチャート パッケージがソース コードとともに git ウェアハウスに送信されるため、チャート ウェアハウスはここにあります必要ありません。
5、helm共通コマンド
Helm バージョン: Helm バージョンを表示する
Helm リポジトリの追加: チャート ウェアハウスを追加
- Helm リポジトリに bitnami を追加 https://charts.bitnami.com/bitnami
Helm リポジトリ リスト: 追加されたウェアハウスをリストします。
Helm リポジトリ更新 bitnami: チャート ウェアハウスからローカルで利用可能なチャート情報を更新します
Helm リポジトリの更新: 参照リソースを更新します
helm list: 現在インストールされているチャートをリストします。
- 例: helm list -n iks-ns-hubble-mimir
Helm install: チャートを Kubernetes にアップロード
- 例: helm -n iks-ns-hubble-mimir install mimir4 ./ -f ./small-s3.yaml
Helm 検索リポジトリ Grafana: 検索チャート
Helm fetch grafana/mimir-distributed: チャートをローカルにダウンロード
ダウンロードされたファイルは tgz ファイルなので、解凍する必要があります。
- Gunzip mimir-distributed-4.3.0.tgz
- tar -xvf mimir-distributed-4.3.0.tar
ディレクトリを入力してください:
ここでのvalues.yamlはカスタマイズおよび変更でき、再インストール時にリポジトリの代わりにローカルチャートを使用するように指定できます。
ローカル チャート ディレクトリ: /data/weiwei/helm-ww/helm-mimir/mimir-distributed/mimir-distributed
6. 基本的な使い方
ここでは、helm の基本的な使い方を紹介するために、簡単な Web サイト アプリケーション チャート パッケージを作成する例を示します。
ps: docker イメージを作成するプロセスはここでは省略します。イメージの作成については、「Docker Basic Tutorial」を参照してください。
5.1. チャートパッケージの作成
例: helm create コマンドを使用して新しいチャート パッケージを作成する
helm create myapp: 現在のディレクトリに myapp チャート パッケージを作成します
作成が完了すると、取得されたディレクトリ構造は次のようになります。
myapp - chart 包目录名
├── charts - 依赖的子包目录,里面可以包含多个依赖的chart包
├── Chart.yaml - chart定义,可以定义chart的名字,版本号信息。
├── templates - k8s配置模版目录, 我们编写的k8s配置都在这个目录, 除了NOTES.txt和下划线开头命名的文件,其他文件可以随意命名。
│ ├── deployment.yaml
│ ├── _helpers.tpl - 下划线开头的文件,helm视为公共库定义文件,主要用于定义通用的子模版、函数等,helm不会将这些公共库文件的渲染结果提交给k8s处理。
│ ├── ingress.yaml
│ ├── NOTES.txt - chart包的帮助信息文件,执行helm install命令安装成功后会输出这个文件的内容。
│ └── service.yaml
└── values.yaml - chart包的参数配置文件,模版可以引用这里参数。
mimir-distributed ディレクトリ内のファイルを比較できます。
k8s に Web サイト アプリケーションをデプロイするには、 deployment、service、および ingressの 3 つの構成ファイルを記述する必要があります。これらは、helm create コマンドによって作成されました。
5.2. k8s アプリケーションデプロイメント設定ファイルの書き込み
チャート パッケージ テンプレートの使用法を示すために、最初に3 つの構成ファイルdeployment、service、および ingressの内容をクリアし、k8s デプロイメント ファイルを書き換えます。
deployment.yaml 構成ファイルは次のように定義されます。
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: myapp #deployment应用名
labels:
app: myapp #deployment应用标签定义
spec:
replicas: 1 #pod副本数
selector:
matchLabels:
app: myapp #pod选择器标签
template:
metadata:
labels:
app: myapp #pod标签定义
spec:
containers:
- name: myapp #容器名
image: xxxxxx:1.7.9 #镜像地址
ports:
- name: http
containerPort: 80
protocol: TCP
service.yaml は次のように定義されます。
apiVersion: v1
kind: Service
metadata:
name: myapp-svc #服务名
spec:
selector: #pod选择器定义
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
ingress.yaml は次のように定義されます。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myapp-ingress #ingress应用名
spec:
rules:
- host: www.xxxxx.com #域名
http:
paths:
- path: /
backend:
serviceName: myapp-svc #服务名
servicePort: 80
5.3. k8s アプリケーション展開設定ファイル内のパラメーターをチャート パッケージ パラメーターとして抽出します。
以上でk8sアプリケーションのデプロイ設定ファイルの準備は完了です。
上記の設定ファイル内のパラメータをチャート パッケージのパラメータとして抽出する必要があるのはなぜですか?
次の質問について考えてみましょう。
チャート パッケージを作成した後、そのチャート パッケージの汎用性が高い場合、ドメイン名をどのように変更すればよいでしょうか? ミラーアドレスを変更しますか? アプリケーションのデプロイメントの名前を変更しますか? 複数の環境をデプロイします (例: 開発環境とテスト環境は異なるアプリケーション名でデプロイされます)
5.2 で定義された k8s 設定ファイルはテンプレートと呼ぶことができず、すべて固定設定です。(ここで言うテンプレートとは、フロントエンド開発をする際に皆さんが普段使っているテンプレート技術に近いものです。概念です)
構成内のパラメーターを抽出し、テンプレート変数を挿入し、テンプレート式によって構成ファイルをテンプレート ファイルに変換し、helm は実行時にパラメーターに従ってテンプレート ファイルを最終構成ファイルに動的にレンダリングします。
次に、デプロイメント、サービス、イングレスの3 つの構成ファイルをテンプレート ファイルに変換します。
ps: { { }} 2 つの中括弧で囲まれた内容はテンプレート式であり、具体的な意味は後で説明しますので、ここでは無視してください。
deployment.yaml 構成テンプレートは次のとおりです。
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: {
{ .Release.Name }} #deployment应用名
labels:
app: {
{ .Release.Name }} #deployment应用标签定义
spec:
replicas: {
{ .Values.replicas}} #pod副本数
selector:
matchLabels:
app: {
{ .Release.Name }} #pod选择器标签
template:
metadata:
labels:
app: {
{ .Release.Name }} #pod标签定义
spec:
containers:
- name: {
{ .Release.Name }} #容器名
image: {
{ .Values.image }}:{
{ .Values.imageTag }} #镜像地址
ports:
- name: http
containerPort: 80
protocol: TCP
service.yaml は次のように定義されます。
apiVersion: v1
kind: Service
metadata:
name: {
{ .Release.Name }}-svc #服务名
spec:
selector: #pod选择器定义
app: {
{ .Release.Name }}
ports:
- protocol: TCP
port: 80
targetPort: 80
ingress.yaml は次のように定義されます。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {
{ .Release.Name }}-ingress #ingress应用名
spec:
rules:
- host: {
{ .Values.host }} #域名
http:
paths:
- path: /
backend:
serviceName: {
{ .Release.Name }}-svc #服务名
servicePort: 80
Values.yaml チャート パッケージ パラメーターの定義:
#域名
host: www.XXX.com
#镜像参数
image: XXXXXXXXXXXXXXXXXX
imageTag: 1.7.9
#pod 副本数
replicas:1
5.4. Helm コマンドを使用したアプリケーションのインストール/更新
アプリをインストールします。
#コマンド形式: Helm インストール チャート パッケージ ディレクトリ
$ helm install ./myapp
コマンド経由でパラメータを挿入する
#コマンド形式: helm install --set key=value chart package directory #–set パラメーターは複数のパラメーターを指定でき、その値は、values.yaml で定義された値をオーバーライドし、オブジェクト タイプ データを使用できます。 (ドット) 属性名を区切る、例: --set apiAppResources.requests.cpu=1
$ helm install --set replicas=2 --set host=www.xxxx.com ./myapp
アプリを更新します:
コマンド形式: Helm upgrade release name chart package directory
$ helm upgrade myapp ./myapp
--set パラメータを指定することもできます
$ helm upgrade --setplicas=2 --set host=www.xxxx.com myapp ./myapp
デフォルトでは、リリース名が存在しない場合、アップグレードは失敗します。リリースが存在しない場合は -i パラメータを追加してインストールし、存在する場合は更新できます。install コマンドと uprade コマンドを組み合わせます。
$ helm upgrade -i --setplicas=2 --set host=www.xxxx.com myapp ./myapp
ソース:
[クラウド ネイティブ] Helm 共通コマンド (チャートのインストール、アップグレード、ロールバック、アンインストールなど)