Helm の概要と基本的な使用方法

概要

参考:https://www.cnblogs.com/lyc94620/p/10945430.html

序章

Helm は、Linux システムで一般的に使用される apt、yum、およびその他のパッケージ管理ツールと同様の、k8s 用のパッケージ管理ツールです。Helm を使用すると、k8s アプリケーションのデプロイメントを簡素化できます。

各パッケージは Chart と呼ばれ、Chart はディレクトリです (通常、ディレクトリはパッケージ化され、圧縮されて name-version.tgz 形式の単一ファイルが形成されます。これは送信や保存に便利です)。

アプリケーション発行者は、Helm を使用してアプリケーションのパッケージ化、アプリケーションの依存関係の管理、アプリケーションのバージョン管理、およびソフトウェア ウェアハウスへのアプリケーションの公開を行うことができます。

ユーザーは、Helm を使用した後、Kubernetes の Yaml 構文を理解してアプリケーション デプロイメント ファイルを作成する必要がなく、Helm を通じて必要なアプリケーションを Kubernetes にダウンロードしてインストールできます。

さらに、Helm は、Kubernetes 上のアプリケーションのソフトウェアのデプロイ、削除、アップグレード、ロールバックのための強力な機能も提供します。


コンポーネントと関連用語

Helm は、コマンド ラインのクライアント ツールです。これは主に、Kubernetes アプリケーション Chart の作成、パッケージ化、リリース、およびローカルおよびリモートの Chart ウェアハウスの作成と管理に使用されます。

耕耘機

Tiller は、Kubernetes クラスターにデプロイされる Helm のサーバーです。Tiller は、Helm のリクエストを受信し、チャートに従って Kubernetes デプロイメント ファイル (Helm では Release と呼ばれます) を生成し、それを Kubernetes に送信してアプリケーションを作成するために使用されます。Tiller は、リリースのアップグレード、削除、ロールバックなどの一連の機能も提供します。

チャート

Helm のパッケージ (TAR 形式)。これには、アプリケーションの実行に必要なイメージ、依存関係、およびリソース定義 (YAML) が含まれており、Kubernetes クラスター内のサービス定義も含まれる場合があります。APT の DEB パッケージまたは YUM の RPM パッケージに似ています。

リポジトリ

Helm のソフトウェア リポジトリであるリポジトリは、基本的に Web サーバーであり、ユーザーがダウンロードできる一連の Chart パッケージを保存し、クエリ用にリポジトリの Chart パッケージのリスト ファイルを提供します。Helm は、複数の異なるリポジトリを同時に管理できます。Helm は、最初にインストールされるときに、公式の Kubernetes チャート リポジトリ リポジトリを使用するように事前に構成されています。このリポジトリには、適切に設計および管理されたチャートが多数含まれています。チャート リポジトリには、デフォルトで「stable」という名前が付けられます。

リリース

このコマンドを使用してhelm installKubernetes クラスターにデプロイされた Chart のインスタンスは、リリースと呼ばれます。同じクラスター上に、Chart は何度でもインストールできます。インストールするたびに新しいリリースが作成されます。たとえば、MySQL チャートの場合、サーバー上で 2 つのデータベースを実行する場合は、チャートを 2 回インストールできます。各インストールでは、独自のリリース名を持つ独自のリリースが生成されます。

注: Helm で言及されるリリースは、一般的な概念のバージョンとは異なることに注意してください。ここでのリリースは、Helm によって Chart パッケージを使用してデプロイされるアプリケーション インスタンスとして理解できます。


動作原理

ここに画像の説明を挿入

チャートのインストールプロセス:

  1. Helm は、指定されたディレクトリまたは tgz ファイルからチャート構造情報を解析します。
  2. Helm は、指定された Chart 構造と Values 情報を gRPC 経由で Tiller に渡します
  3. Tiller はチャートと値に基づいてリリースを生成します
  4. Tiller はリリースを生成するために Kubernetes にリリースを送信します

チャート更新プロセス:

  1. Helm は、指定されたディレクトリまたは tgz ファイルからチャート構造情報を解析します。
  2. Helm は、更新するリリースの名前、チャート構造、および値の情報を Tiller に渡します。
  3. Tiller はリリースを生成し、指定された名前でリリースの履歴を更新します
  4. Tiller はリリースを更新するためにリリースを Kubernetes に送信します

