0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kubernetes网络部署方案

马哥Linux运维 来源:未知 作者:李倩 2018-03-21 16:18 次阅读

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

还有基于这个翻译和衍生的版本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 agentAfter=network.targetAfter=network-online.targetWants=network-online.targetBefore=docker.service[Service]Type=notifyExecStart=/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-masqRestart=on-failure[Install]WantedBy=multi-user.targetRequiredBy=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 - << EOFapiVersion: v1kind: ipPoolmetadata:cidr: 10.200.0.0/16spec:ipip:enabled: truemode: cross-subnetnat-outgoing: trueEOF

部署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=trueCALICO_NETWORKING_BACKEND=bird

calico.service[Unit]Description=calico-nodeAfter=docker.serviceRequires=docker.service[Service]EnvironmentFile=/etc/calico/calico.envExecStartPre=-/usr/bin/docker rm -f calico-nodeExecStart=/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.0ExecStop=-/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: v1kind: bgpPeermetadata:peerIP: {HOST-IP}scope: globalspec:asNumber: 64567EOF

关闭 node-to-node mesh。

calicoctl config set nodeToNodeMesh off

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

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

calicoctl.cfg

apiVersion: v1kind: calicoApiConfigmetadata:spec:etcdEndpoints: https://{ETCD}:2379etcdKeyFile: /etc/kubernetes/ssl/kubernetes-key.pemetcdCertFile: /etc/kubernetes/ssl/kubernetes.pemetcdCACertFile: /etc/kubernetes/ssl/ca.pem

开始你的装逼之旅吧。

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

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

[Unit]Description=Kubernetes Kube ProxyDocumentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]ExecStart=/usr/local/bin/kube-proxy --hostname-override={HOST-IP} --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig --v=2Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.target

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网络
    +关注

    关注

    14

    文章

    7545

    浏览量

    88719
  • kubernetes
    +关注

    关注

    0

    文章

    224

    浏览量

    8709

原文标题:Kubernetes网络部署方案

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Kubernetes 网络模型如何实现常见网络任务

    Kubernetes 是为运行分布式集群而建立的,分布式系统的本质使得网络成为 Kubernetes 的核心和必要组成部分,了解 Kubernetes
    的头像 发表于 10-08 11:32 1060次阅读

    Kubernetes的Device Plugin设计解读

    摘要: Kubernetes的生态地位已经确立,可扩展性将是其发力的主战场。异构计算作为非常重要的新战场,Kubernetes非常重视。而异构计算需要强大的计算力和高性能网络,需要提供一种统一的方式
    发表于 03-12 16:23

    Kubernetes Ingress 高可靠部署最佳实践

    摘要: 在Kubernetes集群中,Ingress作为集群流量接入层,Ingress的高可靠性显得尤为重要,今天我们主要探讨如何部署一套高性能高可靠的Ingress接入层。简介
    发表于 04-17 14:35

    阿里云宣布推出Serverless Kubernetes服务 30秒即可完成应用部署

    ,而是更专注在编写应用程序逻辑上。据悉,在Serverless Kubernetes模式下,开发者只需指明应用容器镜像、CPU和内存需求,选定对外服务模式,即可直接启动应用程序,敏捷便利部署于包括web
    发表于 05-03 15:38

    阿里云容器Kubernetes监控(二) - 使用Grafana展现Pod监控数据

    摘要: 简介 在kubernetes的监控方案中,Heapster+Influxdb+Grafana的组合相比prometheus等开源方案而言更为简单直接。而且Heapster在
    发表于 05-10 15:28

    再次升级!阿里云Kubernetes日志解决方案

    摘要: 今天阿里云Kubernetes日志解决方案再次升级,为您带来以下改进: 1、极致部署体验:只需一条命令一个参数即可完成整个K8S集群的日志解决方案
    发表于 05-28 19:08

    不吹不黑,今天我们来聊一聊 Kubernetes 落地的三种方式

    ,没有标准的套路,只有符合自己的方案。例如美团点评结合自己已有的设施在 Kubernetes 上构建了 HULK2.0 系统,在存储、网络、负载生命周期管理以及应用监控等方面做了本地化改造,但是仍然保持
    发表于 10-12 16:07

    kubernetes部署与应用

    kubernetes运维笔记
    发表于 10-25 13:08

    kubernetes v112二进制方式集群部署

    kubernetes v112 二进制方式集群部署
    发表于 05-05 16:30

    请问鸿蒙系统上可以部署kubernetes集群吗?

    鸿蒙系统上可以部署kubernetes集群吗
    发表于 06-08 11:16

    如何部署基于Mesos的Kubernetes集群

    kubernetes是一个跨多个计算节点的管理容器化应用的系统,它提供了一系列基本的功能,如应用的自动化部署,维护和扩展等。Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统
    发表于 10-09 18:04 0次下载
    如何<b class='flag-5'>部署</b>基于Mesos的<b class='flag-5'>Kubernetes</b>集群

    如何解决Kubernetes部署故障及技巧

    Kubernetes资源配置中的错误,例如在部署(Deployment)和服务(Service)里。
    发表于 05-04 07:12 642次阅读
    如何解决<b class='flag-5'>Kubernetes</b>中<b class='flag-5'>部署</b>故障及技巧

    Kubernetes网络模型的基础知识

    Kubernetes 是为运行分布式集群而建立的,分布式系统的本质使得网络成为 Kubernetes 的核心和必要组成部分,了解 Kubernetes
    的头像 发表于 07-20 09:46 1202次阅读

    Kubernetes的集群部署

    Kubeadm是一种Kubernetes集群部署工具,通过kubeadm init命令创建master节点,通过 kubeadm join命令把node节点加入到集群中
    的头像 发表于 02-15 10:35 1714次阅读

    使用Jenkins和单个模板部署多个Kubernetes组件

    在持续集成和部署中,我们通常需要部署多个实例或组件到Kubernetes集群中。通过Jenkins的管道脚本,我们可以自动化这个过程。在本文中,我将演示如何使用Jenkins Pipeline及单个
    的头像 发表于 01-02 11:40 757次阅读
    使用Jenkins和单个模板<b class='flag-5'>部署</b>多个<b class='flag-5'>Kubernetes</b>组件