Amazon EKS クラスターで実行されている Kubernetes サービスを公開するにはどうすればよいですか?

最終更新日: 2022 年 9 月 16 日

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

簡単な説明

クラスターで実行されている Kubernetes サービスを公開するには、まずサンプルアプリケーションを作成します。次に、ClusterIPNodePortLoadBalancer Kubernetes ServiceTypes をサンプルアプリケーションに適用します。

以下の点にご注意ください。

  • ClusterIP は、クラスターの内部 IP アドレスでサービスを公開します。
  • NodePort は、各ノードの IP アドレスで静的ポートでサービスを公開します。
  • LoadBalancer は、ロードバランサーを使用して外部でサービスを公開します。

注: Amazon EKS は、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスワーカーノードで実行されるポッドのために Network Load Balancer と Classic Load Balancer をサポートしています。Amazon EKS は、LoadBalancer を使用してこのサポートを提供します。ネットワークトラフィックを、Network Load Balancer (インスタンスまたは IP ターゲット) またはClassic Load Balancer (インスタンスターゲットのみ) に負荷分散できます。

解決方法

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

1.    デプロイメントファイルを定義して適用します。次の例では、2 つの nginx ポッドをスピンアップする ReplicaSet を作成し、nginx-deployment.yaml というファイルを作成します。

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

ClusterIP サービスを作成する

1.    clusterip.yaml という名前のファイルを作成し、[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

2.    宣言型または命令型コマンドを使用して、Kubernetes で ClusterIP オブジェクトを作成します。

オブジェクトを作成し、clusterip.yaml ファイルを適用するには、次の宣言型コマンドを実行します。

kubectl create -f clusterip.yaml

出力:

service/nginx-service-cluster-ip created

- または -

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

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

出力:

service "nginx-service-cluster-ip" exposed

注: expose コマンドは、YAML ファイルを作成せずにサービスを作成します。ただし、kubectl は命令型コマンドを宣言型の Kubernetes Deployment オブジェクトに変換します。

3.    アプリケーションにアクセスし、ClusterIP 番号を取得します。

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

4.    ClusterIP サービスを削除します。

kubectl delete service nginx-service-cluster-ip

出力:

service "nginx-service-cluster-ip" deleted

NodePort サービスを作成する

1.    NodePort サービスを作成するには、nodeport.yaml という名前のファイルを作成し、[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

2.    宣言型または命令型コマンドを使用して、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

3.    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

重要: ServiceType は、サービス用に自動的に作成される NodePort および ClusterIP です。上記のコマンドの出力は、NodePort サービスが使用可能なワーカーノードの EC2 インスタンスのポート (30994) で外部に公開されていることを示しています。外部クラスターから NodeIP:NodePort にアクセスする前に、ノードのセキュリティグループを設定し、着信トラフィックを許可する必要があります。上記の kubectl get service コマンドの出力に示されているポート (30994) を経由する着信トラフィックを許可できます。

4.    ノードがパブリックサブネットにあり、インターネットから到達可能な場合は、ノードのパブリック 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 内または 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

5.     NodePort サービスを削除します。

kubectl delete service nginx-service-nodeport

出力:

service "nginx-service-nodeport" deleted

LoadBalancer サービスを作成する

1.    LoadBalancer サービスを作成するには、loadbalancer.yaml という名前のファイルを作成し、[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

2.    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

3.    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

4.    ロードバランサーに外部からアクセスできることを確認します。

curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title

HTML タイトルタグの間に「Welcome to nginx!」という出力が表示されるはずです。

5.    LoadBalancer サービスを削除します。

kubectl delete service nginx-service-loadbalancer

出力:

service "nginx-service-loadbalancer" deleted

注: デフォルトでは、前述の LoadBalancer サービスはClassic Load Balancer を作成します。

6.    インスタンスタイプターゲットで Network Load Balancer を作成するには、サービスマニフェストに次の注釈を追加します。

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

- または -

IP ターゲットを持つ Network Load Balancer を作成するには、AWS Load Balancer Controller をデプロイしてから、IP ターゲットを使用するロードバランサーを作成します


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?