ダイナミックなnginxサービスの再設定にはconfdを使用していますが、Goテンプレートとは少し苦労しています。 $data
という名前のjsonオブジェクトがあり、$data.subsets
に 'addresses'という名前のキーが含まれている可能性があります。その条件が満たされている場合にのみ、ループ内でテンプレートを実行します。テンプレートを移動する - jsonリストにキーが存在するかどうかを確認します
私は$data.subsets[0].addresses
のようなさまざまなことを試しましたが、これは完全に間違っています。これがどうやって正しく行なわれるかわからない。
これは、少なくとも1つのアップストリームサービスがある場合にのみレンダリングしたいと思う私のnginxテンプレートの一部であり、存在しない/利用できない場合ではありません。
テンプレートに続くのは、成功した場合に$data
のjsonオブジェクトです。
ご協力いただきありがとうございます。大変感謝しています!
{{ range $ns := getvs "/registry/services/endpoints/*/app" }}
{{ $data := json $ns }}
{{ if $data.subsets[0].addresses }}
upstream {{ $data.metadata.namespace }}_{{ $data.metadata.name }}_pool {
{{ range $subset := $data.subsets }}{{ range $ref := $subset.addresses }}{{ range $portConfig := $subset.ports }}
server {{ $ref.ip }}:{{ $portConfig.port }};
{{ end }}{{ end }}{{ end }}
}
{{ end }}
{{ end }}
予定の何ポッドがない$data
の例:$data
の
{
"kind":"Endpoints",
"apiVersion":"v1",
"metadata":{
"name":"app",
"namespace":"ns1",
"labels":{
"app":"app"
}
},
"subsets":[
{
"notReadyAddresses":[
{
"ip":"10.254.60.5",
"targetRef":{
"kind":"Pod",
"namespace":"ns1",
"name":"app-421757659-83rfg",
}
}
],
"ports":[
{
"name":"ns1-app-8080",
"port":8080,
"protocol":"TCP"
}
]
}
]
}
例をポッドがある場合:健康ランニングではなく、ポッドがある$data
の
{
"kind":"Endpoints",
"apiVersion":"v1",
"metadata":{
"name":"app",
"namespace":"ns1",
"selfLink":"/api/v1/namespaces/ns1/endpoints/app",
"labels":{
"app":"app"
}
},
"subsets":[]
}
は例実行可能で利用可能です。これは、レンダリングするテンプレートの反復のために会いたい唯一の条件です。
{
"kind":"Endpoints",
"apiVersion":"v1",
"metadata":{
"name":"app",
"namespace":"ns1",
"selfLink":"/api/v1/namespaces/ns1/endpoints/app",
"labels":{
"app":"app"
}
},
"subsets":[
{
"addresses":[
{
"ip":"10.254.18.11",
"targetRef":{
"kind":"Pod",
"namespace":"ns1",
"name":"app-3869480132-kfthi"
}
},
{
"ip":"10.254.18.9",
"targetRef":{
"kind":"Pod",
"namespace":"ns1",
"name":"app-3869480132-9bufk"
}
}
],
"ports":[
{
"name":"ns1-app-8080",
"port":8080,
"protocol":"TCP"
}
]
}
]
}
通常のjson処理で通常のGoコードの状態をチェックしてから、boolをテンプレートに渡すのはなぜですか?あなたのjsonの値にアクセスすることはかなり変わりませんが、どのバリエーションにもかかわらず、私はあなたがその文脈で演奏されているライブラリをどのようにして行うのかは分かりません。 '$ data'オブジェクトが他の場所で頻繁に使われていない限り、私はそれがテンプレートに渡されるべきではないと考えています。なぜなら、その文脈ではほとんどが無関係であるからです。実際には、アドレスリストを抽出して渡すだけで、テンプレートにこのロジックが1つもないはずです。 – evanmcdonnal