Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add dns-resovler-check-health annotation to for ExternalName service #226

Merged
merged 2 commits into from Jun 20, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
27 changes: 17 additions & 10 deletions api/dns_resolver.go
Expand Up @@ -20,19 +20,21 @@ const (
hold timeout 30s
hold valid 10s
*/
UseDNSResolver = EngressKey + "/" + "use-dns-resolver" // Bool
DNSResolverNameservers = EngressKey + "/" + "dns-resolver-nameservers" // ["", ""]
DNSResolverRetries = EngressKey + "/" + "dns-resolver-retries" // int
DNSResolverTimeout = EngressKey + "/" + "dns-resolver-timeout" // {"event":"time","event":"time"}
DNSResolverHold = EngressKey + "/" + "dns-resolver-hold" // {"status":"period","status":"period"}
UseDNSResolver = EngressKey + "/" + "use-dns-resolver" // Bool
DNSResolverNameservers = EngressKey + "/" + "dns-resolver-nameservers" // ["", ""]
DNSResolverCheckHealth = EngressKey + "/" + "dns-resolver-check-health" // bool
DNSResolverRetries = EngressKey + "/" + "dns-resolver-retries" // int
DNSResolverTimeout = EngressKey + "/" + "dns-resolver-timeout" // {"event":"time","event":"time"}
DNSResolverHold = EngressKey + "/" + "dns-resolver-hold" // {"status":"period","status":"period"}
)

type DNSResolver struct {
Name string
NameServer []string `json:"nameserver"`
Retries int `json:"retries"`
Timeout map[string]string `json:"timeout"`
Hold map[string]string `json:"hold"`
Name string
NameServer []string `json:"nameserver"`
CheckHealth bool `json:"checkHealth"`
Retries int `json:"retries"`
Timeout map[string]string `json:"timeout"`
Hold map[string]string `json:"hold"`
}

