Files
2019-03-20 17:55:36 -07:00

12 KiB
Raw Permalink Blame History

title
title
故障排除

{{% capture overview %}}

本文重点讨论如何解决 Kubernetes 集群部署过程中的问题, 而不会关心如何调试 Kubernetes 集群内的工作负载。

{{% /capture %}}

{{% capture prerequisites %}}

本文假设您已经有一个用 Juju 部署、正在工作的集群。

{{% /capture %}}

{{% capture steps %}}

了解集群状态

使用 juju status 命令可以了解一些集群内的情况:

Model  Controller  Cloud/Region   Version
kubes  work-multi  aws/us-east-2  2.0.2.1

App                Version  Status  Scale  Charm              Store       Rev  OS      Notes
easyrsa            3.0.1    active      1  easyrsa            jujucharms    3  ubuntu
etcd               2.2.5    active      1  etcd               jujucharms   17  ubuntu
flannel            0.6.1    active      2  flannel            jujucharms    6  ubuntu
kubernetes-master  1.4.5    active      1  kubernetes-master  jujucharms    8  ubuntu  exposed
kubernetes-worker  1.4.5    active      1  kubernetes-worker  jujucharms   11  ubuntu  exposed

Unit                  Workload  Agent  Machine  Public address  Ports           Message
easyrsa/0*            active    idle   0/lxd/0  10.0.0.55                       Certificate Authority connected.
etcd/0*               active    idle   0        52.15.47.228    2379/tcp        Healthy with 1 known peers.
kubernetes-master/0*  active    idle   0        52.15.47.228    6443/tcp        Kubernetes master services ready.
  flannel/1           active    idle            52.15.47.228                    Flannel subnet 10.1.75.1/24
kubernetes-worker/0*  active    idle   1        52.15.177.233   80/tcp,443/tcp  Kubernetes worker running.
  flannel/0*          active    idle            52.15.177.233                   Flannel subnet 10.1.63.1/24

Machine  State    DNS            Inst id              Series  AZ
0        started  52.15.47.228   i-0bb211a18be691473  xenial  us-east-2a
0/lxd/0  started  10.0.0.55      juju-153b74-0-lxd-0  xenial
1        started  52.15.177.233  i-0502d7de733be31bb  xenial  us-east-2b

在这个例子中,我们可以获取一些信息。 Workload 列将显示给定服务的状态。 Message 部分将显示集群中给定服务的健康状况。 在部署和维护期间, 这些工作负载状态将进行更新以反映给定节点正在执行的操作。例如, Workload 可能显示为 maintenance,而 Message 则会相应显示为 Installing docker

正常情况下,Workload 列应该为 activeAgent 列(用于反映 Juju 代理正在做什么)应该为 idle 而 Message 要么是 Ready 或者其它描述性的术语。 如果集群运行健康,juju status --color 返回的结果输出都将是绿色的。

对于大型集群而言,状态信息可能会太多,因此建议检查各个服务的状态,例如仅检查工作节点的状态:

juju status kubernetes-worker

或者只检查 etcd 集群的状态:

juju status etcd

Errors will have an obvious message, and will return a red result when used with juju status --color. Nodes that come up in this manner should be investigated.

错误都会有明显的错误信息,使用 juju status --color 的返回结果也将是红色的。 如果节点状态出现这种情况,需要相应地检查了解。

SSH 到各个单元上

按照 juju ssh <服务名>/<单元#> 的命令格式可以轻松地连接到各个单元上:

juju ssh kubernetes-worker/3

将会 ssh 到第 3 个工作单元上。

juju ssh easyrsa/0

将会 ssh 到第 0 个 easyrsa 单元上。

收集调试信息

有时候,从集群上收集所有的信息,并与开发人员共享,将有助于发现问题。 这最好是通过 CDK Field Agent 来完成。

在带有 Juju 客户端,而客户端配有指向相应的 CDK 部署的控制器的节点上, 下载并执行CDK Field Agent中的 collect.py 文件。

