2

定义仅允许使用网络策略出口到 kube-apiserver 的规则的最佳方法是什么?

虽然有Servicekube-apiserver 的资源,但没有Pods,据我所知,这不能用标签来完成。使用 IP 白名单,不能保证跨集群工作。这里有什么推荐的做法吗?

4

2 回答 2

3

您必须使用 apiserver 的 IP 地址。您不能使用标签。
要查找 apiserver 的 IP 地址,请运行:
kubectl cluster-info

在输出中寻找这样的一行:
Kubernetes master is running at https://<ip>
这是您的 apiserver IP 的 IP 地址。

网络策略应如下所示(假设 apiserver IP 为 34.76.197.27):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-apiserver
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 34.76.197.27/32
    ports:
    - protocol: TCP
      port: 443

上述策略适用于它所应用到的命名空间中的所有 pod
要选择特定的 pod,请使用需要 apiserver 访问的 pod 的标签编辑 podSelector 部分:

  podSelector:
    matchLabels:
      app: apiserver-allowed

请记住,默认的出口策略是 ALLOW ALL,这意味着其他 pod 仍然可以访问 apiserver。
您可以通过为每个命名空间添加“BLOCK ALL”出口策略来更改此行为,但请记住不要阻止对 DNS 服务器和其他基本服务的访问。
有关更多信息,请参阅本文中的“出口和 DNS(陷阱!)”

请注意,在某些情况下,可能有多个 apiserver(用于可扩展性),在这种情况下,您需要添加所有 IP 地址。

于 2019-11-24T09:47:48.540 回答
1

我想到了两个选择。

1)创建NetworkPolicy默认拒绝所有具有IP 范围例外的egress流量。Kubernetes-apiservice

由于某些重新启动,可能会更改服务 IP,以便更好地使用 IP 范围。在这种情况下,您需要将 kubernetesservice IPEndpoint IP.

该文档提供了拒绝所有egress流量的示例。您将需要修改此示例以将此地址添加为例外。它看起来像这样。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-egress
  #optional namespace
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress
  - to:
    - ipBlock:
      cidr: <kube-apiserver-IP-range>
    - port: <svc-port>
      protocol: <svc-protocol>

我建议你检查这篇文章。

2)使用静态 IP创建service,将流量转发到kubernetes-apiserver.

将运行kubectl proxy到 apiserver 的服务。

如何确定 kube-apiserver

默认情况下,在每个集群中,您将能够看到一项服务。例如kubeadm它是 kubernetes

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   15d

如果你会描述它,你会得到endpoint

$ kubectl describe svc kubernetes
Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.96.0.1
Port:              https  443/TCP
TargetPort:        6443/TCP
Endpoints:         10.166.0.30:6443
Session Affinity:  None
Events:            <none>

如果您从kube-system命名空间检查 pod,它们中的大多数都有 IP,即 kubernetes 服务端点。

$ kubectl get pods -n kube-system -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE   READINESS GATES
coredns-5644d7b6d9-7sm4d               1/1     Running   3          15d   10.32.0.3     ubus-kubeadm   <none>           <none>
coredns-5644d7b6d9-g42g6               1/1     Running   3          15d   10.32.0.2     ubus-kubeadm   <none>           <none>
etcd-ubus-kubeadm                      1/1     Running   3          15d   10.166.0.30   ubus-kubeadm   <none>           <none>
kube-apiserver-ubus-kubeadm            1/1     Running   3          15d   10.166.0.30   ubus-kubeadm   <none>           <none>
kube-controller-manager-ubus-kubeadm   1/1     Running   3          15d   10.166.0.30   ubus-kubeadm   <none>           <none>
kube-proxy-57r9m                       1/1     Running   3          15d   10.166.0.30   ubus-kubeadm   <none>           <none>
kube-scheduler-ubus-kubeadm            1/1     Running   3          15d   10.166.0.30   ubus-kubeadm   <none>           <none>
weave-net-l6b5x                        2/2     Running   9          15d   10.166.0.30   ubus-kubeadm   <none>           <none>
于 2019-11-14T14:01:42.610 回答