AKS には LoadBalancer タイプのサービスがあり、2 つのポートが定義されています。1 つは一般的なアクセス (および双方向認証) 用で、もう 1 つは Azure 上の Service Fabric クラスターからの排他的アクセス用です。排他的アクセスを実現するために、VM の受信ルールを変更して、SF クラスターからのアクセスのみを許可しました。問題は、Azure DevOps から AKS サービスを変更する展開が原因で、ルールが既定値にリセットされることがよくあることです (LoadBalancer オブジェクトは変更されませんが)。
LoadBalancer の構成は次のようになります。
apiVersion: v1
kind: Service
metadata:
name: myservice-loadbalancer
spec:
ports:
- name: public-port
port: 1234
targetPort: public-port
- name: service-fabric-port
port: 4321
targetPort: service-fabric-port
selector:
app: myservice
type: LoadBalancer
回避策としては、ここで推奨されているように、許可された IP を LoadBalancer オブジェクトに追加することが考えられます。https://github.com/Azure/AKS/issues/570#issuecomment-413299212ただし、私の場合は「パブリック ポート」も制限されます。
ポートごとに 1 つずつ、2 つの LoadBalancer オブジェクトを作成する以外の方法は思いつきません。ただし、これはクリーンな回避策ではありません。サービスは 2 つの異なるポートを介してのみ同じであり、この方法では同じサービスに対して 2 つの IP が存在することになります。また、上記のリンクで述べたように、受信ルールへの変更は永続的である必要があります。
他に回避策はありますか? ご意見をいただければ幸いです。
答え1
私は StackOverflow でも同じ質問をし、そこでも回答しました:https://stackoverflow.com/a/61696167/6860266
他の回答で述べられているように、解決策は、既存のルールよりも優先度の高い新しいルールをネットワーク セキュリティ グループに追加することでした。
たとえば、上記の LoadBalancer サービスは、TCP ポート 4321 に 1 つのルールを作成し、サービスに割り当てられたパブリック IP 上のそのポートにインターネット ソースがアクセスできるようにします。このルールに割り当てられた優先度が 500 であるとします。このルールは変更できますが、後でリセットされます。
優先度の高いルールを 2 つ追加する必要があります (400 と 401 とします)。両方のルールの宛先はサービスのパブリック IP とポート 4321 です。ルール 400 はサービス タグ ServiceFabric へのアクセスを許可し、ルール 401 はサービス タグ Internet へのアクセスを拒否します。
ルールは 500、401、400 の順に評価されるため、最終的には Service Fabric のみがそのポートにアクセスできるようになります。ルール 400 と 401 は Azure によって作成されないため、変更されません。