スキップしてコンテンツを表示

Amazon EKS クラスターで実行されている Kubernetes サービスを公開する方法を教えてください。

所要時間4分
0

Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで実行されている Kubernetes サービスを公開したいです。

解決策

Amazon EKS クラスターで実行されている Kubernetes Services を公開するには、まずサンプルアプリケーションを作成します。次に、Kubernetes Service のタイプ (ClusterIP、NodePort、LoadBalancer のいずれか) をそのサンプルアプリケーションに適用します。詳細については、Kubernetes のウェブサイトで「サービスのタイプ」を参照してください。

サンプルアプリケーションを作成する

次の手順を実行します。

  1. デプロイファイルを定義し、Kubernetes で適用します。次のコマンド例は、nginx-deployment.yaml というファイルを作成した後、2 つの nginx ポッドを起動する ReplicaSet を作成します。

    cat <<EOF > nginx-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    EOF
  2. 次のコマンドを実行してデプロイを作成します。

    kubectl apply -f nginx-deployment.yaml
  3. 次のコマンドを実行し、ポッドが動作していて、独自の内部 IP アドレスがあることを確認します。

    kubectl get pods -l 'app=nginx' -o wide | awk {'print $1" " $3 " " $6'} | column -t

    出力例:

    NAME                               STATUS   IP
    nginx-deployment-574b87c764-hcxdg  Running  192.168.20.8
    nginx-deployment-574b87c764-xsn9s  Running  192.168.53.240

サービスタイプを適用する

アプリケーションの公開方法を決定し、適切なサービスタイプを適用します。各サービスタイプの詳細については、Kubernetes のウェブサイトで type: ClusterIP、type: NodePort、type: LoadBalancer を参照してください。

サービスタイプ: ClusterIP

次の手順を実行します。

  1. clusterip.yaml というファイルを作成します。

  2. 次の例に示すように、type を ClusterIP に設定します。

    cat <<EOF > clusterip.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service-cluster-ip
    spec:
      type: ClusterIP
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    EOF
  3. 宣言型コマンドまたは命令型コマンドを実行し、Kubernetes に ClusterIP オブジェクトを作成します。
    次の宣言型コマンドを実行し、オブジェクトを作成して clusterip.yaml ファイルを適用します。

    kubectl create -f clusterip.yaml

    出力例:

    service/nginx-service-cluster-ip created>/code>

    または、

    次の命令型コマンドを実行し、ClusterIP タイプのデプロイを公開します。

    kubectl expose deployment nginx-deployment  --type=ClusterIP  --name=nginx-service-cluster-ip

    注: expose コマンドではサービスが作成されますが、YAML ファイルは作成されません。ただし、kubectl により、命令型コマンドが宣言型の Kubernetes デプロイに変換されます。
    出力例:

    service "nginx-service-cluster-ip" exposed
  4. 次のコマンドを実行し、CLUSTER-IP アドレスを取得します。

    kubectl get service nginx-service-cluster-ip

    出力例:

    NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    nginx-service-cluster-ip   ClusterIP   10.100.12.153   <none>        80/TCP    23s
  5. 次のコマンドを実行し、CLUSTER-IP アドレスを使用してアプリケーションにアクセスします。

    curl -silent 10.100.12.153:80 | grep title

    注: サービスにアクセスするには、ワーカーノードにログインするか、ポッドのコンテナ内で操作する必要があります。

  6. 次のコマンドを実行し、ClusterIP サービスを削除します。

    kubectl delete service nginx-service-cluster-ip

    出力例:

    service "nginx-service-cluster-ip" deleted

サービスタイプ: NodePort

