デプロイメントは、Kubernetesの主要なワークロードタイプであり、「ステートレスワークロード」と呼ばれることがよくあります。クラスター内で目的の状態で実行されている指定数のポッドを維持します。 このトピックでは、コンソールとkubectlを使用してACKクラスターにステートレスアプリケーションを作成する方法について説明します。
読書のヒント
ワークロードを作成する前に、ワークロードを確認して、ワークロードの基礎と考慮事項を理解することをお勧めします。 このトピックは2つの主要なセクションに分かれています。
デプロイの作成
コンソールを使用して作成する
以下の手順は、ワークロードを作成するための簡単なプロセスです。 このガイドに従って、迅速な展開と検証を行うことができます。 基本に慣れたら、[設定パラメーター] を参照してワークロードをカスタマイズできます。
基本的なアプリケーション情報の設定
にログインします。Container Service管理コンソール左側のナビゲーションウィンドウで、クラスターリスト.On theクラスターリストページで、対象のクラスター名をクリックします。 次に、左側のナビゲーションウィンドウで、 を選択します。[ステートレス] ページで、[イメージで作成] をクリックします。
On the基本的なアプリケーション情報設定ウィザードページで、アプリケーションの基本的な詳細を入力します。 次に、クリック次へに進みます。コンテナーの設定ウィザードページ。
コンテナーの設定
では、コンテナーの設定セクションで、イメージ名とポートコンテナ用。 他の設定はデフォルト値のままにしておくことができます。 次に、クリック次へに移動します。高度な設定ウィザードページ。 画像アドレスは以下の通りである。
重要イメージを取得する前に、クラスターにパブリックネットワークアクセスがあることを確認します。 クラスターの作成時にデフォルトの [VPC用SNATの設定] オプションを選択した場合、すでにパブリックネットワークアクセスが許可されています。 そうでない場合は、「既存のクラスターのパブリックネットワークアクセスの有効化」をご参照ください。
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
完全な高度な設定
[詳細設定] ウィザードページで、アクセス、スケーリング、スケジューリング、およびラベルの注釈を設定します。 [アクセス設定] セクションで、バックエンドポッドを公開する方法を設定し、[OK] をクリックし、下部の [作成] をクリックします。
重要この手順では、タイプLoadBalancerのサービスを作成してワークロードを公開します。これにより、CLBインスタンスに関連するコストが発生します。 課金の詳細については、「従量課金」をご参照ください。 後でCLBインスタンスを使用しない場合は、すぐにリリースしてください。
アプリケーションの表示
作成完了ウィザードページで、アプリケーションタスクを確認します。 では、申請タスクの提出パネル、クリックアプリケーションの詳細を表示. [アクセス方法] タブをクリックし、新しく作成されたサービス (nginx-test-svcなど) を見つけ、[外部エンドポイント] 列のリンクをクリックしてアクセスします。
コンソールから、作成したワークロードに対して表示、編集、再デプロイなどの操作を実行できます。
kubectlを使用して作成する
ワークロードを作成する前に、kubectlを使用してクラスターに接続していることを確認します。 手順については、「クラスターKubeConfigを取得し、kubectlツールを使用してクラスターに接続する」をご参照ください。
次のコマンドを実行してワークロードを作成します。 このコマンドはコンテナーイメージを指定しますが、その他の設定はデフォルトに設定されます。
バージョン1.18以上のクラスターの場合は、以下のコマンドを使用して開始します。
kubectl create deployment nginx --image=registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
バージョン1.18以下のクラスターの場合は、以下のコマンドを使用して開始します。
kubectl run -it nginx --image=registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
次のコマンドを実行して
LoadBalancer
タイプのサービスを作成し、SLBインスタンスを使用してワークロードを公開します。kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
以下のコマンドを実行して、サービスのパブリックIPアドレスを表示します。
kubectl get svc
想定される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 172.16.**.*** <none> 443/TCP 4h47m nginx LoadBalancer 172.16.**.*** 106.14.**.*** 80:31130/TCP 1h10m
ブラウザにnginxのパブリックIP (
106.14.**.***
) を入力して、ワークロードに関連付けられているNginxコンテナにアクセスします。
パラメーターの設定
コンソール設定パラメーター
基本的なアプリケーション情報
設定アイテム | 説明 |
アプリケーション名 | ワークロードの名前。 これに基づいて、ワークロードに属するポッドの名前が生成されます。 |
数のレプリカ | ワークロードに含まれるポッドの数。 デフォルトの数は2です。 |
タイプ | ワークロードのタイプ。 このトピックでは、[ステートレス (デプロイ)] を選択します。 ワークロードの選択については、「ワークロードの作成」をご参照ください。 |
ラベル | ワークロードのラベル。 |
注釈 | ワークロードの注釈。 |
タイムゾーン同期 | コンテナとそれが存在するノードが同じタイムゾーンを使用するかどうか。 |
コンテナー設定
高度な設定
構成カード | 設定アイテム | 説明 |
アクセス設定 | サービス | サービスは、ポッドのグループに固定された統合されたレイヤー4 (トランスポート層) エントリを提供します。 ワークロードを外部に公開するときに構成する必要があるリソースです。 サービスは、Virtual Cluster IP、Node Port、Load Balancerなど、複数のタイプをサポートしています。 サービスの基本的な知識については、「サービス管理」をご参照ください。 |
Ingress | Ingressは、クラスター内の複数のサービスにレイヤー7 (アプリケーション層) エントリを提供し、ドメイン名の一致に基づいて異なるサービスに要求を転送します。 Ingressを使用する前に、Ingress Controllerをインストールする必要があります。 ACKは、異なるシナリオに適した複数のオプションを提供します。 選択については、Nginx Ingress、ALB Ingress、およびMSE Ingressの比較を参照してください。 | |
スケーリング設定 | メトリックスケーリング | コンテナーのパフォーマンスメトリックを監視して、自動スケーリングをトリガーします。 メトリックスケーリングは、ビジネス負荷が変動したときにワークロードが使用するリソースの合計を自動的に調整するのに役立ちます。スケールアウトして高負荷時のプレッシャーを軽減し、スケールインして低負荷時のリソースを節約します。 詳細については、「コンテナー水平ポッド自動スケーリング (HPA) の使用」をご参照ください。 |
スケジュールされたスケーリング | ソーシャルメディアの定期的なトラフィックが昼食と夕食後にピークに達するなど、ビジネス負荷が定期的に変化するシナリオに適した、定期的な間隔でのワークロードスケーリングのトリガー。 詳細については、「Container Cron水平ポッド自動スケーリング (CronHPA) の使用」をご参照ください。 | |
スケジューリング設定 | アップグレード方法 | ポッド構成が変更されたときに、ワークロードが古いポッドを新しいポッドに置き換えるために使用するメカニズム。
|
| ポッドが特定のノードで実行される場合でも、Affinity、anti-affinity、およびtolerationの設定がスケジューリングに使用されます。 スケジューリング操作は比較的複雑で、事前にニーズに応じて計画する必要があります。 詳細な操作については、「スケジューリング」をご参照ください。 | |
ラベルと注釈 | ポッドラベル | ワークロードに属する各ポッドにラベル (Label) を追加します。 ワークロードやサービスなど、クラスター内のさまざまなリソースは、ラベルを介してポッドと一致します。 ACKは、デフォルトで |
ポッドの注釈 | ワークロードに属する各ポッドにアノテーション (アノテーション) を追加します。 ACKの一部の機能は注釈を使用し、これらの機能を使用するときに編集できます。 |
ワークロードYAMLの例
apiVersion: apps/v1
kind: Deployment # Workload type
metadata:
name: nginx-test
namespace: default # Change the namespace as needed
labels:
app: nginx
spec:
replicas: 2 # Specify the number of pods
selector:
matchLabels:
app: nginx
template: # Pod configuration
metadata:
labels: # Pod labels
app: nginx
annotations: # Pod annotations
description: "This is an application deployment"
spec:
containers:
- name: nginx # Image name
image: nginx:1.7.9 # Use a specific version of the Nginx image
ports:
- name: nginx # name
containerPort: 80 # Port exposed by the container
protocol: TCP # Specify the protocol as TCP/UDP, default is TCP
command: ["/bin/sh"] # Container startup items
args: [ "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY) && exec nginx -g 'daemon off;'"] # Output variables, add command to start nginx
stdin: true # Enable standard input
tty: true # Allocate a virtual terminal
env:
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
name: special-config # Name of the configuration item
key: SPECIAL_LEVEL # Key name of the configuration item
securityContext:
privileged: true # true to enable privileged mode, false to disable privileged mode, default is false
resources:
limits:
cpu: "500m" # Maximum CPU usage, 500 millicores
memory: "256Mi" # Maximum memory usage, 256 MiB
ephemeral-storage: "1Gi" # Maximum ephemeral storage usage, 1 GiB
requests:
cpu: "200m" # Minimum requested CPU usage, 200 millicores
memory: "128Mi" # Minimum requested memory usage, 128 MiB
ephemeral-storage: "500Mi" # Minimum requested ephemeral storage usage, 500 MiB
livenessProbe: # Liveness probe configuration
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe: # Readiness probe configuration
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
volumeMounts:
- name: tz-config
mountPath: /etc/localtime
readOnly: true
volumes:
- name: tz-config
hostPath:
path: /etc/localtime # Mount the /etc/localtime file from the host to the same path inside the container through the volumeMounts and volumes fields.
---
# service
apiVersion: v1
kind: Service
metadata:
name: nginx-test-svc
namespace: default # Change the namespace as needed
labels:
app: nginx
spec:
selector:
app: nginx # Match label to ensure the service points to the correct pods
ports:
- port: 80 # Port provided by the service within the cluster
targetPort: 80 # Port that the internal application listens to (containerPort)
protocol: TCP # Protocol, default is TCP
type: ClusterIP # Service type, default is ClusterIP, internal access
---
# ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: default # Change the namespace as needed
annotations:
kubernetes.io/ingress.class: "nginx" # Specify the type of Ingress controller
# If using Alibaba Cloud SLB Ingress controller, you can specify as follows:
# service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxxxxxxx"
# service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.spec.s1.small"
spec:
rules:
- host: foo.bar.com # Replace with your domain name
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service # Backend service name
port:
number: 80 # Backend service port
tls: # Optional, used to enable HTTPS
- hosts:
- foo.bar.com # Replace with your domain name
secretName: tls-secret # TLS certificate secret name
関連ドキュメント
データベースなど、安定した永続ストレージを必要とするアプリケーションでは、StatefulSetの使用を検討してください。 詳細については、「StatefulSetの作成」をご参照ください。
ワークロードの作成時に問題が発生した場合は、ワークロードFAQを参照してください。
異常なポッドの問題のトラブルシューティングについては、ポッド異常問題トラブルシューティングを参照してください。