将带有网络策略的kube-apiserver列入白名单

时间:2019-11-10 15:32:26

标签: kubernetes kubernetes-networkpolicy

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

虽然kube-apiserver有一个Service资源,但没有Pods,据我所知,标签不能做到这一点。使用IP白名单,不能保证此功能可跨群集使用。这里有建议的做法吗?

2 个答案:

答案 0 :(得分:1)

您必须使用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

The policy above applies to all pods in the namespaces it is applied to
要选择特定的Pod,请使用需要apiserver访问权限的Pod的标签来编辑podSelector部分:

  podSelector:
    matchLabels:
      app: apiserver-allowed

请记住,默认的出口策略是ALLOW ALL,这意味着其他Pod仍然可以访问apiserver。
You can change this behavior by adding a "BLOCK ALL" egress policy per namespace,但请记住不要阻止对DNS服务器和其他基本服务的访问。
For more info see "Egress and DNS (Pitfall!)" in this post

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

答案 1 :(得分:0)

我想到了两种选择。

1),默认情况下创建NetworkPolicy,拒绝所有egress流量,但Kubernetes-apiservice IP范围例外。

由于某些重新启动,服务IP可能已更改,最好使用IP范围。 在这种情况下,您需要将Kubernetes service IPEndpoint IP列入白名单。

This docs提供了拒绝所有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>

我建议您查看this文章。

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>