KubernetesにおけるIngressによるサービス発見の仕組みと実装

KubernetesのIngressはクラスタ外部からのアクセスを管理する仕組みであり、HTTP経由でリバースプロキシを通じて内部サービスにルーティングします。以下に基本概念と実装例を示します。

1. Ingressの特徴

  • 7層負荷均衡を実現しHTTP通信のみサポート
  • ルール定義とコントローラーで構成される柔軟なルーティング
  • kube-proxyを介さず直接エンドポイントに転送
  • 同一ネームスペース内でのみ参照可能
  • パス指定時は末尾スラッシュが必須

2. 動作フロー

  1. ユーザーがIngressリソースを作成
  2. コントローラーが変更を監視
  3. 負荷均衡器の設定更新
  4. 要求のルーティング処理
  5. サービスからのレスポンス返却

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

タグ: Kubernetes ingress nginx rbac Helm

7月10日 16:37 投稿