我有一个4节点的Kubernetes集群,有1个主节点和3个工作节点。我使用kubeconfig连接到kubernetes集群,因为昨天我无法使用kubeconfig连接。
Kubectl get Pods
提供了一个错误“到服务器api.xxxxx.xxxxxx.com的连接被拒绝-是否指定了正确的主机或端口?”
然后检查kube-apiserver docker,它继续退出/crashloopbackoff。
docker logs
显示以下错误
W0914 16:29:25.761524 1 ClientConn.GO:1251]GRPC:addrConn.CreateTransport未能连接到{127.0.0.1:4001}。错误:连接错误:desc=“传输:身份验证握手失败:X509:证书已过期或尚未有效”。重新连接...F0914 16:29:29.319785 1 storage_decorator.GO:57]无法创建存储后端:配置(&{etcd3/registry{[https://127.0.0.1:4001]/etc/kubernetes/pki/kube-apiserver/etcd-client.ver/etcd-client.crt/etc/kubernetes/pki/kube-apiserver/etcd-ca.crt}false true 0xC000266D80 apiextensions.k8s.io/v1beta1 5m0s 1m0s}),Err(超过上下文截止日期)
SystemCTL status Kubelet
-->提供以下错误
9月14日16:40:49 IP-xxx-xxx-xx-xx-xx kubelet[2411]:E0914 16:40:49.693576 2411 kubelet_node_status.go:385]更新节点状态时出错,将重试:获取节点“IP-xxx-xxx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-compute.internal”时出错:获取
注意:IP-xxx-xx-xx-xxx-->aws ec2实例的内部IP地址。
看起来2020年9月7日集群出现了一些问题,kube-controller和kube-scheduler dockers都退出并重新启动。我相信从那时起kube-apiserver就没有运行了,或者是因为kube-apiserver,那些码头工人重新启动了。kube-apiserver服务器证书于2020年7月到期,但通过kubectl的访问一直工作到9月7日。
下面是退出的Kube-Schedulerdocker容器中的docker日志:
下面是退出的kube-controller docker容器中的docker日志:
I0907 10:40:19.703485 1 garbageCollector.go:518]删除对象[v1/pod,命名空间:默认值,名称:k8version-1599474300-5r6ph,UID:67437201-F0F4-11EA-B612-0293E1AEE720]与传播策略背景I0907 10:44:01.937398 1 LeaderELECTION.GO:263]续订租约失败Kube-System/Kube-Controller-Manager:无法tryAcquireOrRenew上下文截止日期超过E0907 10:44:01.937506
1 LeaderELECTION.GO:306]检索资源锁错误Kube-System/Kube-Controller-Manager:Get系统/endpoint/kube-controller-manager?timeout=10s:net/http:请求取消(等待头时超过了client.timeout)I0907 10:44:01.937456 1 Event.go:209]事件(V1.objectreference{kint:“endpoints”,命名空间:“kube-system”,名称:“kube-controller-manager”,uid:“ba172d83-a302-11e9-b612-0293e1aee720”,apiversion:“v1”,resourceversion:“85406287”XX-XXX_1DD3C03B-BD90-11E9-85C6-0293E1AEE720停止领导F0907 10:44:01.937545 1 ControllerManager.GO:260]leaderelecI0907 10:44:01.949274
1 range_allocator.go:169]关闭范围CIDR分配器I0907 10:44:01.949285 1 replica_set.go:194]关闭replicaset控制器I0907 10:44:01.949291 1 GC_controller.go:86]关闭GC控制器I0907 10:44:01.949304 1 PVC_protection_controller.go:111]关闭PVC保护控制器I0907 10:44:01.949310 1 route_controller.go:125]关闭路由控制器I0907 49316 1 service_controller.go:197]关闭服务控制器I0907 10:44:01.949327 1 deployment_controller.go:164]关闭部署控制器I0907 10:44:01.949435 1 garbageCollector.go:148]关闭垃圾收集器控制器I0907 10:44:01.949443 1 resource_quota_controller.go:295]关闭资源配额控制器
以下是kube-controller自重新启动(9月7日)以来的docker日志:
E0915 21:51:36.028108 1 leaderelection.go:306]检索资源锁错误kube-system/kube-controller-manager:Get https:--127.0.0.1/API/v1/namespaces/kube-system/endpoints/kube-controller-manager?timeout=10s:拨号tcp 127.0.0.1:443:connect:拒绝连接E0915 21:51:40.133446 1 leaderelection.go:306]检索资源锁错误kube-system/kube-controller-manager:Get拨号tcp 127.0.0.1:443:Connect:连接被拒绝
以下是kube-scheduler自重新启动(9月7日)以来的docker日志:
E0915 21:52:44.703581Reflector.go:126]K8S.Io/client-go/informers/factory.go:133:未能列出*v1.节点:Get https://127.0.0.1/api/v1/nodes?limit=500&ResourceVersion=0:拨号tcp 127.0.0.1:443:连接:拒绝连接E0915 21:52:44.704504
1 reflector.go:126]K8S.Io/client-go/informers/factory.go:133:未能列出*v1.replicationcontroller:IT=500&ResourceVersion=0:拨号tcp 127.0.0.1:443:Connect:connection拒绝E0915 21:52:44.705471 1 reflector.go:126]K8S.Io/Client-Go/Informers/Factory.go:133:未能列出*V1.服务:Get https:--127.0.0.1/API/V1/Services?limit=500&ResourceVersion=0:拨号tcp 127.0.0.1:443:Connect:connection拒绝E0915:获取https:--127.0.0.1/apis/apps/v1/replicasets?limit=500&resourceversion=0:拨号tcp 127.0.0.1:443:connect:拒绝连接E0915 21:52:44.707581反射器。Go:126]K8S.io/client-go/informers/factory.Go:133:未能列出*v1.StorageClass:Get https:--127.0.0.1/apis/storage.k8s.io/v1/StorageClass?limit=500和ResourceVersion=0:拨号tcp 127.0.0.1:443:connect:连接拒绝E0915 21:52:44.708599 1 reflector.Go:126]K8S.io/client-go/informers/factory.Go:133:未能列出*v1.=0:拨号tcp 127.0.0.1:443:Connect:connection拒绝E0915 21:52:44.709687 1 reflector.go:126]K8S.io/client-go/informers/factory.go:133:未能列出*v1.statefulset:Get https:--127.0.0.1/apis/apps/v1/statefulsets?limit=500&resourceVersion=0:拨号tcp 127.0.0.1:443:Connect:connection拒绝E0915 21:52:44.710744 1 Laim:Get https:--127.0.0.1/api/v1/persistentvolumeClaims?limit=500&resourceversion=0:拨号tcp 127.0.0.1:443:connect:拒绝连接E0915 21:52:44.711879 1 reflector.go:126]K8S.io/kubernetes/cmd/kube-scheduler/app/server.go:223:未能列出*v1.pod:Get https:--127.0.0.1/api/v1/pods?fieldselector=status.阶段%21%3d失败%2cstatus.阶段%21%3d成功&limit=500&resourceversion=0:拨号tcp 127.0.0.1:443:连接:拒绝连接E0915 21:52:44.712903 1预算:获取https:--127.0.0.1/apis/policy/v1beta1/podddisruptionbudgets?limit=500&resourceversion=0:拨号tcp 127.0.0.1:443:connect:连接被拒绝
我发现kube-apiserver证书
/etc/kubernetes/pki/kube-apiserver/etcd-client.crt
已于2020年7月过期。与etcd-manager-main和events相关的其他过期证书很少(这两个地方的证书副本相同),但我在清单文件中没有看到这一点。
我搜索并找到了续订证书的步骤,但大多数都使用“kubeadm init phase”命令,但我在主服务器上找不到kubeadm,证书名称和路径与我的设置不同。因此,我使用openssl for kube-apiserver使用现有ca证书生成了一个新证书,并使用openssl.cnf文件包含了带有内部和外部IP地址(ec2实例)的DNS名称和环回IP地址。我用相同名称
/etc/kubernetes/pki/kube-apiserver/etcd-client.crt
替换了新证书。
之后,我重新启动了kube-apiserver docker(它一直在退出),并重新启动了Kubelet。现在证书过期消息没有到来,但是kube-apiserver正在不断地重新启动,我认为这是kube-controller和kube-scheduler docker容器上错误的原因。
替换证书后,我还没有重新启动主服务器上的docker。
注意:我们所有的生产吊舱都运行在工作节点上,所以它们不受影响,但我不能管理它们,因为我不能使用Kubectl连接。
现在,我不确定是什么问题,为什么库贝-apiserver不断重启。
9月16日08:10:16 IP-xxx-xx-xx-xx-xx kubelet[388]:E0916 08:10:16.095615 388 kubelet.go:2244]未找到节点“IP-xxx-xx-xx-xx-xx-xx-xx-xx-compute.internal”
9月16日08:10:16 ip-xxx-xx-xx-xx kubelet[388]:E0916 08:10:16.130377 388 kubelet.go:2170]容器运行时网络未就绪:networkready=false原因:networkpluginnotready消息:docker:网络插件未就绪:Kubenet没有netconfig。这很可能是由于缺少PodCIDR
9月16日08:10:16 ip-xxx-xx-xx-xx Kubelet[388]:E0916 08:10:16.147390 388反射器.go:126]K8S.IO/Client-Go/Informers/Factory.go:133:未能列出*v1beta1.csidriver:Get https:--127.0.0.1/apis/storage.k8s.io/v1beta1/csidrivers?limit=500&resourceversion=0:拨号tcp 127.0.0.1:443:连接:拒绝连接
9月16日08:10:16 IP-xxx-xx-xx-xx-xx kubelet[388]:E0916 08:10:16.195768 388 kubelet.go:2244]节点“IP-xxx-xx-xx-xx-xx-xx-xx-xx-xx-xx-compute.internal”找不到
9月16日08:10:16 IP-xxx-xx-xx-xx-xx kubelet[388]:E0916 08:10:16.295890 388 kubelet.go:2244]节点“IP-xxx-xx-xx-xx-xx-xx-xx-xx-xxx-x.compute.internal”找不到
9月16日08:10:16 ip-xxx-xx-xx-xx kubelet[388]:E0916 08:10:16.347431 388 reflector.go:126]K8S.io/client-go/informers/factory.go:133:未能列出*v1beta1.runtimeClass:Get https://127.0.0.1/apis/node.k8s.io/v1beta1/runtimeClasses?limit=500&resourceVersion=0:拨号tcp 127.0.0.1:443:连接:拒绝连接
这个集群(以及其他3个集群)是使用KOPS设置的。其他集群运行正常,看起来它们也有一些过期的证书。设置集群的人无法发表评论,我对Kubernetes的经验有限。因此需要古鲁的协助。
非常感谢任何帮助。
非常感谢。
root@ip-xxx-xx-xxx-xxx:~#
docker logs
W0916 14:42:40.294576 8316 peers.go:215]来自对等通信的意外错误:无法连接到对等方etcd-events-a I0916 14:42:41.106654 8316 controller.go:173]启动控制器迭代W0916 14:42:41.106692 8316 controller.go:149]运行etcd群集协调循环时出现意外错误:在使用TLS策略连接到对等方“etcd-events-a”的对等方列表[]I0916 14:42:45.294682 8316 peers.go:281]中找不到自己的“etcd-events-a”,servername=“etcd-manager-server-etcd-events-a”W0916 14:42:45.297094 8316 peers.go:325]无法grpc-ping发现对等点xxx.xx.xx.xxx:3997:rpc错误:code=不可用desc=所有子conn处于过渡状态失败I0916 14:42:45.297117 8316 peers.go:347]无法连接到对等点etcd-events-a:Map[xxx.xx.xx.xx:3997:true]I0916 14:42:46.791923 8316 volumes.go:85]AWS API请求:EC2/DescribEvolumes I0916 14:42:46.856548 8316 volumes.go:85]AWS API请求:EC2/DescribeInstances I0916 14:42:46.945119 8316 hosts.go:84]主机更新:primary=map[],fallbacks=map[etcd-events-a.internal.xxxx.xxxx.com:[xxx.xx.xx.xx.xx.xx]],final=map xxxx.xxxxx.com]]I0916 14:42:50.297264 8316 peers.go:281]用TLS策略连接到对等点“etcd-events-a”,servername=“etcd-manager-server-etcd-events-a”W0916 14:42:50.300328 8316 peers.go:325]无法GRPC-ping发现对等点xxx.xx.xx.xx:3997:rpc错误:code=不可用desc=所有子Conns都处于过渡状态I0916 14:42:50.300348 8316 peers.go:347]无法连接到对等xx.xx.xx.xx:3997:true]W0916 14:42:50.300360 8316 peers.go:215]来自对等方Intercommunications的意外错误:无法连接到对等方etcd-事件-a
你能建议一下从这里开始怎么做吗?
非常感谢。
使用openssl为kube-apiserver生成一个新的证书并替换证书和密钥,使kube-apiserver docker处于稳定状态,并通过Kubectl提供访问。
要解决etcd-manager证书问题,请将etcd-manager-main和etcd-manager-events都升级到kopeio/etcd-manager:3.0.20200531
,请参见https://github.com/kubernetes/kops/issues/8959#issuecomment-673515269
谢谢。
使用静态分析工具识别代码味道 重构是公认的改进现有代码的好方法。然而,如何通过一种一致且可重复的方式 找到需要重构的代码呢?本期的 让开发自动化阐述了如何使用静态分析工具来识别需要重构的代码味道,并举例说明了如何改进坏味道代码。 在过去的几年里,我曾看过很多项目的大量源代码,从精美的设计到像是用胶带绑定到一起的代码。我写过新的代码也维护过其他开发人员的源代码。我喜欢编写新的代码,但也喜欢采用一些现
问题内容: 在Go中精确测量持续时间的正确方法是什么?大多数应用程序仅使用标准时间包和以下方法: 但是,返回当前系统时间,这导致两个缺陷: 如果在测量过程中更改了系统时间(例如,由于 时区更改 (DST)或 leap秒 ),则所产生的持续时间也是错误的。 系统时间可能故意比实时时间变慢或变慢。当操作系统将内部时钟与NTP时间服务器同步时,通常会发生这种情况(每小时可能发生几次!) 从MSDN: [
当我运行Kubedns的部署时,它会成功启动,但在运行时间的8分钟后,它会被删除。当它运行时,它可以很好地解决dns请求。还有人经历过这种事吗?我开始在其他随机部署中看到这一点。 在删除Kubedns之前:
它们还提供了一个警告:如果您能够持续部署到测试系统,有时也会使用术语“持续部署”。 这一切让我很困惑。任何更详细的解释(或附带一个例子)都是赞赏的!
translated_page: https://github.com/PX4/Devguide/blob/master/en/test_and_ci/continous_integration.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e PX4 Continuous Integration PX4 builds and
我们做的还不够好,先占个坑。 欢迎贡献章节。