我正在Azure上使用AKS群集。我正在尝试使用DNS(http://my-api.default.svc.cluster.local:3000/)发现服务,但无法正常工作(无法访问此站点)。使用服务IP端点,一切正常。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-api
labels:
app: my-api
spec:
replicas: 1
selector:
matchLabels:
app: my-api
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: my-api
image: test.azurecr.io/my-api:latest
ports:
- containerPort: 3000
imagePullSecrets:
- name: testsecret
---
apiVersion: v1
kind: Service
metadata:
name: my-api
spec:
selector:
app: my-api
ports:
- protocol: TCP
port: 3000
targetPort: 3000
kubectl描述服务kube-dns --namespace kube-system
Name: kube-dns
Namespace: kube-system
Labels: addonmanager.kubernetes.io/mode=Reconcile
k8s-app=kube-dns
kubernetes.io/cluster-service=true
kubernetes.io/name=KubeDNS
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"addonmanager.kubernetes.io/mode":"Reconcile","k8s-app":"kube-dns","kubernet...
Selector: k8s-app=kube-dns
Type: ClusterIP
IP: 10.10.110.110
Port: dns 53/UDP
TargetPort: 53/UDP
Endpoints: 10.10.100.54:53,10.10.100.64:53
Port: dns-tcp 53/TCP
TargetPort: 53/TCP
Endpoints: 10.10.100.54:53,10.10.100.64:53
Session Affinity: None
Events: <none>
kubectl描述svc my-api
Name: my-api
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"my-api","namespace":"default"},"spec":{"ports":[{"port":3000,"protocol":...
Selector: app=my-api
Type: ClusterIP
IP: 10.10.110.104
Port: <unset> 3000/TCP
TargetPort: 3000/TCP
Endpoints: 10.10.100.42:3000
Session Affinity: None
Events: <none>
来自第二个POD
kubectl exec -it second-pod /bin/bash
curl my-api.default.svc.cluster.local:3000
Response: {"value":"Hello world2"}
第二个POD网站正在运行,该网站正在使用相同的终结点,但未连接到服务。
答案 0 :(得分:1)
修复了yaml文件的缩进后,我能够成功启动部署和服务。 DNS解析也很好。
差异:
test1
而不是default
的命名空间80
代替了3000
部署:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
app: my-api
name: my-api
namespace: test1
spec:
replicas: 1
selector:
matchLabels:
app: my-api
template:
metadata:
labels:
app: my-api
spec:
containers:
- image: leodotcloud/swiss-army-knife
name: my-api
ports:
- containerPort: 80
protocol: TCP
服务:
apiVersion: v1
kind: Service
metadata:
name: my-api
namespace: test1
spec:
ports:
- port: 3000
protocol: TCP
targetPort: 80
selector:
app: my-api
type: ClusterIP
调试步骤:
curl
或dig
命令。答案 1 :(得分:0)
如果您使用Deployment
将应用程序部署到将通过Service
使用的群集上,则完全不需要手动设置Endpoints
。只需依靠kubernetes并在Service
对象中定义普通选择器即可。
除此之外,在有意义的情况下(群集中使用的外部服务),您需要确保Endpoints
端口定义与服务上的端口定义完全匹配(包括协议和可能的名称)。这种不完全匹配是端点作为服务的一部分不可见的最常见原因。
答案 2 :(得分:0)
从上面的讨论中,我了解到,您想要公开服务但不使用IP地址。 服务可以通过多种方式公开。您应该寻找服务类型LoadBalancer。
尝试修改服务如下:
apiVersion: v1
kind: Service
metadata:
name: my-api
spec:
type: LoadBalancer
selector:
app: my-api
ports:
- protocol: TCP
port: 3000
targetPort: 3000
这将创建一个负载平衡器,并将您的服务映射到相同的负载。
稍后,您可以将此负载平衡器添加到Azure提供的DNS映射服务中,以提供所需的域名。例如:http:\\my-api.example.com:3000
如果您将端口定义如下,我也想补充一下:
ports:
- name: http
port: 80
targetPort: 3000
这会将进入端口80的流量重定向到3000,您的服务呼叫看上去更加干净。 http:\\my-api.example.com