我在没有选择器的情况下在Kubernetes的服务中苦苦挣扎。群集通过kops安装在AWS上。我有一个带有3个Nginx Pod的部署,暴露了端口80:
apiVersion: apps/v1 kind: Deployment metadata: name: ngix-dpl # Name of the deployment object labels: app: nginx spec: replicas: 3 # Number of instances in the deployment selector: # Selector identifies pods to be matchLabels: # part of the deployment app: nginx # by matching of the label "app" template: # Templates describes pods of the deployment metadata: labels: # Defines key-value map app: nginx # Label to be recognized by other objects spec: # as deployment or service containers: # Lists all containers in the pod - name: nginx-pod # container name image: nginx:1.17.4 # container docker image ports: - containerPort: 80 # port exposed by container
创建部署后,我记下了IP地址:
$ kubectl get pods -o wide | awk {'print $1" " $3" " $6'} | column -t NAME STATUS IP curl Running 100.96.6.40 ngix-dpl-7d6b8c8944-8zsgk Running 100.96.8.53 ngix-dpl-7d6b8c8944-l4gwk Running 100.96.6.43 ngix-dpl-7d6b8c8944-pffsg Running 100.96.8.54
并创建了一个服务于IP地址的服务:
apiVersion: v1 kind: Service metadata: name: dummy-svc labels: app: nginx spec: ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: v1 kind: Endpoints metadata: name: dummy-svc subsets: - addresses: - ip: 100.96.8.53 - ip: 100.96.6.43 - ip: 100.96.8.54 ports: - port: 80 name: http
服务已成功创建:
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dummy-svc ClusterIP 100.64.222.220 <none> 80/TCP 32m kubernetes ClusterIP 100.64.0.1 <none> 443/TCP 5d14h
不幸的是,我尝试通过服务从相同名称空间的另一个Pod连接到Nginx失败:
$ curl 100.64.222.220 curl: (7) Failed to connect to 100.64.222.220 port 80: Connection refused
我可以直接成功地连接到Nginx Pod:
$ curl 100.96.8.53 <!DOCTYPE html> <html> <head> ....
我注意到我的服务没有任何端点。但是我不确定应该在此处显示手动端点:
$ kubectl get svc/dummy-svc -o yaml apiVersion: v1 kind: Service metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"dummy-svc","namespace":"default"},"spec":{"ports":[{"port":80,"protocol":"TCP","targetPort":80}]}} creationTimestamp: "2019-11-22T08:41:29Z" labels: app: nginx name: dummy-svc namespace: default resourceVersion: "4406151" selfLink: /api/v1/namespaces/default/services/dummy-svc uid: e0aa9d01-0d03-11ea-a19c-0a7942f17bf8 spec: clusterIP: 100.64.222.220 ports: - port: 80 protocol: TCP targetPort: 80 sessionAffinity: None type: ClusterIP status: loadBalancer: {}
我知道这不是服务的正确用例,使用pod选择器会使它工作。但我想强调一下为什么此配置不起作用。我不知道在哪里寻找解决方案。任何提示将不胜感激。
如果您从端点配置中删除“名称”字段,则它起作用。它应该看起来像这样:
apiVersion: v1 kind: Endpoints metadata: name: dummy-svc subsets: - addresses: - ip: 172.17.0.4 - ip: 172.17.0.5 - ip: 172.17.0.6 ports: - port: 80