チャートのロールバック プロセス:

  1. Helm はロールバックするリリースの名前を Tiller に渡します
  2. Tiller はリリース名に基づいて履歴を検索します。
  3. ティラーが歴史から最後のリリースを取得
  4. Tiller は以前のリリースを Kubernetes に送信して、現在のリリースを置き換えます

テンプレートの構文

1. 表現

  • テンプレート式: { { テンプレート式 }}

  • テンプレート式: { {- テンプレート式-}}。これは、式の出力結果の前後のスペースを削除することを意味します。 前のスペースを削除するには、{ {- テンプレート式 }} と 記述し 、次のスペース { { テンプレート式-}}を削除します。


2. 変数

デフォルトでは、ドット ( . ) はグローバル スコープを表し、グローバル オブジェクトを参照するために使用されます。

例:

# 这里引用了全局作用域下的Values对象中的key属性。 
{
    
    {
    
     .Values.key }}

Helm グローバル スコープには、Values と Releaseという 2 つの重要なグローバル オブジェクトがあります。

**Values** は、values.yaml によって定義されたパラメータを表し、任意のパラメータは.Valuesを通じて参照できます。

例:

{
    
    {
    
     .Values.replicaCount }}

# 引用嵌套对象例子,跟引用json嵌套对象类似
{
    
    {
    
     .Values.image.repository }}

**Release** はアプリケーション リリースを表します。Release オブジェクトに含まれる属性フィールドは次のとおりです。

  • Release.Name : リリースの名前。通常は Chart.yaml を通じて定義されるか、helm コマンドを通じてアプリケーションをインストールするときに指定されます。
  • Release.Time: リリースのインストール時間
  • Release.Namespace : k8s 名前空間
  • Release.Revision: リリースのバージョン番号は増分値であり、更新されるたびに増分されます。
  • Release.IsUpgrade: true は、現在のリリースが更新であることを意味します
  • Release.IsInstall: true は、現在のリリースがインストールされていることを意味します

例:

{
    
    {
    
     .Release.Name }}

システムに付属の変数に加えて、テンプレート変数をカスタマイズすることもできます。

# 変数名は $ で始まり、代入演算子は: = (コロン + 等号)です。

{
    
    {
    
    - $relname := .Release.Name -}}

カスタム変数を引用する:

# 不需要 . 引用
{
    
    {
    
     $relname }}

3. 関数とパイプライン演算子

(1) 関数呼び出しの構文: { { functionName arg1 arg2… }}

例:

# 调用quote函数:将结果用“”引号包括起来。
{
    
    {
    
     quote .Values.favorite.food }}

(2) パイプライン演算子 |

Linux シェル コマンドと同様に、複数のコマンドがパイプラインを介して結合され、テンプレートによって出力されたコンテンツを処理します。

例:

# 将.Values.favorite.food传递给quote函数处理,然后在输出结果。
{
    
    {
    
     .Values.favorite.food | quote }}

# 先将.Values.favorite.food的值传递给upper函数将字符转换成大写,然后专递给quote加上引号包括起来。
{
    
    {
    
     .Values.favorite.food | upper | quote }}

# 如果.Values.favorite.food为空,则使用default定义的默认值
{
    
    {
    
     .Values.favorite.food | default "默认值" }}

# 将.Values.favorite.food输出5次
{
    
    {
    
     .Values.favorite.food | repeat 5 }}

# 对输出结果缩进2个空格
{
    
    {
    
     .Values.favorite.food | nindent 2 }}

(3) 一般的に使用される関係演算子 >、>=、<、!=、および or not は、helm テンプレート内の関数の形式で実装されます。

関係演算関数の定義:

eq  相当于 =
ne  相当于 !=
lt  相当于 <=
gt  相当于 >=
and 相当于 &&
or  相当于 ||
not 相当于 !

例:

# 相当于 if (.Values.fooString && (.Values.fooString == "foo"))
{
    
    {
    
     if and .Values.fooString (eq .Values.fooString "foo") }}
{
    
    {
    
     ... }}
{
    
    {
    
     end }}

4. フロー制御文: IF/ELSE、with、range

(1)IF/ELSE

文法:

{
    
    {
    
     if 条件表达式 }}
Do something
{
    
    {
    
     else if 条件表达式 }}
