定义仅允许使用网络策略出口到 kube-apiserver 的规则的最佳方法是什么?
虽然有Service
kube-apiserver 的资源,但没有Pods
,据我所知,这不能用标签来完成。使用 IP 白名单,不能保证跨集群工作。这里有什么推荐的做法吗?
定义仅允许使用网络策略出口到 kube-apiserver 的规则的最佳方法是什么?
虽然有Service
kube-apiserver 的资源,但没有Pods
,据我所知,这不能用标签来完成。使用 IP 白名单,不能保证跨集群工作。这里有什么推荐的做法吗?
您必须使用 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 地址。
我想到了两个选择。
1)创建NetworkPolicy
默认拒绝所有具有IP 范围例外的egress
流量。Kubernetes-apiservice
由于某些重新启动,可能会更改服务 IP,以便更好地使用 IP 范围。在这种情况下,您需要将 kubernetesservice IP
和Endpoint 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>