AKS服务无端点且标签选择器不匹配,无法访问外部IP
AKS中Service无端点导致无法访问WordPress页面的问题排查与解决
问题背景
作为AKS新手,我创建了php-svc Service和wordpressb Deployment的YAML配置,但访问Service外部IP无响应,且发现Pod标签与Service选择器不匹配。
配置文件
Deployment与Service的YAML配置
apiVersion: apps/v1 kind: Deployment metadata: name: wordpressbspec: replicas: 1 selector: matchlabels: app: wordpressb template: metadata: labels: app: wordpressb spec: containers: - name: wordpressb image: acrakswordpress.azurecr.io/wordpress:v1 ports: - containerPort: 80 env: - name: DATABASE_HOST value: "<<serverName>>.mysql.database.azure.com" - name: DATABASE_USERNAME value: "<<dbName>>" - name: DATABASE_PASSWORD value: "<<dbPassword>>" - name: DATABASE_NAME value: "<<dbName>>" affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: "app" operator: In value: wordpressb topologyKey: "kubernetes.io/hostname" apiVersion: v1 kind: Service metadata: name: php-svcspec: type: LoadBalancer ports: - port: 80 selector: app: wordpressb
问题现象
- Service无端点
执行kubectl describe service php-svc结果显示Endpoints为<none>:
Name: php-svc Namespace: default Labels: <none> Annotations: <none> Selector: app=wordpressb Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: 10.0.74.48 IPs: 10.0.74.48 LoadBalancer Ingress: 52.140.2.45 Port: <unset> 80/TCP TargetPort: 80/TCP NodePort: <unset> 30580/TCP Endpoints: <none> Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 44s service-controller Ensuring load balancer Normal EnsuredLoadBalancer 34s service-controller Ensured load balancer
- Pod标签与Service选择器不匹配
当前运行的wordpress-blogPod标签为run=wordpress-blog,与Service选择器app=wordpressb不符,执行kubectl describe pod wordpress-blog结果:
Name: wordpress-blog Namespace: default Priority: 0 Service Account: default Node: aks-nodepool1-41875026-vmss000000/10.224.0.5 Start Time: Sun, 19 May 2024 21:48:19 +0530 Labels: run=wordpress-blog Annotations: <none> Status: Running IP: 10.244.1.17 IPs: IP: 10.244.1.17 Containers: wordpress-blog: Container ID: containerd://758ad6ebc7cb0603e0bfed305070a3c990b6cc318069c73fb1649ec1555183a7 Image: wordpress Image ID: docker.io/library/wordpress@sha256:f468bab53528df6f87dfe11a80de26eff57e0f515e243d9dec73a02c80c273a7 Port: <none> Host Port: <none> State: Running Started: Sun, 19 May 2024 21:48:22 +0530 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-jfb56 (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-jfb56: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: <none>
解决方案
1. 修复YAML配置中的语法错误
原始YAML存在多处语法错误:
- Deployment的
metadata.name与spec未换行拆分,需改为name: wordpressb后单独换行写spec: - Service的
metadata.name与spec未换行拆分,需改为name: php-svc后单独换行写spec: - Deployment的
selector.matchlabels应为matchLabels(Kubernetes字段名大小写敏感) - Pod反亲和性规则中
value应为values(数组格式)
修正后的YAML配置:
apiVersion: apps/v1 kind: Deployment metadata: name: wordpressb spec: replicas: 1 selector: matchLabels: app: wordpressb template: metadata: labels: app: wordpressb spec: containers: - name: wordpressb image: acrakswordpress.azurecr.io/wordpress:v1 ports: - containerPort: 80 env: - name: DATABASE_HOST value: "<<serverName>>.mysql.database.azure.com" - name: DATABASE_USERNAME value: "<<dbName>>" - name: DATABASE_PASSWORD value: "<<dbPassword>>" - name: DATABASE_NAME value: "<<dbName>>" affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: "app" operator: In values: ["wordpressb"] topologyKey: "kubernetes.io/hostname" --- apiVersion: v1 kind: Service metadata: name: php-svc spec: type: LoadBalancer ports: - port: 80 targetPort: 80 selector: app: wordpressb
2. 清理错误Pod并重新部署
- 删除当前运行的
wordpress-blogPod:
kubectl delete pod wordpress-blog
- 应用修正后的YAML配置:
kubectl apply -f your-config-file.yaml
3. 验证配置生效
- 检查Deployment是否成功创建匹配标签的Pod:
kubectl get pods -l app=wordpressb
- 检查Service是否关联到端点:
kubectl describe service php-svc
当Endpoints字段显示Pod的IP地址时,即可访问Service的外部IP查看WordPress页面。
内容的提问来源于stack exchange,提问作者devTeam Monconnect
相关产品推荐
相关产品推荐

