mirror of https://github.com/k3s-io/k3s
fix bugs introduced by ipvs graceful termination
parent
8ec98fc26c
commit
456c351e31
|
@ -82,9 +82,6 @@ func (q *graceTerminateRSList) remove(rs *listItem) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *graceTerminateRSList) flushList(handler func(rsToDelete *listItem) (bool, error)) bool {
|
func (q *graceTerminateRSList) flushList(handler func(rsToDelete *listItem) (bool, error)) bool {
|
||||||
q.lock.Lock()
|
|
||||||
defer q.lock.Unlock()
|
|
||||||
|
|
||||||
success := true
|
success := true
|
||||||
for name, rs := range q.list {
|
for name, rs := range q.list {
|
||||||
deleted, err := handler(rs)
|
deleted, err := handler(rs)
|
||||||
|
@ -105,8 +102,8 @@ func (q *graceTerminateRSList) exist(uniqueRS string) (*listItem, bool) {
|
||||||
q.lock.Lock()
|
q.lock.Lock()
|
||||||
defer q.lock.Unlock()
|
defer q.lock.Unlock()
|
||||||
|
|
||||||
if _, ok := q.list[uniqueRS]; ok {
|
if rs, ok := q.list[uniqueRS]; ok {
|
||||||
return nil, false
|
return rs, true
|
||||||
}
|
}
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
|
@ -144,7 +141,7 @@ func (m *GracefulTerminationManager) GracefulDeleteRS(vs *utilipvs.VirtualServer
|
||||||
}
|
}
|
||||||
deleted, err := m.deleteRsFunc(ele)
|
deleted, err := m.deleteRsFunc(ele)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Delete rs %q err: %v", err)
|
glog.Errorf("Delete rs %q err: %v", ele.String(), err)
|
||||||
}
|
}
|
||||||
if deleted {
|
if deleted {
|
||||||
return nil
|
return nil
|
||||||
|
@ -178,7 +175,7 @@ func (m *GracefulTerminationManager) deleteRsFunc(rsToDelete *listItem) (bool, e
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false, fmt.Errorf("Failed to delete rs %q, can't find the real server", rsToDelete.String())
|
return true, fmt.Errorf("Failed to delete rs %q, can't find the real server", rsToDelete.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *GracefulTerminationManager) tryDeleteRs() {
|
func (m *GracefulTerminationManager) tryDeleteRs() {
|
||||||
|
|
|
@ -1533,7 +1533,7 @@ func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNode
|
||||||
}
|
}
|
||||||
|
|
||||||
if curEndpoints.Has(ep) {
|
if curEndpoints.Has(ep) {
|
||||||
// check if newEndpoint is in gracefulDelete list, is true, delete this ep immediately
|
// check if newEndpoint is in gracefulDelete list, if true, delete this ep immediately
|
||||||
uniqueRS := GetUniqueRSName(vs, newDest)
|
uniqueRS := GetUniqueRSName(vs, newDest)
|
||||||
if !proxier.gracefuldeleteManager.InTerminationList(uniqueRS) {
|
if !proxier.gracefuldeleteManager.InTerminationList(uniqueRS) {
|
||||||
continue
|
continue
|
||||||
|
@ -1591,10 +1591,14 @@ func (proxier *Proxier) cleanLegacyService(activeServices map[string]bool, curre
|
||||||
// This service was not processed in the latest sync loop so before deleting it,
|
// This service was not processed in the latest sync loop so before deleting it,
|
||||||
// make sure it does not fall within an excluded CIDR range.
|
// make sure it does not fall within an excluded CIDR range.
|
||||||
okayToDelete := true
|
okayToDelete := true
|
||||||
rsList, err := proxier.ipvs.GetRealServers(svc)
|
rsList, _ := proxier.ipvs.GetRealServers(svc)
|
||||||
if len(rsList) != 0 && err == nil {
|
for _, rs := range rsList {
|
||||||
glog.V(5).Infof("Will not delete VS: %v, cause it have RS: %v", svc, rsList)
|
uniqueRS := GetUniqueRSName(svc, rs)
|
||||||
okayToDelete = false
|
// if there are in terminating real server in this service, then handle it later
|
||||||
|
if proxier.gracefuldeleteManager.InTerminationList(uniqueRS) {
|
||||||
|
okayToDelete = false
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for _, excludedCIDR := range proxier.excludeCIDRs {
|
for _, excludedCIDR := range proxier.excludeCIDRs {
|
||||||
// Any validation of this CIDR already should have occurred.
|
// Any validation of this CIDR already should have occurred.
|
||||||
|
|
|
@ -108,6 +108,5 @@ func (rs *RealServer) String() string {
|
||||||
// We don't use struct == since it doesn't work because of slice.
|
// We don't use struct == since it doesn't work because of slice.
|
||||||
func (rs *RealServer) Equal(other *RealServer) bool {
|
func (rs *RealServer) Equal(other *RealServer) bool {
|
||||||
return rs.Address.Equal(other.Address) &&
|
return rs.Address.Equal(other.Address) &&
|
||||||
rs.Port == other.Port &&
|
rs.Port == other.Port
|
||||||
rs.Weight == other.Weight
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -249,12 +249,10 @@ func TestRealServerEqual(t *testing.T) {
|
||||||
rsA: &RealServer{
|
rsA: &RealServer{
|
||||||
Address: net.ParseIP("10.20.30.40"),
|
Address: net.ParseIP("10.20.30.40"),
|
||||||
Port: 80,
|
Port: 80,
|
||||||
Weight: 1,
|
|
||||||
},
|
},
|
||||||
rsB: &RealServer{
|
rsB: &RealServer{
|
||||||
Address: net.ParseIP("10.20.30.41"),
|
Address: net.ParseIP("10.20.30.41"),
|
||||||
Port: 80,
|
Port: 80,
|
||||||
Weight: 1,
|
|
||||||
},
|
},
|
||||||
equal: false,
|
equal: false,
|
||||||
reason: "IPv4 address not equal",
|
reason: "IPv4 address not equal",
|
||||||
|
@ -263,12 +261,10 @@ func TestRealServerEqual(t *testing.T) {
|
||||||
rsA: &RealServer{
|
rsA: &RealServer{
|
||||||
Address: net.ParseIP("2012::beef"),
|
Address: net.ParseIP("2012::beef"),
|
||||||
Port: 80,
|
Port: 80,
|
||||||
Weight: 1,
|
|
||||||
},
|
},
|
||||||
rsB: &RealServer{
|
rsB: &RealServer{
|
||||||
Address: net.ParseIP("2017::beef"),
|
Address: net.ParseIP("2017::beef"),
|
||||||
Port: 80,
|
Port: 80,
|
||||||
Weight: 1,
|
|
||||||
},
|
},
|
||||||
equal: false,
|
equal: false,
|
||||||
reason: "IPv6 address not equal",
|
reason: "IPv6 address not equal",
|
||||||
|
@ -277,40 +273,22 @@ func TestRealServerEqual(t *testing.T) {
|
||||||
rsA: &RealServer{
|
rsA: &RealServer{
|
||||||
Address: net.ParseIP("2012::beef"),
|
Address: net.ParseIP("2012::beef"),
|
||||||
Port: 80,
|
Port: 80,
|
||||||
Weight: 1,
|
|
||||||
},
|
},
|
||||||
rsB: &RealServer{
|
rsB: &RealServer{
|
||||||
Address: net.ParseIP("2012::beef"),
|
Address: net.ParseIP("2012::beef"),
|
||||||
Port: 8080,
|
Port: 8080,
|
||||||
Weight: 1,
|
|
||||||
},
|
},
|
||||||
equal: false,
|
equal: false,
|
||||||
reason: "Port not equal",
|
reason: "Port not equal",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
rsA: &RealServer{
|
|
||||||
Address: net.ParseIP("10.20.30.40"),
|
|
||||||
Port: 8080,
|
|
||||||
Weight: 1,
|
|
||||||
},
|
|
||||||
rsB: &RealServer{
|
|
||||||
Address: net.ParseIP("10.20.30.40"),
|
|
||||||
Port: 8080,
|
|
||||||
Weight: 10,
|
|
||||||
},
|
|
||||||
equal: false,
|
|
||||||
reason: "Weight not equal",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
rsA: &RealServer{
|
rsA: &RealServer{
|
||||||
Address: net.ParseIP("1.2.3.4"),
|
Address: net.ParseIP("1.2.3.4"),
|
||||||
Port: 3080,
|
Port: 3080,
|
||||||
Weight: 10,
|
|
||||||
},
|
},
|
||||||
rsB: &RealServer{
|
rsB: &RealServer{
|
||||||
Address: net.ParseIP("1.2.3.4"),
|
Address: net.ParseIP("1.2.3.4"),
|
||||||
Port: 3080,
|
Port: 3080,
|
||||||
Weight: 10,
|
|
||||||
},
|
},
|
||||||
equal: true,
|
equal: true,
|
||||||
reason: "All fields equal",
|
reason: "All fields equal",
|
||||||
|
@ -319,12 +297,10 @@ func TestRealServerEqual(t *testing.T) {
|
||||||
rsA: &RealServer{
|
rsA: &RealServer{
|
||||||
Address: net.ParseIP("2012::beef"),
|
Address: net.ParseIP("2012::beef"),
|
||||||
Port: 3080,
|
Port: 3080,
|
||||||
Weight: 10,
|
|
||||||
},
|
},
|
||||||
rsB: &RealServer{
|
rsB: &RealServer{
|
||||||
Address: net.ParseIP("2012::beef"),
|
Address: net.ParseIP("2012::beef"),
|
||||||
Port: 3080,
|
Port: 3080,
|
||||||
Weight: 10,
|
|
||||||
},
|
},
|
||||||
equal: true,
|
equal: true,
|
||||||
reason: "All fields equal",
|
reason: "All fields equal",
|
||||||
|
|
Loading…
Reference in New Issue