@@ -140,6 +140,7 @@ var ipsetInfo = []struct {
140
140
{kubeLoopBackIPSet , utilipset .HashIPPortIP , kubeLoopBackIPSetComment },
141
141
{kubeClusterIPSet , utilipset .HashIPPort , kubeClusterIPSetComment },
142
142
{kubeExternalIPSet , utilipset .HashIPPort , kubeExternalIPSetComment },
143
+ {kubeExternalIPLocalSet , utilipset .HashIPPort , kubeExternalIPLocalSetComment },
143
144
{kubeLoadBalancerSet , utilipset .HashIPPort , kubeLoadBalancerSetComment },
144
145
{kubeLoadbalancerFWSet , utilipset .HashIPPort , kubeLoadbalancerFWSetComment },
145
146
{kubeLoadBalancerLocalSet , utilipset .HashIPPort , kubeLoadBalancerLocalSetComment },
@@ -1236,12 +1237,21 @@ func (proxier *Proxier) syncProxyRules() {
1236
1237
Protocol : protocol ,
1237
1238
SetType : utilipset .HashIPPort ,
1238
1239
}
1239
- // We have to SNAT packets to external IPs.
1240
- if valid := proxier .ipsetList [kubeExternalIPSet ].validateEntry (entry ); ! valid {
1241
- klog .Errorf ("%s" , fmt .Sprintf (EntryInvalidErr , entry , proxier .ipsetList [kubeExternalIPSet ].Name ))
1242
- continue
1240
+
1241
+ if utilfeature .DefaultFeatureGate .Enabled (features .ExternalPolicyForExternalIP ) && svcInfo .OnlyNodeLocalEndpoints () {
1242
+ if valid := proxier .ipsetList [kubeExternalIPLocalSet ].validateEntry (entry ); ! valid {
1243
+ klog .Errorf ("%s" , fmt .Sprintf (EntryInvalidErr , entry , proxier .ipsetList [kubeExternalIPLocalSet ].Name ))
1244
+ continue
1245
+ }
1246
+ proxier .ipsetList [kubeExternalIPLocalSet ].activeEntries .Insert (entry .String ())
1247
+ } else {
1248
+ // We have to SNAT packets to external IPs.
1249
+ if valid := proxier .ipsetList [kubeExternalIPSet ].validateEntry (entry ); ! valid {
1250
+ klog .Errorf ("%s" , fmt .Sprintf (EntryInvalidErr , entry , proxier .ipsetList [kubeExternalIPSet ].Name ))
1251
+ continue
1252
+ }
1253
+ proxier .ipsetList [kubeExternalIPSet ].activeEntries .Insert (entry .String ())
1243
1254
}
1244
- proxier .ipsetList [kubeExternalIPSet ].activeEntries .Insert (entry .String ())
1245
1255
1246
1256
// ipvs call
1247
1257
serv := & utilipvs.VirtualServer {
@@ -1257,7 +1267,12 @@ func (proxier *Proxier) syncProxyRules() {
1257
1267
if err := proxier .syncService (svcNameString , serv , true ); err == nil {
1258
1268
activeIPVSServices [serv .String ()] = true
1259
1269
activeBindAddrs [serv .Address .String ()] = true
1260
- if err := proxier .syncEndpoint (svcName , false , serv ); err != nil {
1270
+
1271
+ onlyNodeLocalEndpoints := false
1272
+ if utilfeature .DefaultFeatureGate .Enabled (features .ExternalPolicyForExternalIP ) {
1273
+ onlyNodeLocalEndpoints = svcInfo .OnlyNodeLocalEndpoints ()
1274
+ }
1275
+ if err := proxier .syncEndpoint (svcName , onlyNodeLocalEndpoints , serv ); err != nil {
1261
1276
klog .Errorf ("Failed to sync endpoint for service: %v, err: %v" , serv , err )
1262
1277
}
1263
1278
} else {
@@ -1668,15 +1683,8 @@ func (proxier *Proxier) writeIptablesRules() {
1668
1683
}
1669
1684
}
1670
1685
1671
- if ! proxier .ipsetList [kubeExternalIPSet ].isEmpty () {
1672
- // Build masquerade rules for packets to external IPs.
1673
- args = append (args [:0 ],
1674
- "-A" , string (kubeServicesChain ),
1675
- "-m" , "comment" , "--comment" , proxier .ipsetList [kubeExternalIPSet ].getComment (),
1676
- "-m" , "set" , "--match-set" , proxier .ipsetList [kubeExternalIPSet ].Name ,
1677
- "dst,dst" ,
1678
- )
1679
- writeLine (proxier .natRules , append (args , "-j" , string (KubeMarkMasqChain ))... )
1686
+ // externalIPRules adds iptables rules applies to Service ExternalIPs
1687
+ externalIPRules := func (args []string ) {
1680
1688
// Allow traffic for external IPs that does not come from a bridge (i.e. not from a container)
1681
1689
// nor from a local process to be forwarded to the service.
1682
1690
// This rule roughly translates to "all traffic from off-machine".
@@ -1691,6 +1699,28 @@ func (proxier *Proxier) writeIptablesRules() {
1691
1699
writeLine (proxier .natRules , append (dstLocalOnlyArgs , "-j" , "ACCEPT" )... )
1692
1700
}
1693
1701
1702
+ if ! proxier .ipsetList [kubeExternalIPSet ].isEmpty () {
1703
+ // Build masquerade rules for packets to external IPs.
1704
+ args = append (args [:0 ],
1705
+ "-A" , string (kubeServicesChain ),
1706
+ "-m" , "comment" , "--comment" , proxier .ipsetList [kubeExternalIPSet ].getComment (),
1707
+ "-m" , "set" , "--match-set" , proxier .ipsetList [kubeExternalIPSet ].Name ,
1708
+ "dst,dst" ,
1709
+ )
1710
+ writeLine (proxier .natRules , append (args , "-j" , string (KubeMarkMasqChain ))... )
1711
+ externalIPRules (args )
1712
+ }
1713
+
1714
+ if ! proxier .ipsetList [kubeExternalIPLocalSet ].isEmpty () {
1715
+ args = append (args [:0 ],
1716
+ "-A" , string (kubeServicesChain ),
1717
+ "-m" , "comment" , "--comment" , proxier .ipsetList [kubeExternalIPLocalSet ].getComment (),
1718
+ "-m" , "set" , "--match-set" , proxier .ipsetList [kubeExternalIPLocalSet ].Name ,
1719
+ "dst,dst" ,
1720
+ )
1721
+ externalIPRules (args )
1722
+ }
1723
+
1694
1724
// -A KUBE-SERVICES -m addrtype --dst-type LOCAL -j KUBE-NODE-PORT
1695
1725
args = append (args [:0 ],
1696
1726
"-A" , string (kubeServicesChain ),
0 commit comments