kubernetes复制控制器

我有一个简单的kubernetes集群与主和3个爪牙。 在这种情况下,如果我运行一个简单的pod的nginx或一个mysql,它可以正常工作,但是,如果我改变yintypes的文件,我尝试运行复制的服务,豆荚将启动,但我不能访问服务。

这是我的yaml文件nginx与3个副本:

apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 

这是服务yamlconfiguration文件:

 apiVersion: v1 kind: Service metadata: labels: name: nginx name: nginx spec: ports: - port: 80 selector: name: nginx 

我运行它:

 # kubectl create -f nginx-rc.yaml # kubectl create -f nginx-rc-service.yaml 

如果我运行:

 # kubectl get pod,svc,rc -o wide 

我懂了:

 NAME READY STATUS RESTARTS AGE NODE nginx-kgq1s 1/1 Running 0 1m node01 nginx-pomx3 1/1 Running 0 1m node02 nginx-xi54i 1/1 Running 0 1m node03 NAME LABELS SELECTOR IP(S) PORT(S) kubernetes component=apiserver,provider=kubernetes <none> 10.254.0.1 443/TCP nginx name=nginx name=nginx 10.254.47.150 80/TCP CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx nginx nginx app=nginx 3 

我可以看到pod的描述:

 Name: nginx-kgq1s Namespace: default Image(s): nginx Node: node01/node01 Labels: app=nginx Status: Running Reason: Message: IP: 172.17.52.3 Replication Controllers: nginx (3/3 replicas created) Containers: nginx: Image: nginx State: Running Started: Thu, 11 Feb 2016 16:28:08 +0100 Ready: True Restart Count: 0 Conditions: Type Status Ready True Events: FirstSeen LastSeen Count From SubobjectPath Reason Message Thu, 11 Feb 2016 16:27:47 +0100 Thu, 11 Feb 2016 16:27:47 +0100 1 {scheduler } scheduled Successfully assigned nginx-kgq1s to node01 Thu, 11 Feb 2016 16:27:57 +0100 Thu, 11 Feb 2016 16:27:57 +0100 1 {kubelet node01} implicitly required container POD pulled Pod container image "gcr.io/google_containers/pause:0.8.0" already present on machine Thu, 11 Feb 2016 16:28:02 +0100 Thu, 11 Feb 2016 16:28:02 +0100 1 {kubelet node01} implicitly required container POD created Created with docker id bed30a90c6eb Thu, 11 Feb 2016 16:28:02 +0100 Thu, 11 Feb 2016 16:28:02 +0100 1 {kubelet node01} implicitly required container POD started Started with docker id bed30a90c6eb Thu, 11 Feb 2016 16:28:07 +0100 Thu, 11 Feb 2016 16:28:07 +0100 1 {kubelet node01} spec.containers{nginx} created Created with docker id 0a5c69cd0481 Thu, 11 Feb 2016 16:28:08 +0100 Thu, 11 Feb 2016 16:28:08 +0100 1 {kubelet node01} spec.containers{nginx} started Started with docker id 0a5c69cd0481 

这是我看到,如果我得到rc的描述:

 Name: nginx Namespace: default Image(s): nginx Selector: app=nginx Labels: app=nginx Replicas: 3 current / 3 desired Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed Events: FirstSeen LastSeen Count From SubobjectPath Reason Message Thu, 11 Feb 2016 16:27:47 +0100 Thu, 11 Feb 2016 16:27:47 +0100 1 {replication-controller } successfulCreate Created pod: nginx-kgq1s Thu, 11 Feb 2016 16:27:47 +0100 Thu, 11 Feb 2016 16:27:47 +0100 1 {replication-controller } successfulCreate Created pod: nginx-pomx3 Thu, 11 Feb 2016 16:27:47 +0100 Thu, 11 Feb 2016 16:27:47 +0100 1 {replication-controller } successfulCreate Created pod: nginx-xi54i 

这就是我看到如果我得到服务的描述:

 Name: nginx Namespace: default Labels: name=nginx Selector: name=nginx Type: ClusterIP IP: 10.254.47.150 Port: <unnamed> 80/TCP Endpoints: <none> Session Affinity: None No events. 

正如我所看到的,问题可能是我没有终点,但我不知道如何解决。

它看起来像我的select器为您的服务是错误的。 它正在寻找name: nginx的标签name: nginx ,但你的豆荚实际上有app: nginx

尝试将您的服务文件更改为:

 apiVersion: v1 kind: Service metadata: labels: name: nginx name: nginx spec: ports: - port: 80 selector: app: nginx 

…或更改您的复制控制器模板以使用name: nginx而不是app: nginx作为标签。 基本上,标签必须匹配,以便服务知道如何在您的豆荚上呈现统一的外观。

要build立@ jonskeet的答案,标签必须匹配的原因是因为Pod可以运行在k8s集群中的任何节点上,而Services需要一种方法来定位它们。

因此,您在Pod之前拍摄的服务需要能够通过群集进行筛选,特别是它所在名称空间中的一组Pod,并在两个select器中利用这些匹配的k / v作为其这样做的方法。