记录一次KeyDB缓慢的定位过程
这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点:
1 2 3 4 5 |
# kubectl get node -o wide NAME STATUS VERSION INTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME 192.168.104.51 Ready v1.18.3 192.168.104.51 CentOS Linux 7 (Core) 3.10.0-862.3.2.el7.x86_64 docker://19.3.9 192.168.104.72 Ready v1.18.3 192.168.104.72 CentOS Linux 7 (Core) 3.10.0-862.3.2.el7.x86_64 docker://19.3.9 192.168.104.108 Ready v1.18.3 192.168.104.108 CentOS Linux 7 (Core) 3.10.0-862.3.2.el7.x86_64 docker://19.3.9 |
KeyDB通过StatefulSet管理,一共有三个实例:
1 2 3 4 5 |
# kubectl -n default get pod -o wide -l app.kubernetes.io/name=keydb NAME READY STATUS RESTARTS IP NODE keydb-0 1/1 Running 0 172.29.2.63 192.168.104.108 keydb-1 1/1 Running 0 172.29.1.69 192.168.104.72 keydb-2 1/1 Running 0 172.29.1.121 192.168.104.51 |
这三个实例:
- 由于反亲和设置,会在每个节点上各运行一个实例
- 启用Active - Active(--active-replica)模式的多主(--multi-master)复制 :每个实例都是另外两个的Slave,每个实…
IPVS模式下ClusterIP泄露宿主机端口的问题
在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务。我们尝试通过docker manifest命令(带上--insecure参数)来推送manifest时,出现TLS timeout错误。
这个Registry通过ClusterIP类型的Service暴露访问端点,且仅仅配置了HTTP/80端口。docker manifest命令的--insecure参数的含义是,在Registry不支持HTTPS的情况下,允许使用不安全的HTTP协议通信。…
阅读全文内核缺陷触发的NodePort服务63秒延迟问题
我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容器网络,集群由三个二层互通的Master节点 10.0.0.11、 10.0.0.12、 10.0.0.13组成。在访问宿主机端口为 30153的NodePort类型的Service时,出现了很有趣的现象:
- 在节点 10.0.0.11、 10.0.0.13节点上 curl http://localhost:30153,有50%几率卡住
- 在节点,100%几率卡住
- 从集群内部,访问非本节点的30153端口,畅通
- 从集群外部,访问任意节点的30153端口,畅通
三个节点本身并无差异,卡住几率不同,可能和服务的端点(Endpoint,即Pod)的分布情况有关。
NodePort服务的定义如下:
该服务的端点有两个:
可以看到,端点在10.0.0.11、10.0.0.13上分别有一个。假设容器网络存在问题,只能访问本机的Pod,则能解释前面的卡住现象 —— 10.0.0.12上没有端点,因此一直卡住。10.0.0.11、10.0.0.13分别占有50%端点,因此50%几…
阅读全文Istio中的透明代理问题
Istio的Sidecar作为一个网络代理,它拦截入站、出站的网络流量。拦截入站流量后,会使用127.0.0.1作为源地址,将流量转发给本地服务进程。本地服务进程看不到真实源IP地址。
很多应用场景下,真实源IP地址是必须的,可能原因包括:
- I…
服务网格的现状和未来
服务网格(Service Mesh)是一种微服务治理基础设施,用于控制、监测微服务之间的东西向流量。它通常由控制平面、数据平面两部分组成。其中数据平面就是伴随着业务应用部署的网络代理,控制平面则是一组独立的组件,和数据平面交互,发送控制网络流量的规则,接收…
阅读全文如何在Pod中执行宿主机上的命令
要回答标题中的疑问,我们首先要清楚,Pod是什么?
Pod的翻译叫容器组,顾名思义,是一组容器。叫做“组”是因为这些容器:
- 总是被同时调度,调度到同一节点
- 共享网络,具有相同的IP地址和端口空间,可以通过localhost相互访问
- 可以基于System…
通过ExternalDNS集成外部DNS服务
ExternalDNS项目的目的是,将Kubernetes的Service/Ingress暴露的服务(的DNS记录)同步给外部的DNS Provider。
ExternalDNS的设计思想类似于KubeDNS,都是从多种K8S API资源中推断需要生成的DNS记录。不同之处是…
阅读全文Kubefed学习笔记
集群联邦(Federation)的目的是实现单一集群统一管理多个Kubernetes集群的机制,这些集群可能是跨地区(Region),也可能是在不同公有云供应商上,亦或者是公司内部自行建立的集群。一但集群进行联邦后,就可以利用Federation API资…
阅读全文限制Pod磁盘空间用量
容器在运行期间会产生临时文件、日志。如果没有任何配额机制,则某些容器可能很快将磁盘写满,影响宿主机内核和所有应用。
容器的临时存储,例如emptyDir,位于目录/var/lib/kubelet/pods下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/var/lib/kubelet/pods/ └── ac0810f5-a1ce-11ea-9caf-00e04c687e45 # POD_ID ├── containers │ ├── istio-init │ │ └── 32390fd7 │ ├── istio-proxy │ │ └── 70ed81da │ └── zookeeper │ └── e9e21e59 ├── etc-hosts # 命名空间的Host文件 └── volumes # Pod的卷 ├── kubernetes.io~configmap # ConfigMap类型的卷 │ └── istiod-ca-cert │ └── root-cert.pem -> ..data/root-cert.pem ├── kubernetes.io~downward-api │ └── istio-podinfo │ ├── annotations -> ..data/annotations │ └── labels -> ..data/labels ├── kubernetes.io~empty-dir # Empty类型的卷 │ ├── istio-data │ └── istio-envoy │ ├── envoy-rev0.json │ └── SDS ├── kubernetes.io~rbd # RBD卷 │ └── pvc-644a7e30-845e-11ea-a4e1-70e24c686d29 # /dev/rbd0挂载到这个挂载点 ├── kubernetes.io~csi # CSI卷 └── kubernetes.io~secret # Secret类型的卷 └── default-token-jp4n8 ├── ca.crt -> ..data/ca.crt ├── namespace -> ..data/namespace └── token -> ..data/token |
持久卷的挂载点也位于/var/lib/kubelet/pods下,但是不会导致存储空间的消耗。
容…
阅读全文