Do something else
{
    
    {
    
     else }}
Default case
{
    
    {
    
     end }}

例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {
    
    {
    
     .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {
    
    {
    
     .Values.favorite.drink | default "tea" | quote }}
  food: {
    
    {
    
     .Values.favorite.food | upper | quote }}
  {
    
    {
    
    if eq .Values.favorite.drink "coffee"}}
    mug: true
  {
    
    {
    
    end}}

(2)あり

with は主にスコープを変更するために使用され、default. はグローバル スコープを表し、with ステートメントは の意味を変更できます。

文法:

{
    
    {
    
     with 引用的对象 }}
这里可以使用 . (点), 直接引用with指定的对象
{
    
    {
    
     end }}

例:

# .Values.favorite是一个object类型
{
    
    {
    
    - with .Values.favorite }}
drink: {
    
    {
    
     .drink | default "tea" | quote }}  #相当于.Values.favorite.drink
food: {
    
    {
    
     .food | upper | quote }}
{
    
    {
    
    - end }}

ps: with のスコープ内では使用できません グローバル オブジェクトを参照する場合、with 内でグローバル オブジェクトを参照する必要がある場合は、まずグローバル オブジェクトを with の外側の変数にコピーし、その変数を with 内で使用してグローバル オブジェクトを参照できます。

例:

{
    
    {
    
    - $release:= .Release.Name -}}  #先将值保存起来

{
    
    {
    
    - with .Values.favorite }}
drink: {
    
    {
    
     .drink | default "tea" | quote }}  #相当于.Values.favorite.drink
food: {
    
    {
    
     .food | upper | quote }}
release: {
    
    {
    
     $release }} #间接引用全局对象的值
{
    
    {
    
    - end }}

(3)範囲

range は主に配列型をループするために使用されます。

文法 1:

# 遍历map类型,用于遍历键值对象
# 变量key代表对象的属性名,val代表属性值
{
    
    {
    
    - range key,val := 键值对象 }}
{
    
    {
    
     $key }}: {
    
    {
    
     $val | quote }}
{
    
    {
    
    - end}}

文法 2:

{
    
    {
    
    - range 数组 }}
{
    
    {
    
     . | title | quote }} 	# . (点),引用数组元素值。
{
    
    {
    
    - end }}

例:

# values.yaml定义
 
# map类型
favorite:
  drink: coffee
  food: pizza
 
# 数组类型
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions
 
# map类型遍历例子:
{
    
    {
    
    - range $key, $val := .Values.favorite }}
{
    
    {
    
     $key }}: {
    
    {
    
     $val | quote }}
{
    
    {
    
    - end}}
 
# 数组类型遍历例子:
{
    
    {
    
    - range .Values.pizzaToppings}}
{
    
    {
    
     . | quote }}
{
    
    {
    
    - end}}

5. サブテンプレートの定義

サブテンプレートは、後で再利用できるように、_ (アンダースコア) で始まるファイル内に定義できます。

helm create は、デフォルトで _helpers.tpl パブリック ライブラリ定義ファイルを作成します。名前がアンダースコアで始まっていれば、その中にサブテンプレートを直接定義することも、新しいテンプレートを作成することもできます。

サブテンプレートの構文:

# 定义模版
{
    
    {
    
     define "模版名字" }} 
模版内容
{
    
    {
    
     end }}

# 引用模版
{
    
    {
    
     include "模版名字" 作用域}}

例:

# 模版定义
{
    
    {
    
    - define "mychart.app" -}}
app_name: {
    
    {
    
     .Chart.Name }}
app_version: "{
    
    { .Chart.Version }}+{
    
    { .Release.Time.Seconds }}"
{
    
    {
    
    - end -}}
 
apiVersion: v1
kind: ConfigMap
metadata:
  name: {
    
    {
    
     .Release.Name }}-configmap
  labels:
    {
    
    {
    
     include "mychart.app" . | nindent 4 }} #引用mychart.app模版内容,并对输出结果缩进4个空格
data:
  myvalue: "Hello World"

6. デバッグ

チャート パッケージのテンプレートを作成した後、 helm コマンドに--debug --dry-run2 つのパラメーターを追加して、helm にテンプレートの結果を出力させることができますが、テンプレートの出力結果を処理のために k8s に渡すことはしません

例:

# helm install命令类似,加上--debug --dry-run两个参数即可
$ helm upgrade --debug --dry-run -i set replicas=2 --set host=www.xxxx.com myapp ./myapp

共通コマンド

参考:https://www.hellodemos.com/hello-helm-command/helm-command-demos.html

複数使用できるオプションのパラメータ-hまたは--help、コマンドの詳細を参照

チャートインスタンスの管理

チャートインスタンスの表示、作成、削除

# 查看chart实例列表
$ helm list
# 查看全部的chart实例(包括删除的)	
helm list -a
# 列出已经删除的Release
helm ls --deleted 

# 查看指定的chart实例信息
$ helm status RELEASE_NAME [flags]


# 创建chart实例部署到k8s
$ helm install chart包 [flags]
# 常用可选参数:
    --name str				# 指定helm实例名称
    --namespace str			# 指定安装的namespace。不指定则默认命名空间
    --version str			# 指定charts版本
    -f values.yaml			# 从文件读取自定义属性集合
    --set "key=value"		# 通过命令方式注入自定义参数,用于覆盖values.yaml定义的值
    						  # 对象类型数据可以用 . (点)分割属性名。示例: --set apiApp.requests.cpu=1
    						  # 可以使用多个 --set 指定多个参数
# 示例
helm install --name test --namespace test ./helm-chart


# 删除chart实例(注意:若不加purge参数,则并没有彻底删除)
$ helm delete RELEASE_NAME [flags]
# 选项:
	--purge		# 彻底删除实例,并释放端口
# 示例:
helm delete --purge RELEASE_NAME 

チャートインスタンスの更新とロールバック

# 更新chart实例。默认情况下,如果chart实例名不存在,则upgrade会失败
$ helm upgrade [选项] 实例名称 [chart包目录] [flags]
# 选项:
	-i						# 实例名存在则更新,不存在时则安装(合并了install和uprade命令功能)
	--set "key=value"		# 通过命令方式注入自定义参数
# 示例:根据chart包更新chart实例
helm upgrade myapp ./myapp
helm upgrade -i myapp ./myapp
# 示例:使用–set参数更新chart实例
helm upgrade --set replicas=2 --set host=www.xxxx.com myapp


# 查看chart实例的版本信息
$ helm history HELM_NAME [flags]

# 回滚chart实例的指定版本
$ helm rollback HELM_NAME [REVISION] [flags]

チャートパッケージ管理

チャートパッケージの検索、表示、ダウンロード

# 在Artifact Hub或自己的hub实例中搜索Helm charts
$ helm search hub [KEYWORD] [flags]

# 搜索系统上配置的所有仓库,并查找匹配
$ helm search repo [keyword] [flags]
# 说明:
	[KEYWORD]	# 参数接受关键字字符串或者带引号的查询字符串

# 显示指定chart包(目录、文件或URL)中的Charts.yaml文件内容
$ helm show chart [CHART] [flags]
# 显示指定chart(目录、文件或URL)中的README文内容
$ helm show readme [CHART] [flags]
# 显示指定chart(目录、文件或URL)包中的values.yaml文件内容
$ helm show values [CHART] [flags]
# 显示指定chart(目录、文件或URL)中的所有的内容(values.yaml, Charts.yaml, README)
$ helm show all [CHART] [flags]

# 从包仓库中检索包并下载到本地
$ helm pull [chart URL | repo/chartname] [...] [flags]

# 下载charts到本地
$ helm fetch redis

カスタムチャートパッケージ

# 创建charts包
$ helm create NAME [flags]
# 选项:
	-p, --starter string 	# 名称或绝对路径。
							  # 如果给定目录路径不存在,Helm会自动创建。
							  # 如果给定目录存在且非空,冲突文件会被覆盖,其他文件会被保留。

# 检查chart语法正确性
$ helm lint myapp

# 打包成一个chart版本包文件。
$ helm package [CHART_PATH] [...] [flags]

# 查看生成的yaml文件
$ helm template myapp-1.tgz

Helm ウェアハウス管理: Helm リポジトリ

リポジトリのリスト、追加、削除、更新、インデックス作成

文法:

$ helm repo COMMAND [flags]
从父命令继承的可选参数:
		--debug                       启用详细输出
      	--kube-apiserver string       Kubernetes-API服务器的地址和端口
      	--kube-as-group stringArray   Kubernetes操作的组,可以重复此标志以指定多个组。
      	--kube-as-user string         Kubernetes操作的用户名
      	--kube-ca-file string         Kubernetes-API服务器连接的认证文件
      	--kube-context string         kubeconfig context的名称
      	--kube-token string           用于身份验证的字符串令牌
      	--kubeconfig string           kubeconfig文件的路径
  -n, 	--namespace string            该请求的作用域的命名空间名称
      	--registry-config string      注册表配置文件的路径 (default "~/.config/helm/registry.json")
      	--repository-cache string     包含缓存库索引的文件的路径 (default "~/.cache/helm/repository")
      	--repository-config string    包含仓库名称和url的文件的路径 (default "~/.config/helm/repositories.yaml")

共通コマンド

# 查看chart仓库列表
$ helm repo list [flags]
# 选项:
	-o, --output format :打印指定格式的输出。支持的格式:table, json, yaml (default table)

# 从chart仓库中更新本地可用chart的信息
$ helm repo update [flags]

# 读取当前目录,并根据找到的chart为chart仓库生成索引文件(index.yaml)。
$ helm repo index
# 选项
	--merge string   # 合并生成的索引到已经存在的索引文件
	--url string     # chart仓库的绝对URL
		
# 添加chart仓库
$ helm repo add [NAME] [URL] [flags]
$ helm repo add myharbor https://harbor.qing.cn/chartrepo/charts --username admin --password password
		
# 删除一个或多个仓库
$ helm repo remove [REPO1 [REPO2 ...]] [flags]

他のコマンド

Helm 依存関係: チャートの依存関係を管理する

# 列举所有的chart中声明的依赖
helm dependency list
# 列举指定chart的依赖
helm dependency list CHART [flags]
# 查看helm版本
$ helm version

# 打印所有Helm使用的客户端环境信息
$ helm env [flags]

基本的な使い方

ここでは、helm の基本的な使い方を紹介するために、簡単な Web サイト アプリケーション チャート パッケージを作成する例を示します。

ps: docker イメージを作成するプロセスはここでは省略します。イメージの作成については、「Docker Basic Tutorial」を参照してください。


1. チャートパッケージを作成する

helm create コマンドを使用して新しいチャート パッケージを作成します。

例:

# 在当前目录创建一个myapp chart包
$ helm create 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包的参数配置文件,模版可以引用这里参数

k8s に Web サイト アプリケーションをデプロイするには、 deployment、service、および ingress の3 つの構成ファイルを作成する必要があります。これらは、helm create コマンドによって作成されました。


2. k8s アプリケーション展開設定ファイルを作成します。

チャート パッケージ テンプレートの使用法を示すために、まずデプロイメント、サービス、およびイングレス構成ファイルの内容をクリアし、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

3. k8s アプリケーション展開構成ファイル内のパラメーターをチャート パッケージ パラメーターとして抽出します。

定義された k8s 設定ファイルはテンプレートと呼ぶことができず、すべて固定設定です。(ここで言うテンプレートとは、フロントエンド開発をする際に皆さんが普段使っているテンプレート技術に近いものです。概念です)

構成内のパラメーターを抽出し、テンプレート変数を挿入することにより、テンプレート式は構成ファイルをテンプレート ファイルに変換し、helm は実行時のパラメーターに従ってテンプレート ファイルを最終構成ファイルに動的にレンダリングします。


次に、3 つの構成ファイル **deployment、service、および ingress** をテンプレート ファイルに変換します。

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

4. Helm コマンドを使用してアプリケーションをインストール/更新します。

アプリをインストールします。

$ helm install ./myapp

コマンド経由でパラメータを挿入する

$ helm install --set replicas=2 --set host=www.xxxx.com ./myapp

アプリを更新します:

# 命令格式: helm upgrade release名字  chart包目录
$ helm upgrade myapp ./myapp

# 也可以指定–set参数
$ helm upgrade --set replicas=2 --set host=www.xxxx.com myapp ./myapp

# 默认情况下,如果release名字不存在,upgrade会失败
# 可以加上-i 参数当release不存在的时候则安装,存在则更新,将install和uprade命令合并
$ helm upgrade -i --set replicas=2 --set host=www.xxxx.com myapp ./myapp

おすすめ

転載: blog.csdn.net/footless_bird/article/details/125844110