我试图在集群a上创建一个指向集群B的IP地址的服务。我没有集群B的域名,所以不能使用ExternalName。我尝试这样做的方式是通过在集群a上创建一个没有选择器的服务,并为该服务手动创建一个EndpointSlice资源,该资源将指向集群b。根据Kubernetes文档,我需要通过设置Kubernetes将EndpointSlice链接到服务。该EndpointSlice上的/service-name标签。"但是,即使这样做了,我的服务显然没有端点。
代码endpointslice.yaml
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: hack-svc-1
labels:
kubernetes.io/service-name: hack-svc
kubernetes.io/managed-by: manual
addressType: IPv4
ports:
- port: 80
endpoints:
- addresses:
- "cluster B's IPv4 address here"
conditions:
ready: true
service.yaml
apiVersion: v1
kind: Service
metadata:
name: hack-svc
spec:
ports:
- port: 80
Afterkubectl describe service hack-svc
:
Name: hack-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: <none>
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: <IPv4 address here>
IPs: <IPv4 address here>
Port: http 80/TCP
TargetPort: 80/TCP
Endpoints: <none> <-- No endpoints??
Session Affinity: None
Events: <none>
我如何将EndpointSlice与我的服务关联?
secavfr
在SO上发布了一个据说有效的例子。
当我尝试这个时,我也发现没有创建端点。示例是Kubernetes 1.26和NGINX 1.7,但我在Kubernetes 1.25和NGINX入口控制器v1.8.0 NGINX版本:NGINX/1.21.6在GKE自动驾驶集群。
我怀疑版本之间的语法有一些细微的变化,但我还没有找到解决方案。也许还需要创建端点?
kubectl -n namespace describe endpointslice hack-svc-1
返回端点,但它们不与服务关联?
更改IP地址并重新申请会导致服务重新配置,但IP地址会在任何接口中报告。
endpointslice.discovery.k8s.io/my-service-1 configured
我也尝试使用端点而不是EndPointSlice,但它给出了非常相似的结果。
然后我尝试ExternalIP
服务类型。我试着用
gcloud beta container clusters update my-cluster --enable-service-externalips
错误结果为
GKE Warden rejected the request because it violates one or more constraints.
Violations details: {"[denied by autopilot-external-ip-limitation]":["service external IPs are forbidden in Autopilot due to CVE-2020-8554: [10.101.0.17]"]}
GKE Autopilot在响应CVE-2020-8554时禁用externalip,但我不知道这是否适用于此问题。
EndpointSlice API是端点API的可伸缩和可扩展替代方案。EndpointSlices从服务的pod中收集IP地址、端口、准备情况和拓扑等信息。遵循本教程,并在为集群配置EndpointSlices时验证是否有任何不匹配,它在我的案例中有所帮助。