标签: kubernetes
我们为什么要使用 Kubernetes 自定义资源
Kubernetes 提供了 CRD(CustomResourceDefinitions) 这种扩展方式满足了用户增强 Kubernetes 功能的需求,我们熟悉的 Kubernetes Operator 也是基于这一机制而实现。
本文想讨论的是我们要在什么时候使用 CRD 以及为什么要使用 CRD。
Kubernetes 网络笔记
集群网络系统是 Kubernetes 的核心部分,其中 Pod 之间的通信的部分 Kubernetes 没有自己实现,而是交给了外部组件进行处理。Kubernetes 对这部分网络模型的要求是:节点上的 Pod 可以不通过 NAT 和其他任何节点上的 Pod 通信。这就需要一个跨主机的容器网络。
本篇笔记前半部分记录了 VXLAN 技术。VXLAN 全称是 Virtual eXtensible Local Area Network
,虚拟可扩展的局域网。它是一种 Overlay 技术,通过三层网络来搭建的二层网络。在笔记的后半部分,通过学习 Flannel 的源码手动搭建跨主机容器网络示例。
笔记中 vxlan 内容学习自 cizixs 的两篇博客,一篇介绍协议原理,一篇结合实践。文章写的很详细,而且深入浅出适合学习,建议读者在 vxlan 部分直接看原文。
记一次 Traefik 无法代理 MySQL 问题
Traefik 从 2.0 版本开始支持 TCP route,我也使用 Traefik 作为 kubernetes 集群的 Ingress,但是在使用过程中,发现 Traefik 为 MySQL 创建的 TCP route 无法正常工作,经过排查搜索后发现了官方人员关于这个疑惑的解答,以下截取片段:
But be careful: not all protocols based on TCP and using TLS supports the SNI routing or the passthrough. It requires the protocol supporting SNI (for instance MySQL doesn't) and doing a TLS handshake (if it is a STARTTLS, then it does not work).
虽然找到了问题是由于 MySQL 不支持,但也勾起了我的好奇心,什么是 SNI?Traefik 为什么要使用 HostSNI
创建 TCP route 呢?为什么 MySQL 不支持 SNI 呢?于是带着这些问题,我开始寻找答案。
Kubernetes Cluster Autoscaler
当我们使用 Kubernetes 部署应用后,会发现如果用户增长速度超过预期,以至于计算资源不够时,你会怎么做呢?Kubernetes 给出的解决方案就是:自动伸缩(auto-scaling),通过自动伸缩组件之间的配合,可以 7*24 小时的监控着你的集群,动态变化负载,以适应你的用户需求。
Kubernetes 的 Dynamic Provisioning 实现
存储一直是容器运行的关键部分,Kubernetes 为此做了很多努力,从一开始的 Pod Volumes、PV(Persistent Volumes) 与 PVC(Persistent Volume Claim),到 StorageClass 与 Dynamic Provisioning,再到现在 “out-of-tree” 的 CSI(Container Storage Interface),Kubernetes 社区一直在演进存储的实现。
前面基础的就不讲了,我们从 StorageClass 与 Dynamic Provisioning 开始了解。