blob: c69f42a0cc5747cb0e8c4fbfce5df274d8caa424 [file] [log] [blame]
Marcel van Lohuizen5274e982019-04-28 17:51:43 +02001// Copyright 2019 CUE Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Copyright 2017 Istio Authors
16//
17// Licensed under the Apache License, Version 2.0 (the "License");
18// you may not use this file except in compliance with the License.
19// You may obtain a copy of the License at
20//
21// http://www.apache.org/licenses/LICENSE-2.0
22//
23// Unless required by applicable law or agreed to in writing, software
24// distributed under the License is distributed on an "AS IS" BASIS,
25// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
26// See the License for the specific language governing permissions and
27// limitations under the License.
28
29
30syntax = "proto3";
31
32// $title: Gateway
33// $description: Configuration affecting edge load balancer.
34// $location: https://istio.io/docs/reference/config/networking/v1alpha3/gateway.html
35
36// `Gateway` describes a load balancer operating at the edge of the mesh
37// receiving incoming or outgoing HTTP/TCP connections. The specification
38// describes a set of ports that should be exposed, the type of protocol to
39// use, SNI configuration for the load balancer, etc.
40//
41// For example, the following Gateway configuration sets up a proxy to act
42// as a load balancer exposing port 80 and 9080 (http), 443 (https),
43// 9443(https) and port 2379 (TCP) for ingress. The gateway will be
44// applied to the proxy running on a pod with labels `app:
45// my-gateway-controller`. While Istio will configure the proxy to listen
46// on these ports, it is the responsibility of the user to ensure that
47// external traffic to these ports are allowed into the mesh.
48//
49// ```yaml
50// apiVersion: networking.istio.io/v1alpha3
51// kind: Gateway
52// metadata:
53// name: my-gateway
54// namespace: some-config-namespace
55// spec:
56// selector:
57// app: my-gateway-controller
58// servers:
59// - port:
60// number: 80
61// name: http
62// protocol: HTTP
63// hosts:
64// - uk.bookinfo.com
65// - eu.bookinfo.com
66// tls:
67// httpsRedirect: true # sends 301 redirect for http requests
68// - port:
69// number: 443
70// name: https-443
71// protocol: HTTPS
72// hosts:
73// - uk.bookinfo.com
74// - eu.bookinfo.com
75// tls:
76// mode: SIMPLE # enables HTTPS on this port
77// serverCertificate: /etc/certs/servercert.pem
78// privateKey: /etc/certs/privatekey.pem
79// - port:
80// number: 9443
81// name: https-9443
82// protocol: HTTPS
83// hosts:
84// - "bookinfo-namespace/*.bookinfo.com"
85// tls:
86// mode: SIMPLE # enables HTTPS on this port
87// credentialName: bookinfo-secret # fetches certs from Kubernetes secret
88// - port:
89// number: 9080
90// name: http-wildcard
91// protocol: HTTP
92// hosts:
93// - "*"
94// - port:
95// number: 2379 # to expose internal service via external port 2379
96// name: mongo
97// protocol: MONGO
98// hosts:
99// - "*"
100// ```
101//
102// The Gateway specification above describes the L4-L6 properties of a load
103// balancer. A `VirtualService` can then be bound to a gateway to control
104// the forwarding of traffic arriving at a particular host or gateway port.
105//
106// For example, the following VirtualService splits traffic for
107// `https://uk.bookinfo.com/reviews`, `https://eu.bookinfo.com/reviews`,
108// `http://uk.bookinfo.com:9080/reviews`,
109// `http://eu.bookinfo.com:9080/reviews` into two versions (prod and qa) of
110// an internal reviews service on port 9080. In addition, requests
111// containing the cookie "user: dev-123" will be sent to special port 7777
112// in the qa version. The same rule is also applicable inside the mesh for
113// requests to the "reviews.prod.svc.cluster.local" service. This rule is
114// applicable across ports 443, 9080. Note that `http://uk.bookinfo.com`
115// gets redirected to `https://uk.bookinfo.com` (i.e. 80 redirects to 443).
116//
117// ```yaml
118// apiVersion: networking.istio.io/v1alpha3
119// kind: VirtualService
120// metadata:
121// name: bookinfo-rule
122// namespace: bookinfo-namespace
123// spec:
124// hosts:
125// - reviews.prod.svc.cluster.local
126// - uk.bookinfo.com
127// - eu.bookinfo.com
128// gateways:
129// - some-config-namespace/my-gateway
130// - mesh # applies to all the sidecars in the mesh
131// http:
132// - match:
133// - headers:
134// cookie:
135// exact: "user=dev-123"
136// route:
137// - destination:
138// port:
139// number: 7777
140// host: reviews.qa.svc.cluster.local
141// - match:
142// - uri:
143// prefix: /reviews/
144// route:
145// - destination:
146// port:
147// number: 9080 # can be omitted if it's the only port for reviews
148// host: reviews.prod.svc.cluster.local
149// weight: 80
150// - destination:
151// host: reviews.qa.svc.cluster.local
152// weight: 20
153// ```
154//
155// The following VirtualService forwards traffic arriving at (external)
156// port 27017 to internal Mongo server on port 5555. This rule is not
157// applicable internally in the mesh as the gateway list omits the
158// reserved name `mesh`.
159//
160// ```yaml
161// apiVersion: networking.istio.io/v1alpha3
162// kind: VirtualService
163// metadata:
164// name: bookinfo-Mongo
165// namespace: bookinfo-namespace
166// spec:
167// hosts:
168// - mongosvr.prod.svc.cluster.local # name of internal Mongo service
169// gateways:
170// - some-config-namespace/my-gateway # can omit the namespace if gateway is in same
171// namespace as virtual service.
172// tcp:
173// - match:
174// - port: 27017
175// route:
176// - destination:
177// host: mongo.prod.svc.cluster.local
178// port:
179// number: 5555
180// ```
181//
182// It is possible to restrict the set of virtual services that can bind to
183// a gateway server using the namespace/hostname syntax in the hosts field.
184// For example, the following Gateway allows any virtual service in the ns1
185// namespace to bind to it, while restricting only the virtual service with
186// foo.bar.com host in the ns2 namespace to bind to it.
187//
188// ```yaml
189// apiVersion: networking.istio.io/v1alpha3
190// kind: Gateway
191// metadata:
192// name: my-gateway
193// namespace: some-config-namespace
194// spec:
195// selector:
196// app: my-gateway-controller
197// servers:
198// - port:
199// number: 80
200// name: http
201// protocol: HTTP
202// hosts:
203// - "ns1/*"
204// - "ns2/foo.bar.com"
205// ```
206//
207package istio.networking.v1alpha3;
208
Marcel van Lohuizen9fe5fed2019-06-25 13:04:40 +0200209import "cue/cue.proto";
Marcel van Lohuizen5274e982019-04-28 17:51:43 +0200210
211// GO PACKAGE
212option go_package = "istio.io/api/networking/v1alpha3"; // INLINE
213
214message Gateway {
215 // REQUIRED: A list of server specifications.
216 repeated Server servers = 1;
217
218 // REQUIRED: One or more labels that indicate a specific set of pods/VMs
219 // on which this gateway configuration should be applied. The scope of
220 // label search is restricted to the configuration namespace in which the
221 // the resource is present. In other words, the Gateway resource must
222 // reside in the same namespace as the gateway workload instance.
223 map<string, string> selector = 2 [ (cue.val) = "{<name>: name}"];
224}
225
226// `Server` describes the properties of the proxy on a given load balancer
227// port. For example,
228//
229// ```yaml
230// apiVersion: networking.istio.io/v1alpha3
231// kind: Gateway
232// metadata:
233// name: my-ingress
234// spec:
235// selector:
236// app: my-ingress-gateway
237// servers:
238// - port:
239// number: 80
240// name: http2
241// protocol: HTTP2
242// hosts:
243// - "*"
244// ```
245//
246// Another example
247//
248// ```yaml
249// apiVersion: networking.istio.io/v1alpha3
250// kind: Gateway
251// metadata:
252// name: my-tcp-ingress
253// spec:
254// selector:
255// app: my-tcp-ingress-gateway
256// servers:
257// - port:
258// number: 27018
259// name: mongo
260// protocol: MONGO
261// hosts:
262// - "*"
263// ```
264//
265// The following is an example of TLS configuration for port 443
266//
267// ```yaml
268// apiVersion: networking.istio.io/v1alpha3
269// kind: Gateway
270// metadata:
271// name: my-tls-ingress
272// spec:
273// selector:
274// app: my-tls-ingress-gateway
275// servers:
276// - port:
277// number: 443
278// name: https
279// protocol: HTTPS
280// hosts:
281// - "*"
282// tls:
283// mode: SIMPLE
284// serverCertificate: /etc/certs/server.pem
285// privateKey: /etc/certs/privatekey.pem
286// ```
287message Server {
288 // REQUIRED: The Port on which the proxy should listen for incoming
289 // connections.
290 Port port = 1 [(cue.val) = ">10 & <100"];
291
292 // $hide_from_docs
293 // The ip or the Unix domain socket to which the listener should be bound
294 // to. Format: `x.x.x.x` or `unix:///path/to/uds` or `unix://@foobar`
295 // (Linux abstract namespace). When using Unix domain sockets, the port
296 // number should be 0.
297 string bind = 4;
298
299 // REQUIRED. One or more hosts exposed by this gateway.
300 // While typically applicable to
301 // HTTP services, it can also be used for TCP services using TLS with SNI.
302 // A host is specified as a `dnsName` with an optional `namespace/` prefix.
303 // The `dnsName` should be specified using FQDN format, optionally including
304 // a wildcard character in the left-most component (e.g., `prod/*.example.com`).
305 // Set the `dnsName` to `*` to select all `VirtualService` hosts from the
306 // specified namespace (e.g.,`prod/*`). If no `namespace/` is specified,
307 // the `VirtualService` hosts will be selected from any available namespace.
308 // Any associated `DestinationRule` in the same namespace will also be used.
309 //
310 // A `VirtualService` must be bound to the gateway and must have one or
311 // more hosts that match the hosts specified in a server. The match
312 // could be an exact match or a suffix match with the server's hosts. For
313 // example, if the server's hosts specifies `*.example.com`, a
314 // `VirtualService` with hosts `dev.example.com` or `prod.example.com` will
315 // match. However, a `VirtualService` with host `example.com` or
316 // `newexample.com` will not match.
317 //
318 // NOTE: Only virtual services exported to the gateway's namespace
319 // (e.g., `exportTo` value of `*`) can be referenced.
320 // Private configurations (e.g., `exportTo` set to `.`) will not be
321 // available. Refer to the `exportTo` setting in `VirtualService`,
322 // `DestinationRule`, and `ServiceEntry` configurations for details.
323 repeated string hosts = 2;
324
325 message TLSOptions {
326 // If set to true, the load balancer will send a 301 redirect for all
327 // http connections, asking the clients to use HTTPS.
328 bool https_redirect = 1;
329
330 // TLS modes enforced by the proxy
331 enum TLSmode {
332 // The SNI string presented by the client will be used as the match
333 // criterion in a VirtualService TLS route to determine the
334 // destination service from the service registry.
335 PASSTHROUGH = 0;
336
337 // Secure connections with standard TLS semantics.
338 SIMPLE = 1;
339
340 // Secure connections to the upstream using mutual TLS by presenting
341 // client certificates for authentication.
342 MUTUAL = 2;
343
344 // Similar to the passthrough mode, except servers with this TLS mode
345 // do not require an associated VirtualService to map from the SNI
346 // value to service in the registry. The destination details such as
347 // the service/subset/port are encoded in the SNI value. The proxy
348 // will forward to the upstream (Envoy) cluster (a group of
349 // endpoints) specified by the SNI value. This server is typically
350 // used to provide connectivity between services in disparate L3
351 // networks that otherwise do not have direct connectivity between
352 // their respective endpoints. Use of this mode assumes that both the
353 // source and the destination are using Istio mTLS to secure traffic.
354 AUTO_PASSTHROUGH = 3;
355 };
356
357 // Optional: Indicates whether connections to this port should be
358 // secured using TLS. The value of this field determines how TLS is
359 // enforced.
360 TLSmode mode = 2;
361
362 // Extra comment.
363
364 // REQUIRED if mode is `SIMPLE` or `MUTUAL`. The path to the file
365 // holding the server-side TLS certificate to use.
366 string server_certificate = 3;
367
368 // REQUIRED if mode is `SIMPLE` or `MUTUAL`. The path to the file
369 // holding the server's private key.
370 string private_key = 4;
371
372 // REQUIRED if mode is `MUTUAL`. The path to a file containing
373 // certificate authority certificates to use in verifying a presented
374 // client side certificate.
375 string ca_certificates = 5;
376
377 // The credentialName stands for a unique identifier that can be used
378 // to identify the serverCertificate and the privateKey. The
379 // credentialName appended with suffix "-cacert" is used to identify
380 // the CaCertificates associated with this server. Gateway workloads
381 // capable of fetching credentials from a remote credential store such
382 // as Kubernetes secrets, will be configured to retrieve the
383 // serverCertificate and the privateKey using credentialName, instead
384 // of using the file system paths specified above. If using mutual TLS,
385 // gateway workload instances will retrieve the CaCertificates using
386 // credentialName-cacert. The semantics of the name are platform
387 // dependent. In Kubernetes, the default Istio supplied credential
388 // server expects the credentialName to match the name of the
389 // Kubernetes secret that holds the server certificate, the private
390 // key, and the CA certificate (if using mutual TLS). Set the
391 // `ISTIO_META_USER_SDS` metadata variable in the gateway's proxy to
392 // enable the dynamic credential fetching feature.
393 string credential_name = 10;
394
395 // A list of alternate names to verify the subject identity in the
396 // certificate presented by the client.
397 repeated string subject_alt_names = 6;
398
399 // TLS protocol versions.
400 enum TLSProtocol {
401 TLS_AUTO = 0; // Automatically choose the optimal TLS version.
402
403 TLSV1_0 = 1; // TLS version 1.0
404
405 TLSV1_1 = 2; // TLS version 1.1
406
407 TLSV1_2 = 3; // TLS version 1.2
408
409 TLSV1_3 = 4; // TLS version 1.3
410 }
411
412 // Optional: Minimum TLS protocol version.
413 TLSProtocol min_protocol_version = 7;
414
415 // Optional: Maximum TLS protocol version.
416 TLSProtocol max_protocol_version = 8;
417
418 // Optional: If specified, only support the specified cipher list.
419 // Otherwise default to the default cipher list supported by Envoy.
420 repeated string cipher_suites = 9;
421 }
422
423 // Set of TLS related options that govern the server's behavior. Use
424 // these options to control if all http requests should be redirected to
425 // https, and the TLS modes to use.
426 TLSOptions tls = 3;
427
428 // The loopback IP endpoint or Unix domain socket to which traffic should
429 // be forwarded to by default. Format should be `127.0.0.1:PORT` or
430 // `unix:///path/to/socket` or `unix://@foobar` (Linux abstract namespace).
431 string default_endpoint = 5;
432}
433
434
435// Port describes the properties of a specific port of a service.
436message Port {
437 // REQUIRED: A valid non-negative integer port number.
438 uint32 number = 1;
439
440 // REQUIRED: The protocol exposed on the port.
441 // MUST BE one of HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP|TLS.
442 // TLS implies the connection will be routed based on the SNI header to
443 // the destination without terminating the TLS connection.
444 string protocol = 2;
445
446 // Label assigned to the port.
447 string name = 3;
448}