Kubernetes网络部署方案

简介: 本文讲的是Kubernetes网络部署方案【编者的话】现在网络上流传很多Kubernetes的部署和搭建的文档,其中比较出名就是Kubernetes The Hard Way,还有基于这个翻译和衍生的版本follow-me-install-kubernetes-cluster,这两篇文章带我走过了K...
本文讲的是 Kubernetes网络部署方案【编者的话】现在网络上流传很多Kubernetes的部署和搭建的文档,其中比较出名就是 Kubernetes The Hard Way,还有基于这个翻译和衍生的版本 follow-me-install-kubernetes-cluster,这两篇文章带我走过了Kubernetes的搭建的童年,我第一搭建成功就是抄袭的张俊的follow-me-install-kubernetes-cluster,然后随着新版的发展,越来越多的配置参数存在各种各样的问题,最大的问题是在CNI产生后,两篇文章的配置参数和系统默认或者CNI配置参数有稍微的冲突导致很多人在利用CNI做网络方案的时候会出现很多问题,这篇文章目的第一是向两位前辈致敬,第二是共享下在Flanneld和Calico部署过程中遇到挫折和问题。

【烧脑式Kubernetes实战训练营】本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理、Kubernetes DNS与服务发现、基于Kubernetes和Jenkins的持续部署方案 、Kubernetes网络部署实践、监控、日志、Kubernetes与云原生应用、在CentOS中部署Kubernetes集群、Kubernetes中的容器设计模式、开发Kubernetes原生应用步骤介绍等。

为啥只说明以下两种方案的部署模式,因为其他网络方案不争气。

Flanneld [Systemd部署模式]

03.png

Flannel部署相对来说简单容易、坑少,直接上配置。

flannel.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
Before=docker.service
[Service]
Type=notify
ExecStart=/usr/local/bin/flanneld \
-etcd-cafile=/etc/kubernetes/ssl/ca.pem \
-etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem \
-etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem \
-etcd-endpoints=https://{Etcd IP}:2379 \
-iface=ens3 \
--ip-masq
Restart=on-failure
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service 

记住一定要提前在etcd把你的backend写进去。

HOST-GW的配置:
etcdctl \
--endpoints=https://{Etcd-IP}:2379 \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
set /coreos.com/network/config '{"Network":"'10.200.0.0/16'", "SubnetLen": 24, "Backend": {"Type":"host-gw"}}' 

VXLAN的配置:
etcdctl \
--endpoints=https://{Etcd-IP}:2379 \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
set /coreos.com/network/config '{"Network":"'10.200.0.0/16'", "SubnetLen": 24, "Backend": {"Type":"vxlan"}}' 

然后可以开始你的表演,如果你创建2个pod,互ping一下发现不通,你部署DNS服务,一直报错no route to host(就是Kubernetes那个SVC对应的IP),恭喜你,你下面要做的就是:
iptables -P FORWARD ACCEPT

因为1.13版本以上Docker好似在iptable写了这么一条策略:
iptables -P FORWARD DROP 

到此为止你起来Flanneld就可以开始你的Kubernetes之旅,当然现在好似还不行记得在/etc/cni/net.d下写一个.conf结尾的文件,当然叫什么名字无所谓。etc:

10-flanneld-cni.conf
{
  "name": "cbr0",
  "type": "flannel",
  "delegate": {
    "isDefaultGateway": true
  }
} 

然后继续你的表演就可以了。

Calico [Systemd部署模式]

01.png

其实吧,Calico在Kubernetes网络方案用用的比Flanneld多,Calico懂得玩伸缩,技术也比较牛,在很多物理设备不开启BGP的情况下做了折中,用的IP-IP虽然性能有点损失,在云上被大面积使用。Flanneld的host-gw模式性能虽然不错,但是只能在2层玩下,过了二层路由被重写就GG了。

开始表演IP-IP模式。

第一步创建IPpool,pool就是所有calico分配ip的池子,其实就是Kubernetes的pool,不过Calico分配出来是/26的IP,一下少很多。其实我觉得/26比较符合机器配置的现状至少,不会造成IP的浪费。

设置pool

calicoctl apply -f - << EOF
apiVersion: v1
kind: ipPool
metadata:
cidr: 10.200.0.0/16
spec:
ipip:
enabled: true
mode: cross-subnet
nat-outgoing: true
EOF 

部署calico-node(其实就2个文件)

calico.env
ETCD_ENDPOINTS="https://{ETCD1}:2379,https://{ETCD2}:2379"
ETCD_CA_FILE="/etc/kubernetes/ssl/ca.pem"
ETCD_CERT_FILE="/etc/kubernetes/ssl/kubernetes.pem"
ETCD_KEY_FILE="/etc/kubernetes/ssl/kubernetes-key.pem"
CALICO_NODENAME="node46"
CALICO_NO_DEFAULT_POOLS=""
CALICO_IP="{HOST-IP}"
CALICO_IP6=""
CALICO_AS=""
CALICO_LIBNETWORK_ENABLED=true
CALICO_NETWORKING_BACKEND=bird 

