まえがき
Ingressに新規Serviceのsvc-b-exampleを追加しましたがnginxのremote_addrにクライアントIPが設定されなくなりました。
svc-a-exampleとネットワークの構成は全く一緒なのですが、なぜかsvc-b-exampleだけremote_addrにNodeやpodのIPアドレスが設定されていました。
その時のnginxの設定ファイルは下記の通りです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| server {
listen 80;
server_name b.example.com;
root /var/www/html;
charset utf-8;
error_page 404 /404.html;
#remote_addrにクライアントのipアドレスを設定するための指定
set_real_ip_from 130.211.0.0/22;
set_real_ip_from 35.191.0.0/16;
set_real_ip_from XXX.XXX.XXX.XXX; #LBのIPアドレス
real_ip_header X-Forwarded-For;
real_ip_recursive on;
location / {
index index.html;
}
}
|
※set_real_ip_fromの上二つのIPはターゲット プロキシ
に記載のipアドレス
この設定でsvc-a-exampleはremote_addrにクライアントのIPアドレスが設定されますが、svc-b-exampleには設定されなくなっていました。
svc-aとsvc-bの比較
svc-a-exampleとsvc-b-exampleの詳細をdescribeで確認してみます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| ~/$ kubectl describe svc svc-a-example
Name: svc-a-example
Namespace: hogehoge
Labels: app=svc-a-example
Annotations: cloud.google.com/backend-config: {"default": "svc-a-backend-config"}
cloud.google.com/neg: {"ingress":true}
cloud.google.com/neg-status: {"network_endpoint_groups":{"80":"XXXX-XXXXXXXX-hogehoge--80-XXXXXXXX"},"zones":["asia-northeast1-b"]}
Selector: app=svc-a-example
Type: NodePort
IP Families: <none>
IP: XXX.XXX.XXX.XXX
IPs: <none>
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32491/TCP
Endpoints: XXX.XXX.XXX.XXX:80,XXX.XXX.XXX.XXX:80,XXX.XXX.XXX.XXX:80 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| ~/$ kubectl describe svc svc-b-example
Name: svc-b-example
Namespace: hogehoge
Labels: app=svc-b-example
Annotations: cloud.google.com/backend-config: {"default": "svc-b-backend-config"}
Selector: app=svc-b-example
Type: NodePort
IP Families: <none>
IP: XXX.XXX.XXX.XXX
IPs: <none>
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32492/TCP
Endpoints: XXX.XXX.XXX.XXX:80,XXX.XXX.XXX.XXX:80,XXX.XXX.XXX.XXX:80 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
|
svc-b-exampleにnetwork_endpoint_groupsがありません。
network_endpoint_groupsについて調べてみますと、下記ページに記載がありました。
コンテナ ネイティブの負荷分散
早い話、Ingressから直接podを参照できるようにするシステムらしいです。
svc-b-exampleはIngress→Node→podになってしまっていたせいで、remote_addrにクライアントのIPが設定されていませんでした。
というわけでsvc-b-exampleにcloud.google.com/negアノテーションを追加しました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| apiVersion: v1
kind: Service
metadata:
labels:
app: svc-b-example
name: svc-b-example
annotations:
cloud.google.com/backend-config: '{"default": "svc-b-backend-config"}'
cloud.google.com/neg: '{"ingress": true}'
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: svc-b-example
|
applyして確認するとneg-statusが追加されました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| ~/$ kubectl describe svc svc-b-example
Name: svc-b-example
Namespace: hogehoge
Labels: app=svc-b-example
Annotations: cloud.google.com/backend-config: {"default": "svc-b-backend-config"}
cloud.google.com/neg: {"ingress":true}
cloud.google.com/neg-status: {"network_endpoint_groups":{"80":"XXXX-XXXXXXXX-hogehoge--80-XXXXXXXX"},"zones":["asia-northeast1-b"]}
Selector: app=svc-b-example
Type: NodePort
IP Families: <none>
IP: XXX.XXX.XXX.XXX
IPs: <none>
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32492/TCP
Endpoints: XXX.XXX.XXX.XXX:80,XXX.XXX.XXX.XXX:80,XXX.XXX.XXX.XXX:80 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
|
追加されましたがsvc-b-exampleにアクセスできなくなりました。
Googleのガイドを読むとちゃんと記載がありました。
注意: このアノテーションを追加すると、既存の Service に新しい BackendService が作成されます。これにより、Service が一時的に停止する可能性があります。
コンテナ ネイティブの負荷分散
より一部抜粋
すぐ作成されるだろうと思っていましたが5分ぐらいアクセスできなくなりましたので、追加する際には注意しましょう。
negがデフォルトで有効になる条件
無事remote_addrにクライアントIPが設定されるようになりましたが、そもそもの話svc-b-exampleにnegが設定されなかった原因は何なのでしょうか。
Googleのガイドには以下の記載がありました。
コンテナ ネイティブの負荷分散は、次のすべての条件が満たされている場合、デフォルトで Services に対して有効になります。
GKE クラスタ 1.17.6-gke.7 以降で作成された Service の場合
VPC ネイティブ クラスタの使用
共有 VPC を使用しない
GKE ネットワーク ポリシーを使用しない
コンテナ ネイティブの負荷分散
より一部抜粋
この条件は満たしているはずなんですが…。
クラスタ単位の話で、同じクラスタ内で違いが出ることが不思議です。
svc-a-exampleは結構前に作ったserviceですから仕様が変わったのでしょうか。
この原因については分かっていません。
ただGoogleのガイドに、
NEG がデフォルトではないクラスタの場合でも、コンテナ ネイティブの負荷分散を使用することを強くおすすめしますが、Service ごとに明示的に有効にする必要があります。
コンテナ ネイティブの負荷分散
より一部抜粋
強くおすすめすると記載があるため、いずれの場合も使用するように設定した方がよさそうです。