外部クライアントが Container Service for Kubernetes (ACK) クラスターにデプロイされた gRPC アプリケーションにアクセスできるようにするには、NGINX Ingress を設定し、nginx.ingress.kubernetes.io/backend-protocol: "GRPC" アノテーションを追加して gRPC トラフィックをルーティングできます。
コア設定例
次の例は、NGINX Ingress を使用して gRPC Service を安全に公開するためのコア設定を示しています。
gRPC プロトコルプロキシ:
backend-protocol: "GRPC"アノテーションは、Ingress コントローラーに対し、デフォルトの HTTP プロトコルではなく、HTTP/2 に基づく gRPC プロトコルを使用してトラフィックをプロキシするように指示します。TLS 暗号化: サンプルドメイン
grpc.example.comに対して Transport Layer Security (TLS) が有効になっています。トラフィックは Secret に保存されている証明書を使用して暗号化されます。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grpc-ingress
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC" # キー設定: バックエンドサービスが gRPC であることを指定します
spec:
tls:
- hosts:
- grpc.example.com # ご自身の gRPC Service ドメインに置き換えてください
secretName: nginx-ingress-tls # TLS 証明書を含む Secret。
rules:
- host: grpc.example.com # ご自身の gRPC Service ドメインに置き換えてください
#...ステップ 1: サンプル gRPC アプリケーションのデプロイ
grpc.yamlという名前のファイルを作成し、次の内容で gRPC サンプルサービスを定義します。apiVersion: apps/v1 kind: Deployment metadata: name: grpc-service spec: replicas: 1 selector: matchLabels: run: grpc-service template: metadata: labels: run: grpc-service spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/grpc-server:latest imagePullPolicy: Always name: grpc-service ports: - containerPort: 50051 protocol: TCP restartPolicy: Always --- apiVersion: v1 kind: Service metadata: name: grpc-service spec: ports: - port: 50051 protocol: TCP targetPort: 50051 selector: run: grpc-service sessionAffinity: None type: NodePortこの Service は、次の
.protoファイルで定義されます。Service 名はGreeterで、SayHelloメソッドを提供します。gRPC アプリケーションをデプロイします。
kubectl apply -f grpc.yaml
ステップ 2: SSL 証明書を Secret として保存
gRPC が依存する HTTP/2 を有効にするには、まず Ingress の TLS 暗号化を有効にする必要があります。安全な管理のために、SSL 証明書と秘密鍵を Secret に保存します。次に、この Secret を参照して TLS 暗号化を設定します。
SSL 証明書を取得します。
本番環境: 信頼できる証明書認証局 (CA) または Alibaba Cloud から商用証明書を購入します。
テスト環境: 自己署名証明書を生成します。
(オプション) Alibaba Cloud から証明書を購入した場合は、SSL 証明書ファイルをダウンロードします。
証明書と秘密鍵を保存するための Kubernetes Secret を作成します。
コンソール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[シークレット] ページで、
default名前空間を選択し、[作成] をクリックして、表示されるパネルで新しい Secret を設定します。 次に、[OK] をクリックします。キー:
nginx-ingress-tlsタイプ: TLS 証明書
[+ 追加] をクリックします
キー: 証明書ファイル (
.crtまたは.pem) の全内容値: 秘密鍵ファイル (
.key) の全内容
kubectl
ご自身の証明書ファイル (
.crtまたは.pem) と秘密鍵ファイル (.key) のパスで<PUBLIC_CERT>と<PRIVATE_KEY>を置き換えます。次に、コマンドを実行して証明書と秘密鍵を Secret として保存します。# --key パラメーターは秘密鍵ファイルを指定し、--cert パラメーターは証明書ファイルを指定します。 kubectl create secret tls nginx-ingress-tls --cert <PUBLIC_CERT> --key <PRIVATE_KEY>
ステップ 3: Service を公開するための Ingress 設定
ACK コンソールにログインし、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[アドオン] を選択します。
検索ボックスに Nginx Ingress Controller と入力します。アドオンカードで、[インストール] または [アップグレード] をクリックします。
Ingress を設定します。
annotationsを使用して、バックエンドプロトコルが gRPC であることを指定し、作成した Secret を参照します。コンソール
左側のナビゲーションウィンドウで、 を選択します。
default名前空間を選択し、[Ingress の作成] をクリックします。次のパラメーターで Ingress を設定し、[OK] をクリックします。
ゲートウェイタイプ:
Nginx Ingressを選択します。名前:
grpc-ingress。ドメイン名:
grpc.example.com。マッピング
パス:
/マッチングルール:
プレフィックス (プレフィックスベースのマッチ)Service:
grpc-serviceポート:
50051
TLS 設定: このオプションを有効にします。
ドメイン名:
grpc.example.comSecret:
nginx-ingress-tls
アノテーション
名前:
nginx.ingress.kubernetes.io/backend-protocol値:
GRPC
[Ingress] ページで、新しい Ingress を表示して、そのアクセス [エンドポイント] を取得します。
NGINX Ingress が有効になるまで約 10 秒かかります。次に、更新ボタンをクリックしてエンドポイント情報を表示します。エンドポイント情報が更新されない場合は、Ingress 名をクリックして [イベント] タブに移動し、問題をトラブルシューティングします。
kubectl
次の内容で
grpc-ingress.yamlという名前のファイルを作成します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: grpc-ingress annotations: # コア設定: バックエンドプロトコルが gRPC であることを指定します nginx.ingress.kubernetes.io/backend-protocol: "GRPC" spec: ingressClassName: nginx # Secret を参照して TLS を設定します tls: - hosts: - grpc.example.com # gRPC Service ドメインに置き換えます secretName: nginx-ingress-tls # 前のステップで作成した Secret に指定した名前 rules: - host: grpc.example.com # gRPC Service ドメインに置き換えます http: paths: - path: / pathType: Prefix backend: service: name: grpc-service port: number: 50051Ingress リソースをデプロイします。
kubectl apply -f grpc-ingress.yamlIngress コントローラーの外部 IP アドレスを取得します。IP が割り当てられるまで少し時間がかかる場合があります。アドレスが返されない場合は、10 秒待ってから再試行してください。
ADDRESS=$(kubectl get ingress grpc-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $ADDRESS
ステップ 4: gRPC Service へのアクセス
テスト目的で、ローカルの
hostsファイルにエントリを追加して、ドメインを Ingress IP アドレスにマッピングします。macOS/Linux:
sudo vi /etc/hostsWindows: メモ帳を管理者として開き、
C:\Windows\System32\drivers\etc\hostsにあるファイルを開きます。
<ADDRESS>を実際の [エンドポイント] に置き換えます。次のドメイン名マッピングをファイルの末尾に追加して保存します。<ADDRESS> grpc.example.comgrpcurl をインストールします。次に、gRPC Service インターフェイスを呼び出します。
grpcurl -d '{"name": "gRPC"}' grpc.example.com:443 helloworld.Greeter/SayHello{ "message": "Hello gRPC" }
制限事項
gRPC の長時間接続という特性により、NGINX Ingress は現在、gRPC バックエンドに対する Service の重み (service-weight) に基づくルーティングをサポートしていません。
よくある質問
テスト用に自己署名証明書を生成するにはどうすればよいですか?
次のコマンドを実行して、有効期間 365 日のドメイン名 grpc.example.com の自己署名証明書 (grpc.crt) と秘密鍵 (grpc.key) を生成します:
openssl req -x509 -newkey rsa:2048 -keyout grpc.key -out grpc.crt -days 365 -nodes \
-subj "/CN=grpc.example.com" \
-addext "subjectAltName=DNS:grpc.example.com"自己署名証明書は、デフォルトではブラウザや他のクライアントから信頼されておらず、セキュリティ警告が表示されます。本番環境では自己署名証明書を使用しないでください。
SSL 証明書と TLS 証明書の違いは何ですか?
Secure Sockets Layer (SSL) は古い暗号化プロトコルであり、より安全な Transport Layer Security (TLS) プロトコルに置き換えられました。
現代の用語では、「SSL 証明書」は、技術的には「TLS 証明書」を指す俗称としてよく使われます。