calico.service
[Unit]
Description=calico-node
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/calico/calico.env
ExecStartPre=-/usr/bin/docker rm -f calico-node
ExecStart=/usr/bin/docker run --net=host --privileged \
--name=calico-node \
-e NODENAME=${CALICO_NODENAME} \
-e IP=${CALICO_IP} \
-e IP6=${CALICO_IP6} \
-e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} \
-e CALICO_STARTUP_LOGLEVEL=DEBUG \
-e NO_DEFAULT_POOLS=${CALICO_NO_DEFAULT_POOLS} \
-e FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT \
-e CALICO_LIBNETWORK_ENABLED=${CALICO_LIBNETWORK_ENABLED} \
-e ETCD_ENDPOINTS=${ETCD_ENDPOINTS} \
-e ETCD_CA_CERT_FILE=/etc/kubernetes/ssl/ca.pem \
-e ETCD_CERT_FILE=/etc/kubernetes/ssl/kubernetes.pem \
-e ETCD_KEY_FILE=/etc/kubernetes/ssl/kubernetes-key.pem \
-v /var/log/calico:/var/log/calico \
-v /run/docker/plugins:/run/docker/plugins \
-v /lib/modules:/lib/modules \
-v /var/run/calico:/var/run/calico \
-v /etc/kubernetes/ssl/:/etc/kubernetes/ssl/:ro \
quay.io/calico/node:v2.4.0

ExecStop=-/usr/bin/docker stop calico-node

[Install]
WantedBy=multi-user.target 

CNI配置文件(/etc/cni/net.d下随便写一个.conf结尾的文件)

calico.conf
{
"name": "k8s-pod-network",
"cniVersion": "0.1.0",
"type": "calico",
"etcd_endpoints": "https://{ETCD1},https://{ETCD2}:2379",
"etcd_key_file": "/etc/kubernetes/ssl/kubernetes-key.pem",
"etcd_cert_file": "/etc/kubernetes/ssl/kubernetes.pem",
"etcd_ca_cert_file": "/etc/kubernetes/ssl/ca.pem",
"log_level": "info",
"ipam": {
    "type": "calico-ipam"
 },
"kubernetes": {
    "kubeconfig": "/etc/kubernetes/kube-proxy.kubeconfig"
}
} 

然后你就可以装逼了,记得把CNI的组件calico-ipam放到/opt/cni/bin。

RR部署模式

其实就是在以上的基础上多部署一个RR容器。
docker run --privileged --net=host -d \
       -e IP={HOST-IP} \
       -e ETCD_ENDPOINTS=https://{ETCD}:2379 \
       -e ETCD_CA_CERT_FILE=/etc/kubernetes/ssl/ca.pem \
       -e ETCD_CERT_FILE=/etc/kubernetes/ssl/kubernetes.pem \
       -e ETCD_KEY_FILE=/etc/kubernetes/ssl/kubernetes-key.pem \
       -v /etc/kubernetes/ssl:/etc/kubernetes/ssl:ro \
       calico/routereflector:v0.4.0 

然后把这个IP写到etcd里。
curl --cacert /etc/kubernetes/ssl/ca.pem --cert 
/etc/kubernetes/ssl/kubernetes.pem --key 
/etc/kubernetes/ssl/kubernetes-key.pem -L https://{ETCD}:2379/v2/keys/calico/bgp/v1/rr_v4/{HOST-IP} -XPUT -d value="{\"ip\":\"{HOST-IP}\",\"cluster_id\":\"1.0.0.2\"} 

然后就是创建一个全局的BGPpeer。
cat << EOF | calicoctl delete -f -
apiVersion: v1
kind: bgpPeer
metadata:
peerIP: {HOST-IP}
scope: global
spec:
asNumber: 64567
EOF

关闭 node-to-node mesh。
calicoctl config set nodeToNodeMesh off 

重新启动你所有的calico-node。

附一份calicoctl的配置文件(在/etc/calico下)

calicoctl.cfg
apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
etcdEndpoints: https://{ETCD}:2379
etcdKeyFile: /etc/kubernetes/ssl/kubernetes-key.pem
etcdCertFile: /etc/kubernetes/ssl/kubernetes.pem
etcdCACertFile: /etc/kubernetes/ssl/ca.pem 

开始你的装逼之旅吧。

关于calico-bgp有硬件的自己尝试吧。

附一份非标准的kube-proxy.service

