* `http://kubernetes.io/docs/` -> `/docs/` * `https://kubernetes.io/docs/` -> `/docs/`
12 KiB
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 列应该为 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 来完成。
在带有 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 进行部署,需要执行以下步骤:
-
暴露 Kubernetes Master 服务
juju expose kubernetes-master
-
确定其中一个主节点的公开 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
-
更新 kubeconfig 文件
确定集群所使用的 kubeconfig 文件或配置部分,然后修改服务器配置。
默认情况下,这个配置类似于
https://54.213.123.123:443。将其替换为 Kubernetes Master 端点地址https://54.210.100.102:6443并保存。注意,Kubernetes Master API 的 CDK 默认使用的端口为 6443,而负载均衡器暴露的端口是 443。
-
继续使用 helm!
helm install <chart> --debug Created tunnel using local port: '36749' SERVER: "localhost:36749" CHART PATH: /home/ubuntu/.helm/<chart> NAME: <chart> ... ...
日志和监控
默认情况下, Kubernetes 没有节点的日志聚合,每个节点都是本地保存日志。 请参阅日志文档,获取更多信息。
{{% /capture %}}