Amazon EKS クラスターで実行されている Kubernetes サービスを公開するにはどうすればよいですか?
Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで実行されている Kubernetes Service を公開したいと考えています。
簡単な説明
クラスターで実行されている Kubernetes サービスを公開するには、まずサンプルアプリケーションを作成します。次に、ClusterIP、NodePort、LoadBalancer 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 ターゲットを使用するロードバランサーを作成します。
関連するコンテンツ
- 質問済み 5ヶ月前lg...
- 質問済み 4年前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 2ヶ月前
- AWS公式更新しました 2年前