次の手順を実行します。

  1. nodeport.yaml というファイルを作成します。

  2. 次の例に示すように、[type] を NodePort に設定します。

    cat <<EOF > nodeport.yaml
    apiVersion: v1
    kind: Service
    metadata:  
      name: nginx-service-nodeport
    spec:
      type: NodePort
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    EOF
  3. 宣言型コマンドまたは命令型コマンドを実行し、Kubernetes に NodePort オブジェクトを作成します。
    次の宣言コマンドを実行し、オブジェクトを作成して nodeport.yaml ファイルを適用します。

    kubectl create -f nodeport.yaml

    または、

    次の命令型コマンドを実行し、NodePort タイプのデプロイを公開します。

    kubectl expose deployment nginx-deployment  --type=NodePort  --name=nginx-service-nodeport

    出力例:

    service/nginx-service-nodeport exposed
  4. 次のコマンドを実行し、nginx-service に関する情報を取得します。

    kubectl get service/nginx-service-nodeport

    出力例:

    NAME                     TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    nginx-service-nodeport   NodePort   10.100.106.151   <none>        80:30994/TCP   27s

    重要: NodePort は、クラスター内でアクセス可能なサービス IP アドレスを作成し、指定されたポート経由ですべてのノードにサービスを公開します。上記のコマンドの出力は、NodePort サービスタイプが使用可能なワーカーノードの Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのポートを介して、外部に公開されていることを示しています。クラスターの外部から NodeIP:NodePort にアクセスする前に、ノードのセキュリティグループにおいて、出力に表示されているポートを経由する受信トラフィックを許可する設定を行います。

  5. ノードがパブリックサブネット内にあり、インターネットからアクセスできる場合は、ノードのパブリック IP アドレスを確認します。

    kubectl get nodes -o wide |  awk {'print $1" " $2 " " $7'} | column -t

    出力例:

    NAME                                      STATUS  EXTERNAL-IP
    ip-10-0-3-226.eu-west-1.compute.internal  Ready   1.1.1.1
    ip-10-1-3-107.eu-west-1.compute.internal  Ready   2.2.2.2

    または、

    ノードがプライベートサブネット内にあり、仮想プライベートクラウド (VPC) 経由でのみアクセスできる場合は、ノードのプライベート IP アドレスを確認します。

    kubectl get nodes -o wide |  awk {'print $1" " $2 " " $6'} | column -t

    出力例:

    NAME                                      STATUS  INTERNAL-IP
    ip-10-0-3-226.eu-west-1.compute.internal  Ready   10.0.3.226
    ip-10-1-3-107.eu-west-1.compute.internal  Ready   10.1.3.107
  6. 次のコマンドを実行し、Node IP と NodePort を使用してアプリケーションにアクセスします。

    curl -silent <Public/PrivateNodeIP>:30994 | grep title
  7. 次のコマンドを実行し、NodePort サービスを削除します。

    kubectl delete service nginx-service-nodeport

    出力例:

    service "nginx-service-nodeport" deleted

サービスタイプ: LoadBalancer

次の手順を実行します。

  1. loadbalancer.yaml というファイルを作成します。

  2. 次の例に示すように、type を LoadBalancer に設定します。

    cat <<EOF > loadbalancer.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service-loadbalancer
    spec:
      type: LoadBalancer
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    EOF
  3. loadbalancer.yaml ファイルを適用するには、次のコマンドを実行します。

    kubectl create -f loadbalancer.yaml

    出力例:

    service/nginx-service-loadbalancer created

    または、

    次のコマンドを実行し、LoadBalancer タイプのデプロイを公開します。

    kubectl expose deployment nginx-deployment  --type=LoadBalancer  --name=nginx-service-loadbalancer

    出力例:

    service "nginx-service-loadbalancer" exposed
  4. 次のコマンドを実行し、nginx-service に関する情報を取得します。

    kubectl get service/nginx-service-loadbalancer |  awk {'print $1" " $2 " " $4 " " $5'} | column -t

    出力例:

    NAME                        TYPE          EXTERNAL-IP                        PORT(S)
    nginx-service-loadbalancer  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP
  5. 次のコマンドを実行し、ロードバランサーに外部からアクセスできることを確認します。

    curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
  6. 次のコマンドを実行し、LoadBalancer サービスを削除します。

    kubectl delete service nginx-service-loadbalancer

    出力例:

    service "nginx-service-loadbalancer" deleted

注: デフォルトでは、LoadBalancer サービスタイプは Classic Load Balancer を作成します。サポータビリティを最適化し、長期的な信頼性を得るには、AWS Load Balancer Controller を使用して Network Load Balancer をプロビジョニングすることを推奨します。AWS が管理するこのソリューションを利用すると、機能、AWS サービスとの統合、サポートを改善できます。

インスタンスタイプのターゲットを含む Network Load Balancer を作成するには、サービスマニフェストに次のアノテーションを追加します。

service.beta.kubernetes.io/aws-load-balancer-type: nlb

または、

AWS Load Balancer Controller をデプロイした後に、IP ターゲットを使用するロードバランサーを作成することで、IP ターゲットを含む Network Load Balancer を作成します。

コメントはありません

関連するコンテンツ