Kubernetes网络部署方案

本文讲的是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部署模式]

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部署模式]

其实吧,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网络部署方案

时间: 2024-11-01 12:18:02

Kubernetes网络部署方案的相关文章

网络部署方案:未来IPv6四种宽带接入分析

http://www.aliyun.com/zixun/aggregation/9485.html">IPv6包由IPv6包头(40字节固定长度).扩展包头和上层协议数据单元三部分组成. IPv6包扩展包头中的分段包头(下文详述)中指名了IPv6包的分段情况.其中不可分段部分包括:IPv6包头.Hop-by-Hop选项包头.目的地选项包头(适用于中转路由器)和路由包头:可分段部分包括:认证包头.ESP协议包头.目的地选项包头(适用于最终目的地)和上层协议数据单元.但是需要注意的是,在IPv

一个适合 Kubernetes 的最佳网络互联方案

本文讲的是一个适合 Kubernetes 的最佳网络互联方案,[编者的话]本文比较了几种 Kubernetes 联网方案,包括 Flannel(aws-vpc | host-gw | vxlan)和 IPvlan .目前建议选择 flannel + host-gw 方案,没有特别依赖,性能也够用.一旦 flannel 支持 IPvlan (有自动化设置工具了),且 Linux 内核版本比较新,就可以采用 IPvlan 方案. Kubernetes 要求集群包含的每一个容器都拥有一个独立.可路由的

数据中心网络部署效率低?华为与Puppet联合方案助力提速30倍!

随着云计算.大数据.互联网业务的蓬勃发展,数据中心的规模急剧扩张.作为承载云业务的核心设施,数据中心集中了计算.存储和网络设备,业务重要级别高,资源分布集中.随着数据中心规模越来越大,运维面临巨大挑战:传统以人工操作为主的管理模式不仅难度大,且成本高昂,数据中心迫切需要灵活便捷的自动化运维解决方案. 强强联合,数据中心网络自动化方案解决部署难题 华为与IT自动化领导厂商Puppet强强联合,共同研发了数据中心网络自动化部署解决方案.Puppet CEO和创始人 Luke Kanies评价到,"传

数据中心网络部署效率低?华为与Puppet联合方案助力提速30倍!

随着云计算.大数据.互联网业务的蓬勃发展,数据中心的规模急剧扩张.作为承载云业务的核心设 施,数据中心集中了计算.存储和网络设备,业务重要级别高,资源分布集中.随着数据中心规模越来越大,运维面临巨大挑战:传统以人工操作为主的管理模式不 仅难度大,且成本高昂,数据中心迫切需要灵活便捷的自动化运维解决方案. 强强联合,数据中心网络自动化方案解决部署难题 华为与IT自动化领导厂商Puppet强强联合,共同研发了数据中心网络自动化部署解决方案. Puppet CEO和创始人 Luke Kanies评价到

DockOne微信分享(一三八):白话Kubernetes网络

本文讲的是DockOne微信分享(一三八):白话Kubernetes网络[编者的话]容器的网络是在CaaS集群中无法避免的话题,作为当下最主流的一种容器集群解决方案,Kubernetes对网络进行了合理的抽象,并采用了开放的CNI模型.面对各种容器网络实现,他们有什么不同,应该如何选择?本文将带大家回顾Kubernetes各种主流网络方案的发展历程,并透过现象清本质,用形象的例子展示Weave.Flannel.Calico和Romana等网络解决方案背后的原理. [3 天烧脑式基于Docker的

Kubernetes网络概述

[编者的话]本文比较了Kubernetes和Docker的网络模型,并对Kubernetes的网络模拟做了重点阐述,对Kubernetes的网络插件作了比较. 本文讲的是Kubernetes网络概述容器编排技术是当今最火的IT技术之一.不可否认,Docker技术促进了数据中心的发展,并为微服务架构在开发和运维中的实践奠定了基础. 工作在Sun公司的John Gage 曾说:" 网络就是计算机." 为了能充分发挥计算机的功能,必须让计算机之间互相连接.因此,除非你的服务是简单的并且不需要

DockOne微信分享(一三三):深入理解Kubernetes网络策略

本文讲的是DockOne微信分享(一三三):深入理解Kubernetes网络策略[编者的话]当我们逐渐向着微服务.云原生迈进的时候,传统静态的.相对简单的网络安全策略开始显得吃力. Kubernetes 的 Network Policy 特性正是来解决这个问题的.在刚刚出炉不久的1.7版本中,该特性也被扶正成为GA.让我们来一起看看 Network Policy 是什么,能为我们做什么,以及是如何实现的. [3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站]本次培训围绕基于Dock

黑客级Kubernetes网络指南

本文讲的是黑客级Kubernetes网络指南[编者的话]作者Yaron Haviv,Iguazio的CTO. 对于集群的要求指标不同,对于Kubernetes网络他们具有自己独特的方法论,此文是系列文章的第一篇,是Iguazio对于Kubernetes网络的一种处理方法说明. [深圳站|3天烧脑式Kubernetes训练营]培训内容包括:Kubernetes概述.架构.日志和监控,部署.自动驾驶.服务发现.网络方案等核心机制分析,进阶篇--Kubernetes调度工作原理.资源管理及源码分析等.

多媒体网络教室软件网络部署解决方案

摘要:由于多媒体网络教室的学生机软件环境基本相同,因此利用现有教室的网络环境,运用Symantec Ghost 7.5 Corporate Edition的网络数据传输功能和Microsoft Windows 2000 Server/Professional 的软件网络部署功能和自动管理功能,来完成各种软件自动的网络部署和管理.使用这种解决方案将把机械的.复杂的人力部署改为计算机自动的网络部署和管理,着重对软件部署的设计和特点进行分析.此外,还对今后添加.删除和更新软件的实现进行详细的讨论. 关