Kubernetes Gateway のセットアップ
NGINXをDataplaneとしてKubernetes Gatewayを利用する方法を紹介します。 Kubernetes Gatewayの情報は GitHub: nginx-kubernetes-gateway を参照してください
Note
本資料作成時点では、NGINX OSSを利用した動作確認となります
Gateway APIについて
Gateway APIについて簡単にご説明します
Gateway APIはKubernetesにおいて、既存のIngressに比べより柔軟な設定方法の実現を目的としています。
GatewayClass
, Gateway
, HTTPRoute
, TCPRoute
, Service
などのリソースを用いて、様々なベンダーや担当者などが自由に設定できるインタフェースを提供します。
各コンセプトについて紹介します
Role-oriented
: Gatewayは複数のAPIリソースで構成されます。各Roleに応じたKubernetesネットワークの利用や設定を提供しますPortable(移植可能性)
: 以前の実装から引き継がれる性質。Ingressは汎用的な仕様を備え、Gateway APIは移植可能な多くの機能が実装されていますExpressive(多様な設定)
: Gatweay APIはヘッダーベースの処理、トラフィックのウェイト等、IngressではCustom Annotationが必要であったような機能がサポートされますExtensible(拡張性)
: Gateway APIは様々な層のAPIに接続可能で、より適切な箇所でより細かな要件の実現が可能となります
更に以下のような特徴を持ちます
GatewayCalss
: GatewayClass はロードバランシングを形式化したものです。Kubernetesのリソースを利用し、簡単に且つそれぞれ個別にユーザが設定の管理をすることができますShared Gateways and cross-Namespace support(複数ネームスペース間でのGatewayの共有)
: ロードバランサーや仮想IP(VIP)として通信を待ち受ける単一のゲートウェイに、それぞれ個別の Route リソースを割り当てることができます。これにより複数のチームが互いに密な連携をすることなくインフラストラクチャを安全に共有できますTyped Routes and typed backends(予め定義されたRouteとBackend)
: Gateway APIは予め役割が定義されたRouteとBackendがあります。これはHTTPやgRPCなどのプロトコルや、ServiceやStorage Bucketなどバックエンドを柔軟にサポートできます
これらの特徴から、複数の組織で多彩な設定と、各設定の柔軟な可搬性を同時に実現します
環境のセットアップ
ファイルの取得
cd ~/
git clone https://github.com/nginxinc/nginx-kubernetes-gateway.git
cd nginx-kubernetes-gateway
Gateway APIリソースをデプロイします
## cd nginx-kubernetes-gateway
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.7.0/standard-install.yaml
必要となるリソースをデプロイします
## cd nginx-kubernetes-gateway
kubectl apply -f deploy/manifests/namespace.yaml
kubectl apply -f deploy/manifests/gatewayclass.yaml
kubectl apply -f deploy/manifests/nginx-gateway.yaml
Config Mapをデプロイします
## cd nginx-kubernetes-gateway
kubectl create configmap njs-modules --from-file=internal/nginx/modules/src/httpmatches.js -n nginx-gateway
Kubernetes Gateway 用のNGINXが起動していることを確認します
## cd nginx-kubernetes-gateway
kubectl get pods -n nginx-gateway
1 2 | NAME READY STATUS RESTARTS AGE nginx-gateway-67cb7f7d65-gq8jp 2/2 Running 0 7m5s |
外部へNodePortで公開します。 一分内容を追記し、NodePort Serviceをデプロイします
## cd nginx-kubernetes-gateway
cp deploy/manifests/service/nodeport.yaml deploy/manifests/service/nodeport.yaml-
cat << EOF > deploy/manifests/service/nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-gateway
namespace: nginx-gateway
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
name: https
selector:
app: nginx-gateway
EOF
kubectl apply -f deploy/manifests/service/nodeport.yaml
以下コマンドでポート確認します
kubectl get svc -n nginx-gateway
1 2 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-gateway NodePort 10.110.155.239 <none> 80:32203/TCP,443:31483/TCP 28m |
このコマンドを実行した結果、Kubernetes の Worker Nodeでそれぞれのサービスに対しポートが割り当てられています。 6. NGINX Ingress Controller を外部へ NodePort で公開する の内容を参考に、NGINXのConfigを作成し、設定を反映します。
cd ~/
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf-
cat << EOF > nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
# TCP/UDP load balancing
#
stream {
upstream tcp80_backend {
server node1:32203; # HTTP(TCP/80)に割り当てられたポート番号
}
upstream tcp443_backend {
server node1:31483; # HTTPS(TCP/443)に割り当てられたポート番号
}
server {
listen 80;
proxy_pass tcp80_backend;
}
server {
listen 443;
proxy_pass tcp443_backend;
}
}
EOF
sudo cp nginx.conf /etc/nginx/nginx.conf
sudo nginx -s reload