[Unit]
Description=Kubernetes Kube Proxy
Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-proxy \
--hostname-override={HOST-IP} \
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
--v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target 
    原文发布时间为: 2017-08-28
    本文作者: 尼古拉斯
    本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。
    原文标题:Kubernetes网络部署方案
    相关实践学习
    深入解析Docker容器化技术
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
    相关文章
    |
    运维 Kubernetes 前端开发
    如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
    本文深入探讨了Kubernetes网络观测的挑战与eBPF技术的应用。首先分析了传统工具在数据碎片化、上下文缺失和性能瓶颈上的局限性,接着阐述了eBPF通过零拷贝观测、全链路关联和动态过滤等特性带来的优势。文章进一步解析了eBPF观测架构的设计与实现,包括关键数据结构、内核探针部署及生产环境拓扑。实战部分展示了如何构建全栈观测系统,并结合NetworkPolicy验证、跨节点流量分析等高级场景,提供具体代码示例。最后,通过典型案例分析和性能数据对比,验证了eBPF方案的有效性,并展望了未来演进方向,如智能诊断系统与Wasm集成。
    599 0
    |
    11月前
    |
    数据采集 存储 算法
    MyEMS 开源能源管理系统:基于 4G 无线传感网络的能源数据闭环管理方案
    MyEMS 是开源能源管理领域的标杆解决方案,采用 Python、Django 与 React 技术栈,具备模块化架构与跨平台兼容性。系统涵盖能源数据治理、设备管理、工单流转与智能控制四大核心功能,结合高精度 4G 无线计量仪表,实现高效数据采集与边缘计算。方案部署灵活、安全性高,助力企业实现能源数字化与碳减排目标。
    411 0
    |
    9月前
    |
    存储 网络协议 数据库
    脑控网络设计方案
    本内容详细描述了一个虚构的“脑控通信网络”系统架构及通信流程,涵盖核心网络组成、用户开户流程、心灵感应终端注册、跨网络通信机制,以及脑控网与互联网、移动网的数据交互方式。内容包含模拟的通信协议设计、数据包标识、网络路由机制等技术细节,整体基于作者原创的设定,用于探讨未来通信的可能性。
    363 74
    |
    数据采集 数据安全/隐私保护
    脑控网络设计方案续写
    本文补充说明了普通设备通过脑控终端热点接入互联网的数据传输流程,涵盖连接认证、数据包标识、核心网绑定与编号生成、数据转发及断开连接的完整过程,详述了设备间通信、验证、路由与逻辑删除机制,完善了脑控网络与普通互联网交互的技术闭环。
    |
    存储 Kubernetes 开发工具
    使用ArgoCD管理Kubernetes部署指南
    ArgoCD 是一款基于 Kubernetes 的声明式 GitOps 持续交付工具,通过自动同步 Git 存储库中的配置与 Kubernetes 集群状态,确保一致性与可靠性。它支持实时同步、声明式设置、自动修复和丰富的用户界面,极大简化了复杂应用的部署管理。结合 Helm Charts,ArgoCD 提供模块化、可重用的部署流程,显著减少人工开销和配置错误。对于云原生企业,ArgoCD 能优化部署策略,提升效率与安全性,是实现自动化与一致性的理想选择。
    970 0
    |
    存储 Kubernetes 异构计算
    Qwen3 大模型在阿里云容器服务上的极简部署教程
    通义千问 Qwen3 是 Qwen 系列最新推出的首个混合推理模型,其在代码、数学、通用能力等基准测试中,与 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等顶级模型相比,表现出极具竞争力的结果。
    |
    传感器 算法 数据安全/隐私保护
    基于GA遗传优化的三维空间WSN网络最优节点部署算法matlab仿真
    本程序基于遗传算法(GA)优化三维空间无线传感网络(WSN)的节点部署,通过MATLAB2022A实现仿真。算法旨在以最少的节点实现最大覆盖度,综合考虑空间覆盖、连通性、能耗管理及成本控制等关键问题。核心思想包括染色体编码节点位置、适应度函数评估性能,并采用网格填充法近似计算覆盖率。该方法可显著提升WSN在三维空间中的部署效率与经济性,为实际应用提供有力支持。
    |
    存储 Kubernetes 监控
    K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
    总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
    1257 33
    |
    安全 网络安全 定位技术
    网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
    总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
    401 22
    |
    人工智能 运维 监控
    阿里云携手神州灵云打造云内网络性能监测标杆 斩获中国信通院高质量数字化转型十大案例——金保信“云内网络可观测”方案树立云原生运维新范式
    2025年,金保信社保卡有限公司联合阿里云与神州灵云申报的《云内网络性能可观测解决方案》入选高质量数字化转型典型案例。该方案基于阿里云飞天企业版,融合云原生引流技术和流量“染色”专利,解决云内运维难题,实现主动预警和精准观测,将故障排查时间从数小时缩短至15分钟,助力企业降本增效,形成可跨行业复制的数字化转型方法论。
    770 6

    推荐镜像

    更多