Nginx Ingress Controllerのインストールを進める前に、IngressとIngressControllerが何であるかを簡単に見てみましょう。この記事の焦点はセットアップにあり、KubernetesクラスターでNginxIngressControllerをセットアップするためのすべての前提条件に精通していることを前提としています。
Kubernetes Ingress
これは、Kubernetesクラスター内のサービスへの外部アクセスを管理するKubernetesオブジェクトです。 Kubernetesクラスタの外部からKubernetesクラスタ内のサービスへのHTTPおよびHTTPSルートを公開します。
入力コントローラー
Ingressを使用するには、KubernetesクラスターにIngressコントローラーが必要です。クラスタ内の他のコントローラのようにKubernetesクラスタの一部として提供されるのではなく、クラスタ内で自動的に起動しません。 Kubernetesクラスターには任意の数のIngressコントローラーをデプロイできます。そのためには、各入力に適切なingress.classの注釈を付ける必要があります。利用可能なIngressコントローラーにはさまざまな種類があります。 Ingress Controllerは、Kubernetes環境向けのLoadBalancerです。 Kubernetes環境のトラフィック管理ソリューションとして使用されます。
この記事では、Kopsを使用してセットアップされたKubernetesクラスターにHelmを使用してNginxIngressControllerをインストールする方法について説明します。 Nginx Ingress Controllerの詳細については、こちらの公式ドキュメントをご覧ください。
- AWSアカウント(アカウントがない場合は作成します)。
- マシンにインストールされているKops1.18.2(Kopsを使用してKubernetesクラスタを作成する方法と詳細については、ここをクリックしてください)。
- Helm v3.5.3(Ubuntu ServerにHelmをインストールする方法については、ここをクリックしてください)
- S3バケット(AWSでS3バケットを作成する方法については、ここをクリックしてください)。
- ドメイン名(AWSにドメインを登録する方法については、ここをクリックしてください)。
- 管理者権限を持つIAMロール(AWSでIAMロールを作成する方法については、ここをクリックしてください)。
何をしますか?
- Kopsを使用してKubernetesクラスターを作成する
- Helmを使用してNginxIngressControllerをセットアップする
- NginxIngressControllerによって作成されたLoadBalancerを指すレコードセットをRoute53に作成します
- サンプルアプリケーションのオブジェクト定義ファイルを作成する
- サンプルアプリケーションをデプロイする
- 入力オブジェクトをデプロイする
Kopsを使用してKubernetesクラスターを作成する
クラスタの作成に進む前に、次のコマンドを使用してAWSIAMユーザーアクセスとシークレットキーをエクスポートします。
export AWS_ACCESS_KEY_ID=<your-aws-access-key-here> #Export AWS Access Key
export AWS_SECRET_ACCESS_KEY=<your-aws-secret-key-here> ##Export AWS Secret Key export
Now, export the KOPS_STATE_STORE variable with value as S3 bucket name on your terminal.
KOPS_STATE_STORE=s3://<s3-bucket-name>
Kopsを使用して初めてクラスターを作成し、クラスター構成を保存するために上記で指定したS3バケットを使用する場合、次のコマンドを使用してクラスターを取得しようとしても、クラスターは表示されません。
kops get clusters
Kopsの詳細を理解するには、前提条件で指定されているドキュメントにアクセスしてください。ここで、Kubernetesクラスターを作成するには、値を置き換えて次のコマンドを実行します。ここでは詳しく説明しません。
kops create cluster --name <subdomain.domain.com> --state s3://<s3-bucket> --cloud aws --master-size t2.small --master-count 1 --master-zones us-east-1a --node-size t2.small --node-count 2 --zones us-east-1a,us-east-1b,us-east-1c
提案にはいくつかのコマンドが表示されます。
今回、クラスター構成を取得しようとすると、クラウドとゾーンとともにクラスター名が出力に表示されます。
この時点まで、クラスターは作成されていません。次のコマンドを実行して、クラスター構成を更新してください。
kops update cluster --name kops.devopslee.com
クラスタリソースを作成するには、オプションとして--yesを指定して上記のコマンドを実行する必要があります。
kops update cluster --name kops.devopslee.com --yes
クラスターの準備ができているかどうかを検証します。
kops validate cluster --wait 10m
クラスターが正常になるまでしばらく待つ必要があります。
kops validate cluster --wait 10m
クラスタが正常になったら、次のコマンドを使用して、すべてのネームスペースのデフォルトのポッドを確認できます。
kubectl get pods -A
Helmを使用してNginxIngressControllerをセットアップする
Kubernetesクラスターの準備が整い、正常になったら、Helmを使用してNginxIngressControllerをインストールします。
続行する前に、Helmv3.5.3を使用していることを確認してください。
注:現在の場所にあるヘルムバイナリを使用したため、スクリーンショットで./helmを確認できます。
helm version
リポジトリを追加し、次のコマンドを使用してNginx IngressControllerHelmチャートをインストールします。 Helmを理解するには、前提条件のセクションに記載されているドキュメントを参照してください。
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true
上のスクリーンショットでは、ヘルムチャートがインストールされていることがわかります。
IngressControllerの一部として作成されたリソースを確認できます。
kubectl get pods
kubectl get deployment
kubectl get service
上のスクリーンショットでは、タイプLoadBalancerのサービス「nginx-ingress-ingress-nginx-controller」も作成されていることがわかります。これは、LoadBalancerがAWSアカウントで作成されたことを意味します。
NginxIngressによって作成されたLoadBalancerを指すレコードセットをRoute53に作成しますコントローラー
Kubernetesクラスターを作成したリージョンのAWSアカウントに移動します。 LoadBalancerを確認し、そのDNS名をコピーします。
次に、Route53に移動し、HostedZoneに単一のAレコードを作成します。
有効なレコードを作成すると、作成したレコードを使用して、作成したNginxIngressControllerを介してトラフィックをKubernetesクラスタにルーティングします。この場合、kops.devopslee.comは、トラフィックをNginxIngressControllerを介してKubernetesクラスタのサービスにルーティングします。
それでは、サンプルアプリケーションをデプロイするためのオブジェクト定義ファイルを作成しましょう。 3つのデプロイメントとデプロイメント用の3つのそれぞれのサービスを使用して3つのアプリケーションをデプロイします。次に、パスベースのルーティングを使用してIngressリソースを作成し、パスに基づいてkops.devopslee.comを使用してトラフィックをアプリケーションにルーティングします。
アプリケーション1用に1-nginx-main-app.yamlを作成します。
Githubリンク:ここをクリックして、Githubリポジトリからファイルをコピーします。
apiVersion: apps/v1 kind: Deployment metadata: labels: run: nginx name: nginx-deploy-main spec: replicas: 1 selector: matchLabels: run: nginx-main template: metadata: labels: run: nginx-main spec: containers: - image: nginx name: nginx --- apiVersion: v1 kind: Service metadata: name: nginx-deploy-main spec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: run: nginx-main
アプリケーション2用に2-nginx-green-app.yamlを作成します。
Githubリンク:ここをクリックして、Githubリポジトリからファイルをコピーします。
apiVersion: apps/v1 kind: Deployment metadata: labels: run: nginx name: nginx-deploy-green spec: replicas: 1 selector: matchLabels: run: nginx-green template: metadata: labels: run: nginx-green spec: volumes: - name: webdata emptyDir: {} initContainers: - name: web-content image: busybox volumeMounts: - name: webdata mountPath: "/webdata" command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=green>GREEN</font></h1>" > /webdata/index.html'] containers: - image: nginx name: nginx volumeMounts: - name: webdata mountPath: "/usr/share/nginx/html" --- --- apiVersion: v1 kind: Service metadata: name: nginx-deploy-green spec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: run: nginx-green
アプリケーション3用に3-nginx-blue-app.yamlを作成します
Githubリンク:ここをクリックして、Githubリポジトリからファイルをコピーします。
apiVersion: apps/v1 kind: Deployment metadata: labels: run: nginx name: nginx-deploy-blue spec: replicas: 1 selector: matchLabels: run: nginx-blue template: metadata: labels: run: nginx-blue spec: volumes: - name: webdata emptyDir: {} initContainers: - name: web-content image: busybox volumeMounts: - name: webdata mountPath: "/webdata" command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=blue>BLUE</font></h1>" > /webdata/index.html'] containers: - image: nginx name: nginx volumeMounts: - name: webdata mountPath: "/usr/share/nginx/html" --- apiVersion: v1 kind: Service metadata: name: nginx-deploy-blue spec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: run: nginx-blue
パスベースの入力ルールを作成するための4-ingress.yamlを作成します。
Githubリンク:ここをクリックして、Githubリポジトリからファイルをコピーします。
apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: / name: ingress-resource spec: rules: - host: kops.devopslee.com http: paths: - path: / backend: serviceName: nginx-deploy-main servicePort: 80 - path: /blue backend: serviceName: nginx-deploy-blue servicePort: 80 - path: /green backend: serviceName: nginx-deploy-green servicePort: 80
これらのファイルはすべて、私のGithubリポジトリにあります。
サンプルアプリケーションを1つずつデプロイして、そのステータスを確認しましょう。
kubectl apply -f 1-nginx-main-app.yaml
kubectl apply -f 2-nginx-green-app.yaml
kubectl apply -f 3-nginx-blue-app.yaml
kubectl get deployments
kubectl get pods
kubectl get service
次に、パスベースのルーティングIngressリソースを作成します。同時に、Nginxポッドのログを確認してください。
kubectl logs nginx-ingress-ingress-nginx-controller-5c97c6b4d5-btvpl -f
kubectl apply -f 4-ingress.yaml
Ingressリソースが作成されるとすぐに、Nginxがその構成をロードしたことがわかります。
これで、同じホスト名、つまりkops.devopslee.comを使用して、異なるパスで3つの異なるアプリケーションにアクセスできるようになりました。
アプリケーションのURL、ここでのホスト名の名前はあなたによって異なります。
nginx-deploy-mainには、kops.devopslee.comからアクセスできます
nginx-deploy-greenには、kops.devopslee.com/greenと
からアクセスできます。nginx-deploy-blueには、kops.devopslee.com / blue
からアクセスできます。
パスに基づいて同じホスト名を使用して、3つの異なるアプリケーションにアクセスできることがわかります。
この記事では、Kopsを使用してKubernetesクラスタを作成する手順を説明しました。この記事では、主にHelmを使用したNginx Ingress Controllerのセットアップと、Ingressリソースを使用したパスベースのルーティングの作成に焦点を当てました。 3つの異なるサンプルアプリケーションをデプロイし、同じホスト名と異なるパスを使用してそれらにアクセスしてみました。