我正在尝试使用 envoy sidecar 为 etcd 对等 Pod 创建授权策略,以授权访问端口 2380 并拒绝集群中尝试访问对等端口的任何其他 Pod。这些 Pod 属于同一服务。
我尝试将主机(*.etcd-cluster.ns.svc)添加到授权策略中的when条件中,如果主机在请求中不匹配,则需要拒绝该请求。但是,使用 istio 时,主机会发生变化,因为特使会传递流量,但它不起作用。
如何设置特定于 etcd 的简单授权策略,以授权并允许 etcd 对等 Pod 通信,并在尝试访问时拒绝其余 Pod?
要实现允许 etcd 对等 pod 在端口 2380 上通信并拒绝访问任何其他 pod 的 Istio AuthorizationPolicy,您需要在运行 etcd pod 的同一命名空间中创建一个
AuthorizationPolicy
资源。
以下是该政策的示例。但在此之前请确保以下事项
识别 Etcd Pod:确保可以通过标签或服务帐户清楚地识别您的 etcd Pod。如果它们尚未标记或使用特定服务帐户,您将需要进行设置。
为 Etcd Pod 创建服务帐户(如有必要):如果它们尚不存在,请为您的 etcd Pod 创建专用的 Kubernetes ServiceAccount。这将允许您根据
source.principal
创建授权策略。
apiVersion: v1
kind: ServiceAccount
metadata:
name: etcd-peer
namespace: ns
用
kubectl apply -f <filename>.yaml
涂抹。
更新您的 etcd 部署配置以使用新创建的服务帐户。
apiVersion: apps/v1
kind: Deployment
metadata:
name: etcd-cluster
namespace: ns # replace with the actual namespace where the etcd pods should run
spec:
selector:
matchLabels:
app: etcd-cluster # these labels should match the labels in template.metadata.labels
replicas: 3 # set the number of etcd replicas
template:
metadata:
labels:
app: etcd-cluster # these labels should match the labels in spec.selector.matchLabels
spec:
serviceAccountName: etcd-peer # the service account created for etcd
containers:
- name: etcd
image: etcd:latest # replace with the actual etcd image you want to use
ports:
- containerPort: 2380
再次使用
kubectl apply -f <filename>.yaml
进行申请。
创建 Istio AuthorizationPolicy,仅当来自具有
etcd-peer
ServiceAccount 的 Pod 时才允许与端口 2380 进行通信。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: etcd-peer-authz
namespace: ns # Replace 'ns' with the actual namespace of the etcd pods
spec:
selector:
matchLabels:
app: etcd-cluster # Replace with actual labels of the etcd pods
action: ALLOW
rules:
- to:
- operation:
ports: ["2380"]
when:
- key: source.namespace
values: ["ns"] # Replace 'ns' with the actual namespace of the etcd pods
- key: source.principal
values: ["cluster.local/ns/ns/sa/etcd-peer"]
该政策具有以下作用:
app: etcd-cluster
内带有标签 ns
的 Pod。2380
。source.principal
字段根据原始 Pod 的服务帐户来限制访问。这假设您的 etcd pod 具有可由 Istio 识别的唯一服务帐户或主体。参考资料: