Amazon EKS クラスターで実行されている Kubernetes サービスを公開する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで実行されている Kubernetes サービスを公開したいです。
解決策
Amazon EKS クラスターで実行されている Kubernetes Services を公開するには、まずサンプルアプリケーションを作成します。次に、Kubernetes Service のタイプ (ClusterIP、NodePort、LoadBalancer のいずれか) をそのサンプルアプリケーションに適用します。詳細については、Kubernetes のウェブサイトで「サービスのタイプ」を参照してください。
サンプルアプリケーションを作成する
次の手順を実行します。
-
デプロイファイルを定義し、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 -
次のコマンドを実行してデプロイを作成します。
kubectl apply -f nginx-deployment.yaml -
次のコマンドを実行し、ポッドが動作していて、独自の内部 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
次の手順を実行します。
-
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 -
宣言型コマンドまたは命令型コマンドを実行し、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 -
次のコマンドを実行し、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 -
次のコマンドを実行し、CLUSTER-IP アドレスを使用してアプリケーションにアクセスします。
curl -silent 10.100.12.153:80 | grep title注: サービスにアクセスするには、ワーカーノードにログインするか、ポッドのコンテナ内で操作する必要があります。
-
次のコマンドを実行し、ClusterIP サービスを削除します。
kubectl delete service nginx-service-cluster-ip出力例:
service "nginx-service-cluster-ip" deleted
サービスタイプ: 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 -
宣言型コマンドまたは命令型コマンドを実行し、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 -
次のコマンドを実行し、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 にアクセスする前に、ノードのセキュリティグループにおいて、出力に表示されているポートを経由する受信トラフィックを許可する設定を行います。
-
ノードがパブリックサブネット内にあり、インターネットからアクセスできる場合は、ノードのパブリック 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 -
次のコマンドを実行し、Node IP と NodePort を使用してアプリケーションにアクセスします。
curl -silent <Public/PrivateNodeIP>:30994 | grep title -
次のコマンドを実行し、NodePort サービスを削除します。
kubectl delete service nginx-service-nodeport出力例:
service "nginx-service-nodeport" deleted
サービスタイプ: 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 -
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 -
次のコマンドを実行し、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 -
次のコマンドを実行し、ロードバランサーに外部からアクセスできることを確認します。
curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title -
次のコマンドを実行し、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 を作成します。
- トピック
- Containers
- 言語
- 日本語