运行该脚本会生成一个 tar 包,包含系统信息以及诸如 systemctl 状态,Juju 日志,charm 单元数据等基本信息。 额外和应用相关的信息可能也会包含其中。

常见问题

负载均衡器对 Helm 的影响

本节假定有一个用 Juju 部署的正在运行的 Kubernetes 集群,使用负载均衡器来代理 API,同时也用 Helm 来进行 chart 部署。

Helm 初始化:

helm init
$HELM_HOME has been configured at /home/ubuntu/.helm
Tiller (the helm server side component) has been installed into your Kubernetes Cluster.
Happy Helming!

随后使用 helm 时,可能会出现以下错误:

  • Helm 不能从 Tiller 服务器获取版本号
helm version
Client: &version.Version{SemVer:"v2.1.3", GitCommit:"5cbc48fb305ca4bf68c26eb8d2a7eb363227e973", GitTreeState:"clean"}
Error: cannot connect to Tiller
  • Helm 不能安装 chart
helm install <chart> --debug
Error: forwarding ports: error upgrading connection: Upgrade request required

这是因为 API 负载均衡器在 helm 客户端-服务端关系的上下文中不进行端口转发造成的。 要使用 helm 进行部署,需要执行以下步骤:

  1. 暴露 Kubernetes Master 服务

    juju expose kubernetes-master
    
  1. 确定其中一个主节点的公开 IP 地址

    juju status kubernetes-master
    Model       Controller  Cloud/Region   Version
    production  k8s-admin   aws/us-east-1  2.0.0
    
    App                Version  Status  Scale  Charm              Store       Rev  OS      Notes
    flannel            0.6.1    active      1  flannel            jujucharms    7  ubuntu
    kubernetes-master  1.5.1    active      1  kubernetes-master  jujucharms   10  ubuntu  exposed
    
    Unit                  Workload  Agent  Machine  Public address  Ports     Message
    kubernetes-master/0*  active    idle   5        54.210.100.102    6443/tcp  Kubernetes master running.
      flannel/0           active    idle            54.210.100.102              Flannel subnet 10.1.50.1/24
    
    Machine  State    DNS           Inst id              Series  AZ
    5        started  54.210.100.102  i-002b7150639eb183b  xenial  us-east-1a
    
    Relation      Provides               Consumes           Type
    certificates  easyrsa                kubernetes-master  regular
    etcd          etcd                   flannel            regular
    etcd          etcd                   kubernetes-master  regular
    cni           flannel                kubernetes-master  regular
    loadbalancer  kubeapi-load-balancer  kubernetes-master  regular
    cni           kubernetes-master      flannel            subordinate
    cluster-dns   kubernetes-master      kubernetes-worker  regular
    cni           kubernetes-worker      flannel            subordinate
    

    本例中,公开 IP 地址为 54.210.100.102。 如果想编程访问得到这个值,可以使用 JSON 输出:

    juju show-status kubernetes-master --format json | jq --raw-output '.applications."kubernetes-master".units | keys[]'
    54.210.100.102
    
  1. 更新 kubeconfig 文件

    确定集群所使用的 kubeconfig 文件或配置部分,然后修改服务器配置。

    默认情况下,这个配置类似于 https://54.213.123.123:443。将其替换为 Kubernetes Master 端点地址 https://54.210.100.102:6443 并保存。

    注意,Kubernetes Master API 的 CDK 默认使用的端口为 6443,而负载均衡器暴露的端口是 443。

  1. 继续使用 helm

    helm install <chart> --debug
    Created tunnel using local port: '36749'
    SERVER: "localhost:36749"
    CHART PATH: /home/ubuntu/.helm/<chart>
    NAME:   <chart>
    ...
    ...
    

日志和监控

默认情况下, Kubernetes 没有节点的日志聚合,每个节点都是本地保存日志。 请参阅日志文档,获取更多信息。

{{% /capture %}}