mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
50dbdeff9f
This patch allows endpoints to complete servicing connections while being removed from a service. The fix is entirely within libnetwork and requires no changes to the moby codebase proper. It operates by initially down-weighting a container endpoint in the load balancer to 0 while keeping the endpoint present in the load balancer. This allows traffic to continue to flow to the endpoint while preventing new connections from going to the endpoint. This allows the container to complete requests during the "stop_grace_period" and then exit when finished without interruption of service. This change requires propagating the status of disabled service endpoints via the networkDB. Accordingly, the patch includes both code to generate and handle service update messages. It also augments the service structure with a ServiceDisabled boolean to convey whether an endpoint should ultimately be removed or just disabled. This, naturally, required a rebuild of the protocol buffer code. The protocol buffer encoding is designed to support additions of fields to messages in a backwards-compatible manner. Protocol buffer unmarshalling code automatically skips past any fields that it isn't aware of. As a result, an older moby daemon without this fix can receive and will process correctly networkDB messages from newer moby daemons with this patch. As it turns out, the additional field is simply a bool that is otherwise irrelevent on networkDB create and delete events. So its absence in older moby daemon processing has no impact. However, the fix leverages the "update" networkDB message which was previously unused in libnetwork. Although older libnetwork implementations parse the message cleanly, they will see the message as unexpected and as such issue a log at error level indicating the receipt of such. Other than this there should be no other negative impact for use of this patch in mixed environments. (Although older mobys won't be able to gracefully downgrade connections on their nodes of course.) Signed-off-by: Chris Telfer <ctelfer@docker.com>
76 lines
2.5 KiB
Protocol Buffer
76 lines
2.5 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
import "gogoproto/gogo.proto";
|
|
|
|
package libnetwork;
|
|
|
|
option (gogoproto.marshaler_all) = true;
|
|
option (gogoproto.unmarshaler_all) = true;
|
|
option (gogoproto.stringer_all) = true;
|
|
option (gogoproto.gostring_all) = true;
|
|
option (gogoproto.sizer_all) = true;
|
|
option (gogoproto.goproto_stringer_all) = false;
|
|
|
|
// EndpointRecord specifies all the endpoint specific information that
|
|
// needs to gossiped to nodes participating in the network.
|
|
message EndpointRecord {
|
|
// Name of the container
|
|
string name = 1;
|
|
|
|
// Service name of the service to which this endpoint belongs.
|
|
string service_name = 2;
|
|
|
|
// Service ID of the service to which this endpoint belongs.
|
|
string service_id = 3 [(gogoproto.customname) = "ServiceID"];
|
|
|
|
// Virtual IP of the service to which this endpoint belongs.
|
|
string virtual_ip = 4 [(gogoproto.customname) = "VirtualIP"];
|
|
|
|
// IP assigned to this endpoint.
|
|
string endpoint_ip = 5 [(gogoproto.customname) = "EndpointIP"];
|
|
|
|
// IngressPorts exposed by the service to which this endpoint belongs.
|
|
repeated PortConfig ingress_ports = 6;
|
|
|
|
// A list of aliases which are alternate names for the service
|
|
repeated string aliases = 7;
|
|
|
|
// List of aliases task specific aliases
|
|
repeated string task_aliases = 8;
|
|
|
|
// Whether this enpoint's service has been disabled
|
|
bool service_disabled = 9;
|
|
}
|
|
|
|
// PortConfig specifies an exposed port which can be
|
|
// addressed using the given name. This can be later queried
|
|
// using a service discovery api or a DNS SRV query. The node
|
|
// port specifies a port that can be used to address this
|
|
// service external to the cluster by sending a connection
|
|
// request to this port to any node on the cluster.
|
|
message PortConfig {
|
|
enum Protocol {
|
|
option (gogoproto.goproto_enum_prefix) = false;
|
|
|
|
TCP = 0 [(gogoproto.enumvalue_customname) = "ProtocolTCP"];
|
|
UDP = 1 [(gogoproto.enumvalue_customname) = "ProtocolUDP"];
|
|
SCTP = 2 [(gogoproto.enumvalue_customname) = "ProtocolSCTP"];
|
|
}
|
|
|
|
// Name for the port. If provided the port information can
|
|
// be queried using the name as in a DNS SRV query.
|
|
string name = 1;
|
|
|
|
// Protocol for the port which is exposed.
|
|
Protocol protocol = 2;
|
|
|
|
// The port which the application is exposing and is bound to.
|
|
uint32 target_port = 3;
|
|
|
|
// PublishedPort specifies the port on which the service is
|
|
// exposed on all nodes on the cluster. If not specified an
|
|
// arbitrary port in the node port range is allocated by the
|
|
// system. If specified it should be within the node port
|
|
// range and it should be available.
|
|
uint32 published_port = 4;
|
|
}
|