Kubernetes:如何检查etcd组件服务的健康状况?

时间:2016-06-15 21:18:47

标签: kubernetes

我在AWS中有一个k8s群集,它看起来部分,但实际上不会进行部署。在查看组件的健康状况时,etcd显示为不健康。这似乎是一个问题,etd端点被查询为http与https:

kubectl --kubeconfig=Lab_42/kubeconfig.yaml get componentstatuses --namespace=default
NAME                 STATUS      MESSAGE                                                                                                 ERROR
controller-manager   Healthy     ok                                                                                                      
scheduler            Healthy     ok                                                                                                      
etcd-2               Unhealthy   Get http://ip-10-42-2-50.ec2.internal:2379/health: malformed HTTP response "\x15\x03\x01\x00\x02\x02"   
etcd-1               Unhealthy   Get http://ip-10-42-2-41.ec2.internal:2379/health: malformed HTTP response "\x15\x03\x01\x00\x02\x02"   
etcd-0               Unhealthy   Get http://ip-10-42-2-40.ec2.internal:2379/health: malformed HTTP response "\x15\x03\x01\x00\x02\x02" 

我没有使用--ca-config选项,而是将配置值直接放在apiserver运行中。我的apiserver配置:

command:
  - /hyperkube
  - apiserver
  - --advertise-address=10.42.2.50
  - --admission_control=NamespaceLifecycle,NamespaceAutoProvision,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota
  - --allow-privileged=true
  - --authorization-mode=AlwaysAllow
  - --bind-address=0.0.0.0
  - --client-ca-file=/etc/ssl/kubernetes/k8s-ca.pem
  - --etcd-cafile=/etc/ssl/etcd/etcd-ca.pem
  - --etcd-certfile=/etc/ssl/etcd/etcd-client.pem
  - --etcd-keyfile=/etc/ssl/etcd/etcd-client-key.pem
  - --etcd-servers=https://127.0.0.1:2379
  - --kubelet-certificate-authority=/etc/ssl/kubernetes/k8s-ca.pem
  - --kubelet-client-certificate=/etc/ssl/kubernetes/k8s-apiserver-client.pem
  - --kubelet-client-key=/etc/ssl/kubernetes/k8s-apiserver-client-key.pem
  - --kubelet-https=true
  - --logtostderr=true
  - --runtime-config=extensions/v1beta1/deployments=true,extensions/v1beta1/daemonsets=true,api/all
  - --secure-port=443
  - --service-account-lookup=false
  - --service-cluster-ip-range=10.3.0.0/24
  - --tls-cert-file=/etc/ssl/kubernetes/k8s-apiserver.pem
  - --tls-private-key-file=/etc/ssl/kubernetes/k8s-apiserver-key.pem

实际的问题是,简单的部署实际上并没有做任何事情,而且我不确定etcd是否会导致问题,因为我们在混合中有许多其他证书。

kubectl --kubeconfig=Lab_42/kubeconfig.yaml get deployments --namespace=default
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3         0         0            0           2h

如果我使用本地https端点

,我实际上可以直接查询etcd
/usr/bin/etcdctl --ca-file /etc/ssl/etcd/etcd-ca.pem --cert-file /etc/ssl/etcd/etcd-client.pem --key-file /etc/ssl/etcd/etcd-client-key.pem 
--endpoints 'https://127.0.0.1:2379' \
get /registry/minions/ip-10-42-2-50.ec2.internal | jq "."
{
  "kind": "Node",
  "apiVersion": "v1",
  "metadata": {
    "name": "ip-10-42-2-50.ec2.internal",
    "selfLink": "/api/v1/nodes/ip-10-42-2-50.ec2.internal",
...SNIP

2 个答案:

答案 0 :(得分:0)

事实证明,组件状态是一个红色的鲱鱼。真正的问题是由于我的控制器配置错误。主人设置为http://master_ip:8080而不是http://127.0.0.1:8080。 apiserver的不安全端口未暴露给外部接口,因此控制器无法连接。

切换到loopback不安全或:443解决了我的问题。

使用CoreOS超立方体和kubelet-wrapper时,会丢失/ var / log / containers中自动链接的容器日志。要找到这些,您可以执行以下操作:

ls -latr /var/lib/docker/containers/*/*-json.log

我实际上能够以这种方式看到导致问题的错误。

答案 1 :(得分:0)

我认为您的kube-apiserver的配置缺少选项--etcd-server=xxx