定义仅允许通过网络策略仅出口到kube-apiserver的规则的最佳方法是什么?
虽然kube-apiserver有一个Service
资源,但没有Pods
,据我所知,标签不能做到这一点。使用IP白名单,不能保证此功能可跨群集使用。这里有建议的做法吗?
答案 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 IP
和Endpoint 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>