翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon EKS Auto Mode を有効化する際に NGINX Ingress Controller を移行する
Amazon Web Services、Olawale Olaleye、Shamanth Devagari
概要
Amazon Elastic Kubernetes Service (Amazon EKS) の EKS Auto Mode を使用すると、Kubernetes クラスターでワークロードを実行する際の運用オーバーヘッドを削減できます。このモードでは AWS 、 がユーザーに代わってインフラストラクチャを設定および管理することもできます。既存のクラスターで EKS Auto Mode を有効にする場合は、NGINX Ingress Controller の設定移行を慎重に実施する必要があります。Network Load Balancer の直接転送は不可となっているためです。
既存の Amazon EKS クラスターで EKS Auto Mode を有効にすると、ブルー/グリーンデプロイを用いて NGINX Ingress Controller インスタンスを移行できます。
前提条件と制限
前提条件
アーキテクチャ
ブルー/グリーンデプロイとは、構成が同一である 2 つの環境を別々に構築するデプロイメント戦略です。ブルー/グリーンデプロイではリリースのためのダウンタイムがほとんどなく、ロールバックが可能になります。異なるアプリケーションバージョンを実行している 2 つの同一環境間で、トラフィックを移行することを主な目的としています。
次の図は、EKS Auto Mode を有効にする際の 2 つの異なる NGINX Ingress Controller インスタンスからの Network Load Balancer の移行を示しています。ブルー/グリーンデプロイを使用して、2 つの Network Load Balancer 間でトラフィックをシフトします。
オリジナルの名前空間は青で示されています。EKS Auto Mode を有効にする前に、元の NGINX Ingress Controller サービスとインスタンスが実行される場所です。元のサービスとインスタンスは、Route 53 で設定された DNS 名を持つ Network Load Balancer に接続します。AWS Load Balancer Controller は、この Network Load Balancer をターゲット仮想プライベートクラウド (VPC) にデプロイします。
この図は、ブルー/グリーンデプロイの環境設定を行う以下のワークフローを示します。
別の NGINX Ingress Controller インスタンスを緑の名前空間にインストールして設定します。
Route 53 で、新しい Network Load Balancer の DNS 名を設定します。
AWS のサービス
その他のツール
Helm は、Kubernetes 用のオープンソースのパッケージマネージャです。Kubernetes クラスター上でアプリケーションをインストールおよび管理できます。
kubectlは、Kubernetes クラスターに対してコマンドを実行するためのコマンドラインインターフェイスです。
NGINX Ingress Controller は、Kubernetes アプリケーションとサービスをリクエスト処理、認証、セルフサービスのカスタムリソース、デバッグに接続します。
エピック
| タスク | 説明 | 必要なスキル |
|---|
元の NGINX Ingress Controller インスタンスが動作していることを確認します。 | 次のコマンドを入力して、ingress-nginx 名前空間内のリソースが動作していることを確認します。NGINX Ingress Controller を別の名前空間にデプロイした場合は、このコマンドで名前空間名を更新します。 kubectl get all -n ingress-nginx
出力で、NGINX Ingress Controller ポッドが実行中であることを確認します。以下は、その出力例です。 NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-admission-create-xqn9d 0/1 Completed 0 88m
pod/ingress-nginx-admission-patch-lhk4j 0/1 Completed 1 88m
pod/ingress-nginx-controller-68f68f859-xrz74 1/1 Running 2 (10m ago) 72m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller LoadBalancer 10.100.67.255 k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80:30330/TCP,443:31462/TCP 88m
service/ingress-nginx-controller-admission ClusterIP 10.100.201.176 <none> 443/TCP 88m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 1/1 1 1 88m
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-68f68f859 1 1 1 72m
replicaset.apps/ingress-nginx-controller-d8c96cf68 0 0 0 88m
NAME STATUS COMPLETIONS DURATION AGE
job.batch/ingress-nginx-admission-create Complete 1/1 4s 88m
job.batch/ingress-nginx-admission-patch Complete 1/1 5s 88m
| DevOps エンジニア |
| タスク | 説明 | 必要なスキル |
|---|
Kubernetes リソースを作成します。 | 次のコマンドを入力して、Kubernetes のサンプルデプロイ、サービス、イングレスを作成します。 kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
kubectl create ingress demo --class=nginx \
--rule nginxautomode.local.dev/=demo:80
| DevOps エンジニア |
デプロイされたリソースを確認します。 | 次のコマンドを入力して、デプロイ済みリソースリストを表示します。 kubectl get all,ingress
出力で、サンプル HTTPd ポッドが実行中であることを確認します。以下は、その出力例です。 NAME READY STATUS RESTARTS AGE
pod/demo-7d94f8cb4f-q68wc 1/1 Running 0 59m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/demo ClusterIP 10.100.78.155 <none> 80/TCP 59m
service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 117m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/demo 1/1 1 1 59m
NAME DESIRED CURRENT READY AGE
replicaset.apps/demo-7d94f8cb4f 1 1 1 59m
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 56m
| DevOps エンジニア |
サービスに到達できることを確認します。 | 次のコマンドを入力して、サービスが Network Load Balancer の DNS 名を介して到達可能であることを確認します。 curl -H "Host: nginxautomode.local.dev" http://k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com
予想される出力は次のようになります。 <html><body><h1>It works!</h1></body></html>
| DevOps エンジニア |
(オプション) DNS レコードを作成します。 | 「Creating records by using the Amazon Route 53 console (Route 53 ドキュメント)」に記載の手順に従って、設定されたドメインの DNS レコードを作成します。 次のコマンドを入力して、サービスが設定されたドメイン名を介して到達可能であることを確認します。 curl "http://nginxautomode.local.dev/?[1-5]"
予想される出力は次のようになります。 <html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
| DevOps エンジニア、AWS DevOps |
| タスク | 説明 | 必要なスキル |
|---|
新しい NGINX Ingress Controller インスタンスを設定します。 | [deploy.yaml] テンプレートをダウンロードします。 任意のエディタで [deploy.yaml] テンプレートを開きます。 [kind: Namespace] セクションで、名前空間に一意の名前を入力します。例: ingress-nginx-v2 apiVersion: v1
kind: Namespace
metadata:
labels:
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
name: ingress-nginx-v2
各セクションで、[namespace] 値を新しい名前に更新します。 [kind: Deployment] セクションで、次の操作を行います。 [k8s.io/ingress-nginx-v2] など、[--controller-class] に一意の値を入力します。 [nginx-v2] など、[--ingress-class] に一意の値を入力します。
apiVersion: apps/v1
kind: Deployment
name: ingress-nginx-controller
namespace: ingress-nginx-v2
...
spec:
containers:
- args:
- /nginx-ingress-controller
- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
- --election-id=ingress-nginx-leader
- --controller-class=k8s.io/ingress-nginx-v2
- --ingress-class=nginx-v2
[kind: IngressClass] セクションで、前のセクションで使用したものと同じ値を [--controller-class] と [--ingress-class] に入力します。 apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.12.0
name: nginx-v2
spec:
controller: k8s.io/ingress-nginx-v2
次のセクションでは、[loadBalancerClass: eks.amazonaws.com/nlb] を追加して NGINX Ingress Controller インスタンスの Network Load Balancer をプロビジョニングします。 apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx-v2
spec:
...
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
type: LoadBalancer
loadBalancerClass: eks.amazonaws.com/nlb
[deploy.yaml] テンプレートを保存して閉じます。
| DevOps エンジニア |
新しい NGINX Instance Controller インスタンスをデプロイします。 | 次のコマンドを入力して、変更後のマニフェストを適用します。 kubectl apply -f deploy.yaml
| DevOps エンジニア |
デプロイが成功したことを確認します。 | 次のコマンドを入力して、[ingress-nginx-v2] の名前空間内のリソースが動作していることを確認します。 kubectl get all -n ingress-nginx-v2
出力で、NGINX Ingress Controller ポッドが実行中であることを確認します。以下は、その出力例です。 NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-admission-create-7shrj 0/1 Completed 0 24s
pod/ingress-nginx-admission-patch-vkxr5 0/1 Completed 1 24s
pod/ingress-nginx-controller-757bfcbc6d-4fw52 1/1 Running 0 24s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller LoadBalancer 10.100.208.114 k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com 80:31469/TCP,443:30658/TCP 24s
service/ingress-nginx-controller-admission ClusterIP 10.100.150.114 <none> 443/TCP 24s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 1/1 1 1 24s
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-757bfcbc6d 1 1 1 24s
NAME STATUS COMPLETIONS DURATION AGE
job.batch/ingress-nginx-admission-create Complete 1/1 4s 24s
job.batch/ingress-nginx-admission-patch Complete 1/1 5s 24s
| DevOps エンジニア |
サンプル HTTPd ワークロードに新規イングレスを作成します。 | 既存のサンプル HTTPd ワークロードに新規イングレスを作成するには、以下のコマンドを入力してください。 kubectl create ingress demo-new --class=nginx-v2 \
--rule nginxautomode.local.dev/=demo:80
| DevOps エンジニア |
新規イングレスが機能することを確認します。 | 次のコマンドを入力して、新規イングレスが機能することを確認してください。 curl -H "Host: nginxautomode.local.dev" k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com
予想される出力は次のようになります。 <html><body><h1>It works!</h1></body></html>
| DevOps エンジニア |
| タスク | 説明 | 必要なスキル |
|---|
新しい名前空間にカットオーバーします。 | | AWS DevOps、DevOps エンジニア |
2 つのイングレスを確認します。 | 次のコマンドを入力して、サンプルの HTTPd ワークロード用に作成された 2 つのイングレスを確認します。 kubectl get ingress
以下は、その出力例です。 NAME CLASS HOSTS ADDRESS PORTS AGE
demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 95m
demo-new nginx-v2 nginxautomode.local.dev k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com 80 33s
| DevOps エンジニア |
関連リソース