説明
type: LoadBalancer の Service は、クラスター外からアクセスできるエンドポイントを作成できます。インターネットへの公開はクラウドとコントローラーの設定に依存します。内部用サービスを公開すると、意図しないアクセス経路が生じるおそれがあります。
まず外部アクセスの必要性を判断してください。内部通信には ClusterIP または内部専用の LoadBalancer を優先して検討してください。
想定される影響
- 内部サービスがインターネットや外部ネットワークに直接公開される場合があります。
- 認証やアクセス制御の弱いサービスが、外部からの探索対象になるおそれがあります。
- 把握していない公開経路により、セキュリティ管理が難しくなる場合があります。
対処方法
- 外部公開が不要なサービスには、内部 Service または内部 LoadBalancer を使用してください。
- 使用するコントローラーに対応する内部専用設定を適用し、実際のロードバランサーとアクセスルールを確認してください。
- 公開が必要なサービスだけを承認し、管理してください。
例
後の例の annotation は、対応する AWS コントローラー向けです。AWS Load Balancer Controller はこの従来設定をサポートしますが、aws-load-balancer-scheme が優先されます。使用するバージョンの推奨設定と実際の構成を確認してください。
変更前
yaml
apiVersion: v1
kind: Service
metadata:
name: sample-service-public
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: LoadBalancer
selector:
app: nginx
変更後
yaml
apiVersion: v1
kind: Service
metadata:
name: sample-service-internal
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: LoadBalancer
selector:
app: nginx
補足:
- 変更前: LoadBalancer を要求します。公開範囲はコントローラーのデフォルトと設定によって決まります。
- 変更後: 対応する AWS コントローラーに内部 LoadBalancer を要求します。ほかの公開経路とアクセス制御も確認してください。