Contents
Kubernetes環境でEnvoy Proxyを導入する意義と前提条件
Kubernetesクラスターにおけるサービス通信の効率化やセキュリティ強化を目指す際、Envoy ProxyはService Mesh実装において重要な役割を果たします。特に、リバースプロキシ機能やルーティングポリシーの柔軟性が評価され、多くの企業が導入を検討しています。本記事では、Kubernetes環境でのEnvoy Proxyデプロイに必要な前提条件と意義について解説します。
Service Mesh実装におけるEnvoyの役割
Service Meshはマイクロサービスアーキテクチャにおいて、サービス間通信の管理やセキュリティ強化を目的としたレイヤーです。Envoy Proxyはその代表的なコンポーネントで、以下のような機能を提供します:
-
高速なネットワーク処理
L7プロキシとしての性能と、動的ルーティングにより通信遅延を最小限に抑えます。 -
サービス間のセキュリティ制御
mTLSや認証機構によるアクセス制御が可能です。 -
メトリクス収集・モニタリング支援
自身の統計情報をPrometheusなどのツールと連携させ、運用監視を効率化します。
事前に準備すべきクラスタ構成
Envoy Proxyを導入する際には、以下の条件がKubernetesクラスターで必須です:
-
Kubernetes v1.20以降のバージョン
EnvoyのHelmチャートやリソース定義に必要なAPI機能が実装されています。 -
RBAC(Role-Based Access Control)の設定
Envoyがクラスター内のリソースを操作する権限を持つ必要があります。 -
ネットワークポリシーの設定
外部からの不正アクセスを防ぐため、Service Meshと連携する際はネットワーク制御が必要です。
HelmチャートによるEnvoyのインストール手順
HelmはKubernetesアプリケーションのパッケージングツールであり、Envoy Proxyの導入に最適な方法です。公式リポジトリから取得し、カスタム設定を加えることで、柔軟なデプロイが可能です。
Helmリポジトリへの追加
Helmチャートを使用するにはまず、公式リポジトリを追加します。
-
リポジトリの追加
bash
helm repo add envoy https://envoyproxy.github.io/helm-charts
helm repo update -
バージョン確認
インストールするEnvoyのバージョンを確認します。最新版はhelm show chart envoy/envoyで確認可能です。
カスタム設定ファイルの作成
デフォルト設定では、セキュリティやリソース制限に不備がある場合があります。カスタム設定ファイルを作成して調整しましょう。
-
例:values.yaml
yaml
env:- name: ENVOY_LOG_LEVEL
value: "info"
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
- name: ENVOY_LOG_LEVEL
-
パラメータの調整ポイント
resources:Podに割り当てるリソースを適切に設定し、クラスター負荷を抑える。env:ログレベルや環境変数をカスタマイズ。
実際のデプロイコマンド
カスタム設定ファイルを作成したら、以下のようにインストールします。
-
チャートのインストール
bash
helm install envoy-envoy envoy/envoy -f values.yaml --namespace=envoy-system -
ステータス確認
bash
kubectl get pods -n envoy-system
注意点:Helmのバージョンが古い場合、
--create-namespaceフラグを付けてNamespaceを作成する必要があります。
ConfigMapによるEnvoy設定ファイルの管理
Envoy ProxyではYAMLやJSON形式で設定ファイルを定義します。ConfigMapを通じてこの設定をKubernetesに登録し、デプロイ時に反映することで、バージョン管理と更新が容易になります。
設定テンプレートの構成例
以下はEnvoy設定ファイルの一例です。clusters, routes, listenersなど、各セクションを指定します。
|
1 2 3 4 5 6 7 8 9 10 |
admin: access_log_path: /tmp/admin_access.log static_resources: clusters: - name: "backend" connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN hosts: [{ socket_address: { address: backend-service, port_value: 80 } }] |
-
ConfigMapの作成
bash
kubectl create configmap envoy-config --from-file=envoy.yaml -n envoy-system -
Podにマウント設定
デプロイメントファイルでvolumeMountsとvolumesを指定して、ConfigMapをPod内にマウントします。
Kubernetesサービスとの連携構成
Envoy ProxyはKubernetesのServiceやIngress Controllerと連携することで、サービス間通信の制御が可能になります。このセクションでは具体的な設定方法を解説します。
Ingress Controllerとの統合
Ingress Controllerを使用する場合、Envoy Proxyはリバースプロキシとして働き、外部からのリクエストを適切にルーティングします。
-
Ingress定義の例
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
kubernetes.io/ingress.class: "envoy"
spec:
rules:- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
- http:
-
Network Policyの適用
安全な通信を確保するため、以下のようなネットワークポリシーを作成します:
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: envoy-network-policy
spec:
podSelector:
matchLabels:
app: envoy-proxy
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
k8s-app: kube-system
egress:
- to:
- namespaceSelector:
matchLabels:
k8s-app: app-ns
Service Meshのグレーディング戦略
Envoy ProxyをService Meshに組み込む際は、既存サービスとの連携をスムーズに行うため、段階的な導入(グレーディング)が有効です。
| ステップ | 内容 | メリット |
|---|---|---|
| 1 | 選択したサービスにのみEnvoy Proxyを適用 | 個別でのテストとリスク管理 |
| 2 | サービス間の通信制御を強化 | リソース効率の最適化 |
| 3 | 全サービスへの導入 | 総合的なService Mesh構築 |
自動スケーリング設定のポイント
Envoy Proxyはトラフィック量に応じてPod数を自動調整する必要があります。Horizontal Pod Autoscaler(HPA)とPrometheusなどのメトリクスコレクターを組み合わせることで、効率的な運用が可能です。
Horizontal Pod Autoscalerの適用条件
HPAは以下のように設定します:
|
1 2 |
kubectl autoscale deployment envoy-proxy --cpu-percent=50 --min=2 --max=10 -n envoy-system |
--cpu-percent:CPU使用率を基準にスケーリングする。--min,--max:Podの最小・最大数を指定。
メトリクスコレクターの統合方法
Prometheusなどの外部ツールと連携させることで、カスタムメトリクスを基準にスケーリングできます。
-
Metrics Serverのデプロイ
bash
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -
HPAのカスタムメトリクス設定
以下のコマンドでPrometheusから取得するメトリクスを指定します:
bash
kubectl autoscale deployment envoy-proxy --query=envoy:requests_per_second --target-average=100 -n envoy-system
セキュリティ設定とアクセス制御の実装
Envoy ProxyはmTLS通信やOAuth2認証をサポートし、クラスター内のセキュリティ強化が可能です。以下に具体的な設定手順を解説します。
mTLS通信の有効化手順
mTLS(Mutual TLS)は、クライアントとサーバー間で双方向証明書による認証を行う仕組みです。
-
証明書の生成
bash
openssl req -new -x509 -days 365 -nodes -out ca.crt -keyout ca.key
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -
Envoy設定に証明書を指定
yaml
listeners:- name: listener_0
address: {socket_address: {address: 0.0.0.0, port_value: 10000}}
filter_chains:- filters:
- name: envoy.filters.network.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.tls.v3.TLSFilter
server_certificate: "/etc/ssl/certs/server.crt"
private_key: "/etc/ssl/private/server.key"
- name: envoy.filters.network.tls
- filters:
- name: listener_0
OAuth2認証の統合方法
OAuth2を活用することで、外部ユーザーからのアクセス制御が可能です。
- Auth Serverとの連携設定
Envoyのenvoy.filters.http.oauth2フィルタを使用し、リクエストヘッダにトークンを含めます:
yaml
routes:
- match: { prefix: "/" }
route: { cluster: "backend" }
typed_per_filter_config:
envoy.filters.http.oauth2:
"@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2PerRouteConfig
issuer_url: https://auth-server.com
- Envoy Proxyの導入により、Kubernetesクラスターの通信効率とセキュリティが向上します
- Helmチャートで簡単かつ柔軟にデプロイ可能です。
- ConfigMapを活用し、設定ファイルはバージョン管理できる仕組みにしましょう。
- Ingress Controllerとの連携で、外部アクセスの制御も可能になります。
- 自動スケーリングとメトリクスの統合により、リソース効率が最適化されます。
- mTLSやOAuth2などで、セキュリティ強化を実現できます。
記事を参考にKubernetes環境でEnvoy Proxyのデプロイを試してみてください。実装中に課題があればコメント欄でお知らせください。