--- 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 列应该为 `active`,Agent 列(用于反映 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](https://github.com/juju-solutions/cdk-field-agent) 来完成。 在带有 Juju 客户端,而客户端配有指向相应的 CDK 部署的控制器的节点上, 下载并执行[CDK Field Agent](https://github.com/juju-solutions/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 --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 --debug Created tunnel using local port: '36749' SERVER: "localhost:36749" CHART PATH: /home/ubuntu/.helm/ NAME: ... ... ``` ## 日志和监控 默认情况下, Kubernetes 没有节点的日志聚合,每个节点都是本地保存日志。 请参阅[日志](/docs/getting-started-guides/ubuntu/logging/)文档,获取更多信息。 {{% /capture %}}