Kubernetes网络部署方案

现在网络上流传很多Kubernetes的部署和搭建的文档,其中比较出名就是Kubernetes The Hard Way

(https://github.com/kelseyhightower/kubernetes-the-hard-way),还有基于这个翻译和衍生的版本follow-me-install-kubernetes-cluster

(https://github.com/opsnull/follow-me-install-kubernetes-cluster),这两篇文章带我走过了Kubernetes的搭建的童年,我第一搭建成功就是抄袭的张俊的follow-me-install-kubernetes-cluster,然后随着新版的发展,越来越多的配置参数存在各种各样的问题,最大的问题是在CNI产生后,两篇文章的配置参数和系统默认或者CNI配置参数有稍微的冲突导致很多人在利用CNI做网络方案的时候会出现很多问题,这篇文章目的第一是向两位前辈致敬,第二是共享下在Flanneld和Calico部署过程中遇到挫折和问题。

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

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

转载声明:本文转载自「Docker」,搜索「dockerone」即可关注。

《Linux云计算及运维架构师高薪实战班》2018年03月26日即将开课中,120天冲击Linux运维年薪30万,改变速约~~~~

*声明:推送内容及图片来源于网络,部分内容会有所改动,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

- END -


原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2018-03-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

11g备库无法开启ADG的原因分析 (r7笔记第62天)

今天碰到一个有些奇怪的问题,但是奇怪的现象背后都是有本质的因果。 下午在做一个环境的检查时,发现备库是在mount阶段,这可是一个11gR2的库,没有ADG实在...

3924
来自专栏CodeSheep的技术分享

利用K8S技术栈打造个人私有云(连载之:K8S集群搭建)

最近被业务折腾的死去活来,实在没时间发帖,花了好多个晚上才写好这篇帖子,后续会加油的!

44912
来自专栏Netkiller

hyperledger v1.0.5 区块链运维入门

hyperledger v1.0.5 区块链运维入门 摘要 你网上搜索hyperledger大部分文章是讲解开发环境的安装与配置,没有一篇关于怎样运维区块链的文...

5068
来自专栏IT笔记

SpringBoot开发案例之微信小程序录音上传

前言 书接上回的《SpringBoot开发案例之微信小程序文件上传》,正常的业务流程是,口语测评需要学生通过前端微信小程序录入一段音频,通过调用第三方音频处理服...

1.4K8
来自专栏沃趣科技

Oracle 12c ASM专题|Flex磁盘组到底有多Fexible?

原文链接 https://martincarstenbach.wordpress.com/2017/08/22/12-2-new-feature-the-fle...

3626
来自专栏向治洪

多线程下载

楼主三年磨剑(当然不是磨着一把剑),倾血奉献Android多线程下载Demo。有的人就问了“怎么写来写去还是Demo?”,因为老哥我实在太忙了, 每天写一点...

1928
来自专栏杨建荣的学习笔记

一条细小的报警短信的处理(r6笔记第96天)

最近偶尔会收到一封报警短信,提示内容大体如下, xxxx,trc_directory (TNS-1190),log_directory(TNS-1190),Pl...

3758
来自专栏轻量级微服务

Kubernetes Dynamic Volume Provisioning - NFS Provisioner

场景:在 非 Master 节点 添加了 1T 的磁盘,挂载到 /mnt 路径,然后实现在此存储上动态创建 PVC。

1090
来自专栏杨建荣的学习笔记

三封报警邮件的分析(r6笔记第95天)

今天收到3封报警邮件,从邮件内容中的报警情况来看,还是比较反常的。需要引起关注,找到原因处理。 这个库是一个历史库,库中的数据非常庞大,几十亿数据的表还是有好几...

2844
来自专栏Kubernetes

原 荐 Flannel是如何工作的

Author: xidianwangtao@gmail.com 概述 最近我们的TaaS平台遇到很多的网络问题,事实证明“contiv + ovs + v...

1.5K11

扫码关注云+社区

领取腾讯云代金券