KubernetesのIngressはクラスタ外部からのアクセスを管理する仕組みであり、HTTP経由でリバースプロキシを通じて内部サービスにルーティングします。以下に基本概念と実装例を示します。
1. Ingressの特徴
- 7層負荷均衡を実現しHTTP通信のみサポート
- ルール定義とコントローラーで構成される柔軟なルーティング
- kube-proxyを介さず直接エンドポイントに転送
- 同一ネームスペース内でのみ参照可能
- パス指定時は末尾スラッシュが必須
2. 動作フロー
- ユーザーがIngressリソースを作成
- コントローラーが変更を監視
- 負荷均衡器の設定更新
- 要求のルーティング処理
- サービスからのレスポンス返却
3. 実装例
3.1 Ingressコントローラー定義
# custom-ingress-controller.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: custom-ingress
namespace: system
data:
proxy-body-size: "250m"
client-header-timeout: "360"
log-format-upstream: "{\"time\":\"$time_iso8601\"...}"
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: ingress-sa
namespace: system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: ingress-role
rules:
- apiGroups: [""]
resources: [services, pods]
verbs: ["get", "list", "watch"]
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ingress-ds
spec:
template:
spec:
containers:
- name: ingress
image: custom-ingress:1.0
args:
- --configmap=system/custom-ingress
env:
- name: TZ
value: Asia/Tokyo
ports:
- containerPort: 80
- containerPort: 443
hostNetwork: true
3.2 Ingressオブジェクト定義
# service-routes.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
namespace: system
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: custom
rules:
- host: app.example.com
http:
paths:
- path: /metrics
pathType: Prefix
backend:
service:
name: monitoring
port:
number: 9090
- http:
paths:
- path: /web
pathType: Prefix
backend:
service:
name: web-app
port:
number: 80
4. 操作コマンド
# オブジェクト作成
kubectl apply -f service-routes.yaml
# 一覧表示
kubectl get ingresses -A
# 詳細確認
kubectl describe ingress app-ingress -n system
# YAML出力
kubectl get ingress app-ingress -o yaml