動的なnginxサービスの再構成にconfdを使用しており、Goテンプレートと少し苦労しています。という名前の json オブジェクトが$data
あり$data.subsets
、「addresses」という名前のキーが含まれている可能性があります。その条件が満たされた場合にのみ、ループ内でテンプレートを実行したいと考えています。
以下に示すようなさまざまなことを試しましたが、$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
Pod がスケジュールされていない場合の例:
{
"kind":"Endpoints",
"apiVersion":"v1",
"metadata":{
"name":"app",
"namespace":"ns1",
"selfLink":"/api/v1/namespaces/ns1/endpoints/app",
"labels":{
"app":"app"
}
},
"subsets":[]
}
$data
Pod が実行されているが正常ではない場合の例:
{
"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":[
{
"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"
}
]
}
]
}