在单节点kubernetes集群上,我可以使用&曝光&#39; cmd,但通过create -f <svc.json-file>执行此操作失败

时间:2016-02-08 01:38:24

标签: kubernetes

我正在设置一个单节点k8s集群进行测试,我们遇到了一个令人困惑的服务问题。我已将该示例提炼为部署单词印刷服务之一,我可以使用 kubectl create -f wordpress-rc.json 然后进行曝光。但是,当我按照 kubectl create -f 创建rep控制器时,它会失败。我在下面显示了所有json文件内容。

rep控制器:

{
  "kind": "ReplicationController",
  "apiVersion": "v1",
  "metadata": {
    "name": "wordpress",
    "labels": {
      "app": "wordpress"
    }
  },
  "spec": {
    "replicas": 1,
    "selector": {
      "app": "wordpress"
    },
    "template": {
      "metadata": {
        "labels": {
          "app": "wordpress"
        }
      },
      "spec": {
        "containers": [
          {
            "name": "wordpress",
            "image": "tutum/wordpress",
            "ports": [
              {
                "containerPort": 80,
                "name": "http-server",
                "protocol": "TCP"
              }
            ],
            "imagePullPolicy": "IfNotPresent"
           }
        ],
        "restartPolicy": "Always",
        "dnsPolicy": "ClusterFirst"
      }
    }
  }
}

服务:

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "wordpress",
    "labels": {
      "name": "wordpress"
    }
  },
  "spec": {
        "type": "LoadBalancer",
    "ports": [
      {
        "name":"wordpress1",
        "protocol":"TCP",
        "port": 80,
        "targetPort": 80
      }
    ],
    "selector": {
      "name": "wordpress"
    }
  }
}

工作指令序列

 alias kk kubectl
 kk create -f /tmp/wp-rc.json
 kubectl expose rc wordpress --type=LoadBalancer

命令序列失败

  alias kk kubectl
  kk create -f /tmp/wp-rc.json
  kk create -f /tmp/wp-service.json

我的问题是为什么服务定义不起作用,而expose命令呢?

为了完整性,这里是我如何启动我的单节点k8s集群。这一切都在centos 7上运行,b.t.w:

#   magic selinux context set command is required. for details, see: http://stackoverflow.com/questions/34777111/cannot-create-a-shared-volume-mount-via-emptydir-on-single-node-kubernetes-on
#
sudo chcon -Rt svirt_sandbox_file_t /var/lib/kubelet


docker run --net=host -d gcr.io/google_containers/etcd:2.0.12 /usr/local/bin/etcd --addr=127.0.0.1:4001 --bind-addr=0.0.0.0:4001 --data-dir=/var/etcd/data


docker run \
    --volume=/:/rootfs:ro \
    --volume=/sys:/sys:ro \
    --volume=/dev:/dev \
    --volume=/var/lib/docker/:/var/lib/docker:ro \
    --volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
    --volume=/var/run:/var/run:rw \
    --net=host \
    --pid=host \
    --privileged=true \
    -d \
    gcr.io/google_containers/hyperkube:v1.0.1 \
    /hyperkube kubelet --containerized --hostname-override="127.0.0.1" --address="0.0.0.0" --api-servers=http://localhost:8080 --config=/etc/kubernetes/manifests

docker run -d --net=host --privileged gcr.io/google_containers/hyperkube:v1.0.1 /hyperkube proxy --master=http://127.0.0.1:8080 --v=2

sleep 20   # give everything time to launch

1 个答案:

答案 0 :(得分:2)

服务json文件使用标签选择器name: wordpress,它与复制控制器的标签选择器app: wordpress不同。这意味着使用该json文件创建的服务是针对具有name: wordpress标签的pod,但复制控制器使用app: wordpress标签定位pod。这就是为什么使用json文件创建的服务没有按预期工作的原因。

您可以使用kubectl get svc wordpress -o yaml来比较两种已创建的服务。

此外,根据config best practice,建议先创建服务,然后再创建复制控制器:

  

在相应的复制控制器之前创建服务,以便调度程序可以传播组成该服务的pod。您也可以创建复制控制器而不指定副本,创建服务,然后扩展复制控制器,这可能在使用渐进式披露的示例中更好地工作,并且可能在实际场景中也有好处,例如在创建批次之前确保一个副本工作他们)