adestis-mf opened a new issue, #114:
URL: https://github.com/apache/cloudstack-kubernetes-provider/issues/114

   Since apache/cloudstack#12706 (CloudStack 4.23.0.0) a VPC offering can 
include the Firewall
   service for public IPs. The VPC virtual router then drops ingress traffic to 
a public IP that
   has a port forwarding, load balancing or static NAT rule unless a firewall 
rule allows it (a
   `FIREWALL_<ip>` chain ending in DROP).
   
   `applyLoadBalancerRules` (`cloudstack_loadbalancer.go`, `main` at 
363cd035ea, same in v1.3.0-rc1)
   decides per port between a firewall rule and a network ACL item from the 
services of the
   cluster's **network**:
   
   ```go
   if isFirewallSupported(network.Service) {
       lb.updateFirewallRule(lbRule.Publicipid, ...)
   } else if isNetworkACLSupported(network.Service) {
       lb.updateNetworkACL(..., network.Id)
   }
   ```
   
   In a VPC the Firewall service belongs to the VPC, not to the tier. A VPC 
tier reports
   `NetworkACL` but not `Firewall`, so the CCM only adds an ACL item, and the 
service port stays
   behind the DROP of the VPC firewall. Removal (`pruneFirewallRule` / 
`pruneNetworkACLRule`) uses
   the same switch.
   
   ### Reproduced
   
   CloudStack 4.23.0.0 (KVM), VPC offering with `Firewall:VpcVirtualRouter`, 
tier offering with
   `Dhcp, Dns, Lb, NetworkACL, PortForwarding, SourceNat, StaticNat, UserData, 
Vpn` (no Firewall),
   CKS cluster v1.35.4 (1 control, 1 worker), CCM `v1.3.0-rc1`, nginx behind a 
`LoadBalancer`
   service on port 80.
   
   Service on the cluster's public IP (`spec.loadBalancerIP` set to the IP that 
CKS uses for the
   API, so the IP is already configured on the VR):
   
   - The CCM created the load balancer rule (port 80, Active) and a network ACL 
item for TCP 80
     ("Managed by the CloudStack Kubernetes Provider"), but no firewall rule.
   - TCP 80 on that IP timed out from two different clients, while TCP 6443 on 
the same IP, which
     has a firewall rule, answered.
   - After adding a firewall rule for TCP 80 on that IP by hand, the service 
answered at once
     (HTTP 200 from both clients).
   - On `kubectl delete svc` the CCM removed the load balancer rule and the ACL 
item. The firewall
     rule stayed, as expected, since the CCM does not know about it; a fix has 
to remove the rule it
     created, because the IP is shared with the cluster API.
   
   Service on a new public IP (no `loadBalancerIP`):
   
   - Same rules as above: load balancer rule and ACL item, no firewall rule.
   - In addition, the new IP was never configured on the VPC virtual router: no 
`IpAssocVpcCommand`
     was sent when the load balancer rule was applied, the IP was missing on 
the VR's public
     interface, and a firewall rule added by hand did not change that. This 
part is a CloudStack
     issue (apache/cloudstack#14146): once a public IP of a tier has a firewall 
rule (here the
     cluster IP, which has rules for the API), no further public IP of that 
tier is added to the
     router. Fix: apache/cloudstack#14681. Until then the CCM change alone is 
not enough for this case.
     In a VPC without the Firewall service the same kind of service on its own 
IP works.
   
   ### Expected
   
   When the cluster network is a VPC tier and the VPC has the Firewall service 
(the VPC's `service`
   list from `listVPCs` contains `Firewall`), create a firewall rule for each 
service port on the
   service's public IP in addition to the ACL item, honouring 
`loadBalancerSourceRanges`, and remove
   it together with the service. The order in the code is already right (load 
balancer rule first,
   then the firewall rule): on CloudStack versions without the fix for 
apache/cloudstack#14146 the
   opposite order keeps a new public IP off the router.
   
   ### Related
   
   - apache/cloudstack#14668: the same gap in CKS itself (cluster API and SSH), 
fix in
     apache/cloudstack#14670.
   - apache/cloudstack#14146 (and #14669): once a public IP of a VPC tier has a 
firewall rule,
     further public IPs of the tier are not added to or removed from the 
router; fix in
     apache/cloudstack#14681.
   - Not covered here: a tier whose own offering includes the Firewall service 
takes the firewall
     branch and gets no ACL item; whether that matters depends on the ACL of 
the tier.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to