func DNSResolverForService(svc apiv1.Service) (useDNSResolver bool, resolver *DNSResolver, err error) {
Expand All @@ -49,6 +51,11 @@ func DNSResolverForService(svc apiv1.Service) (useDNSResolver bool, resolver *DN
if err != nil {
return
}
if ch, e2 := getBool(svc.Annotations, DNSResolverCheckHealth); e2 == nil {
resolver.CheckHealth = ch
} else {
resolver.CheckHealth = len(resolver.NameServer) > 0
}
resolver.Retries, err = getInt(svc.Annotations, DNSResolverRetries)
if err != nil {
return
Expand Down
1 change: 1 addition & 0 deletions docs/user-guide/ingress/external-svc.md
Expand Up @@ -10,6 +10,7 @@ dns, [DNS resolvers](https://cbonte.github.io/haproxy-dconv/1.7/configuration.ht
|--------|-----------|----------|-------------|
| ingress.appscode.com/use-dns-resolver | bool | false for L7, always true for L4 | If set, DNS resolution will be used |
| ingress.appscode.com/dns-resolver-nameservers | array | | `Optional`. If set to an array of DNS nameservers, these will be used HAProxy to periodically resolve DNS. If not set, HAProxy parses the server line definition and matches a host name at start up. |
| ingress.appscode.com/dns-resolver-check-health | bool | | `Optional`. If nameservers are set, this defaults to `true`. Set to `false`, to disable periodic dns resolution. |
| ingress.appscode.com/dns-resolver-retries | integer | | `Optional`. If set, this defines the number of queries to send to resolve a server name before giving up. If not set, default value pre-configured by HAProxy is used. |
| ingress.appscode.com/dns-resolver-timeout | map | | `Optional`. If set, defines timeouts related to name resolution. Define value as '{ "event": "time" }'. For a list of valid events, please consult [HAProxy documentation](https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#5.3.2-timeout). |
| ingress.appscode.com/dns-resolver-hold | map | | `Optional`. If set, Defines period during which the last name resolution should be kept based on last resolution status. Define value as '{ "status": "period" }'. For a list of valid status, please consult [HAProxy documentation](https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#5.3.2-hold). |
Expand Down
1 change: 1 addition & 0 deletions pkg/ingress/parser.go
Expand Up @@ -74,6 +74,7 @@ func (lbc *EngressController) serviceEndpoints(name string, port intstr.IntOrStr
if ep.UseDNSResolver && resolver != nil {
lbc.Parsed.DNSResolvers[resolver.Name] = resolver
ep.DNSResolver = resolver.Name
ep.CheckHealth = resolver.CheckHealth
}
return []*Endpoint{&ep}, nil
}
Expand Down
8 changes: 4 additions & 4 deletions pkg/ingress/template/template.go
Expand Up @@ -103,7 +103,7 @@ backend default-backend
{% for e in DefaultBackend.Endpoints %}
{% if e.ExternalName %}
{% if e.UseDNSResolver %}
server {{ e.Name }} {{ e.ExternalName }}:{{ e.Port }} {% if e.DNSResolver %} check resolvers {{ e.DNSResolver }} resolve-prefer ipv4 {% endif %}
server {{ e.Name }} {{ e.ExternalName }}:{{ e.Port }} {% if e.DNSResolver %} {% if e.CheckHealth %} check {% endif %} resolvers {{ e.DNSResolver }} resolve-prefer ipv4 {% endif %}
{% elif not svc.Backends.BackendRules %}
acl https ssl_fc
http-request redirect location https://{{e.ExternalName}}:{{ e.Port }} code 301 if https
Expand Down Expand Up @@ -157,7 +157,7 @@ backend https-{{ svc.Name }}
{% for e in svc.Backends.Endpoints %}
{% if e.ExternalName %}
{% if e.UseDNSResolver %}
server {{ e.Name }} {{ e.ExternalName }}:{{ e.Port }} {% if e.DNSResolver %} check resolvers {{ e.DNSResolver }} resolve-prefer ipv4 {% endif %}
server {{ e.Name }} {{ e.ExternalName }}:{{ e.Port }} {% if e.DNSResolver %} {% if e.CheckHealth %} check {% endif %} resolvers {{ e.DNSResolver }} resolve-prefer ipv4 {% endif %}
{% elif not svc.Backends.BackendRules %}
http-request redirect location https://{{e.ExternalName}}:{{ e.Port }} code 301
{% endif %}
Expand Down Expand Up @@ -204,7 +204,7 @@ backend http-{{ svc.Name }}
{% for e in svc.Backends.Endpoints %}
{% if e.ExternalName %}
{% if e.UseDNSResolver %}
server {{ e.Name }} {{ e.ExternalName }}:{{ e.Port }} resolve-prefer ipv4 {% if e.DNSResolver %} check resolvers {{ e.DNSResolver }} {% endif %}
server {{ e.Name }} {{ e.ExternalName }}:{{ e.Port }} {% if e.DNSResolver %} {% if e.CheckHealth %} check {% endif %} resolvers {{ e.DNSResolver }} resolve-prefer ipv4 {% endif %}
{% elif not svc.Backends.BackendRules %}
http-request redirect location http://{{e.ExternalName}}:{{ e.Port }} code 301
{% endif %}
Expand Down Expand Up @@ -240,7 +240,7 @@ backend tcp-{{ svc.Name }}

{% for e in svc.Backends.Endpoints %}
{% if e.ExternalName %}
server {{ e.Name }} {{ e.ExternalName }}:{{ e.Port }} {% if e.DNSResolver %} check resolvers {{ e.DNSResolver }} resolve-prefer ipv4 {% endif %}
server {{ e.Name }} {{ e.ExternalName }}:{{ e.Port }} {% if e.DNSResolver %} {% if e.CheckHealth %} check {% endif %} resolvers {{ e.DNSResolver }} resolve-prefer ipv4 {% endif %}
{% else %}
server {{ e.Name }} {{ e.IP }}:{{ e.Port }} {% if e.Weight %}weight {{ e.Weight|integer }} {% endif %}
{% endif %}
Expand Down
1 change: 1 addition & 0 deletions pkg/ingress/types.go
Expand Up @@ -103,6 +103,7 @@ type Endpoint struct {
ExternalName string
UseDNSResolver bool
DNSResolver string
CheckHealth bool
}

// Loadbalancer image is an almost constant type.
Expand Down