一,需求

Kubernetes官方推荐的是Flannel,但是Flannel是一个overlay的网络,对性能会有一定的影响。Calico恰好能解决一下overlay网络的不足。
Calico在Kubernetes上是以plugin的方式运行的,即calico会检测Kubernetes对于pod或者service的操作,来控制ip的分配和回收。
 

二,准备

主要参考:
 
1,三台主机:centos
    10.11.151.97 Kubernetes Master
    10.11.151.100 node1
    10.11.151.101 node2
     在/etc/hosts中添加这三台主机:
     10.11.151.97 tc-151-97
2,Master:
     kube-apiserver
     kube-controller-manager
     kube-scheduler
     etcd
     docker
     calico-node image
 
    Nodes:
      kube-proxy
      kubelet
      docker
      calico-node image
      etcd
      iperf image
      calicoctl (https://github.com/projectcalico/calico-docker/releases)目前最新版本0.12.0
      calico-Kubernetes plugin(https://github.com/projectcalico/calico-kubernetes/releases/tag/v0.6.0)目前最新版本0.6.0
 

三,建立Etcd Cluster

三台主机建立一个Etcd cluster。在97上运行的脚本为:
#!/bin/sh
export localip=10.11.151.97
export name=bjcnctest0
export port1=
export port2=
export port3= sudo ./etcd \
-name $name \
-initial-advertise-peer-urls http://$localip:$port1 \
-listen-peer-urls http://0.0.0.0:$port1 \
-listen-client-urls http://0.0.0.0:$port2,http://0.0.0.0:$port3 \
-advertise-client-urls http://$localip:$port2,http://$localip:$port3\
-initial-cluster-token etcd-cluster \
-initial-cluster bjcnctest0=http://$localip:$port1,bjcnctest1=http://10.11.151.100:$port1,bjcnctest2=http://10.11.151.101:$port1 \
-initial-cluster-state new &

三台主机上分别运行etcd,组建好cluster,正确组建后,每个主机应该看到published name

 

四,设置Master

运行kube-apiserver:

./kube-apiserver --logtostderr=true --v= --etcd_servers=http://127.0.0.1:2379 --kubelet_port=10250 --allow_privileged=false --service-cluster-ip-range=172.16.0.0/12 --insecure-bind-address=0.0.0.0 --insecure-port=8080 2>&1 >apiserver.out &

kube-controller-manager:

./kube-controller-manager --logtostderr=true --v= --master=http://tc-151-97:8080 --cloud-provider="" 2>&1 >controller.out &

kube-scheduler:

./kube-scheduler --logtostderr=true --v= --master=http://tc-151-97:8080 2>&1 > scheduler.out &

在Master上运行Calico服务:

./calicoctl node --ip=10.11.151.97

用docker ps可以看到Calico node的container

Master上的运行比较简单。
 
五,Nodes
Kubernetes在使用Calico的试试可以有两种IP的分配方式,第一种是使用docker网桥ip地址段进行分配,另外一种是用Calico IPAM来进行分配。
下面以第一种进行描述:
在10.11.151.100上的操作为

1,新建一个网桥cbr0:

vi /etc/sysconfig/network-scripts/ifcfg-cbr0
-----------------------
DEVICE=cbr0
TYPE=Bridge
IPADDR=172.1.0.0
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=static

这里给出一个ip地址段172.1.0.0/24,每个主机上可以使用256个IP。

如果当前主机上已经运行了docker,先停止:systemctl stop docker
重新启动docker的时候将docker使用自己新建的网桥:
vi /usr/lib/systemd/system/docker.service
在/usr/bin/docker daemon的启动参数中添加“--bridge=cbr0 --iptables=false --ip-masq=false”
尽量不要影响原本的docker配置。重新开启docker:systemctl start docker
用ifconfig可以看到一个cbr0的网络。
在101主机上换个一个IP段,比如172.1.1.0。

2,运行Calico服务

./calicoctl node --ip=10.11.151.100

3,将calico-kubernetes插件放到kubernetes使用插件的位置,重命名:

mv calico-kubernetes /usr/libexec/kubernetes/kubelet-plugins/net/exec/calico/calico
chmod +x /usr/libexec/kubernetes/kubelet-plugins/net/exec/calico/calico

4,安装Kubernetes

运行kube-proxy:
KUBE_API_ROOT=http://10.11.151.97:8080/api/v1/ ./kube-proxy --logtostderr=true --v=0 --master=http://tc-151-97:8080 --proxy-mode=iptables &

这里KUBE_API_ROOT变量会传递给Calico,calico可以通过master的api去获取当前的pod或者node信息。

运行kubelet:
CALICO_IPAM=false KUBE_API_ROOT=http://10.11.151.97:8080/api/v1/ ./kubelet --logtostderr=true --v=0 --api_servers=http://tc-151-97:8080 --address=0.0.0.0 --network-plugin=calico --allow_privileged=false --pod-infra-container-image=10.11.150.76:5000/kubernetes/pause:latest > a.txt &

CALICO_IPAM=false是指定Calico的网络ip分配使用docker的网桥ip地址段,也就上上面我们自己新建的cbr0的网段。

----------------------------------插入开始------------------------------------------
这里插入使用另外一种IP分配方式的方法
如果CALICO_IPAM设置为true(calico plugin从0.5.0以后默认为true)那么会从calico的pool中去获取ip地址段。而会忽略docker0的网桥IP设置。
使用命令查看当前有的ip pool:
./calicoctl pool show
用remove命令删除不用的IP pool,用add的方式添加IP pool。
./calicoctl pool add 172.0.0.0/8 --nat-outgoing
这样如果使用CALICO_IPAM=true的时候运行kubelet,calico为pod分配IP会默认从pool中获取ip,获取的原则是每个主机上默认分配一个64大小的IP段,如果这个主机上使用了超过了64个,那么就会重新找到一个可以用的64的段。
-------------------------------------插入结束---------------------------------------
这里--network-plugin=calico指定kubernetes使用calico的网络,kubelet会去调用/usr/libexec/kubernetes/kubelet-plugins/net/exec/calico/calico插件,接管kubelet的ip分配任务。
可以在/var/log/calico/kubernetes/calico.log查看calico插件的日志,看看是不是异常。
到此,NODE的配置创建成功。
在101上同样配置一下kubernetes。
 

六,测试一下

我们循环创建1个pod在100上,1个pod在101上:
test.yaml:
apiVersion: v1
kind: ReplicationController
metadata:
name: test-
spec:
replicas:
template:
metadata:
labels:
app: test-
spec:
containers:
- name: iperf
image: 10.11.150.76:/openxxs/iperf:1.2
nodeSelector:
kubernetes.io/hostname: tc--

在master上:

./kubelet create -f test.yaml
在101上创建只需要把hostname改为tc-151-101。
创建完成后,使用./calicoctl endpoint show --detailed查看IP分配和endpoint情况,看看IP分配是否成功。
或者直接docker ps查看创建出来的container ID,exec进去,ip addr show看一下ip,然后ping 101上的container看看是不是成功的。

创建多点Pods吧:

test2.yaml:
apiVersion: v1
kind: ReplicationController
metadata:
name: test-
spec:
replicas:
template:
metadata:
labels:
app: test-
spec:
containers:
- name: iperf
image: 10.11.150.76:/openxxs/iperf:1.2
nodeSelector:
kubernetes.io/hostname: tc--

这里我们在100主机上创建70个iperf的pods。

可是!
我们发现居然只有40启动起来了!另外的30个资源分配失败。查找原因发现,kubelet默认只能最多创建40个pods。我们将kubelet重启,加上参数--max-pods=200,将最大pods数量设置为200。重新创建,70pods均创建成功。

Calico在Kubernetes中的搭建的更多相关文章

  1. Calico在Docker中的搭建

    一,Multi-host网络需求 开始之前推荐两篇文章 http://xelatex.github.io/2015/11/15/Battlefield-Calico-Flannel-Weave-and ...

  2. Kubernetes集群搭建之企业级环境中基于Harbor搭建自己的私有仓库

    搭建背景 企业环境中使用Docker环境,一般出于安全考虑,业务使用的镜像一般不会从第三方公共仓库下载.那么就要引出今天的主题 企业级环境中基于Harbor搭建自己的安全认证仓库 介绍 名称:Harb ...

  3. Kubernetes 概述和搭建(多节点)

    一.Kubernetes整体概述和架构 Kubernetes是什么 Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务.通过Kubernetes能够进行应用的自动化部署和扩缩 ...

  4. [云原生]Kubernetes - 集群搭建(第2章)

    目录 一.前置知识点 二.kubeadm部署方式介绍 三.安装要求 四.最终目标 五.准备环境 六.环境初始化 6.1 设置系统主机名以及Hosts文件的相互解析 6.2 安装依赖文件(所有节点) 6 ...

  5. kubernetes中的Pause容器如何理解?

    前几篇文章都是讲的Kubernetes集群和相关组件的部署,但是部署只是入门的第一步,得理解其中的一些知识才行.今天给大家分享下Kubernets的pause容器的作用. Pause容器 全称infr ...

  6. 关于 Kubernetes 中的 Volume 与 GlusterFS 分布式存储

    容器中持久化的文件生命周期是短暂的,如果容器中程序崩溃宕机,kubelet 就会重新启动,容器中的文件将会丢失,所以对于有状态的应用容器中持久化存储是至关重要的一个环节:另外很多时候一个 Pod 中可 ...

  7. kubernetes集群搭建(2):docker私有仓库

    kubernetes集群搭建(1):环境准备 中各节点已经安装好了docker,请确认docker已启动并正常运行 1.通过命令启动私库 docker run -d -p 5000:5000 --pr ...

  8. Kubernetes中StatefulSet介绍

    StatefulSet 是Kubernetes1.9版本中稳定的特性,本文使用的环境为 Kubernetes 1.11.如何搭建环境可以参考kubeadm安装kubernetes V1.11.1 集群 ...

  9. Kubernetes中的网络

    一.引子 既然Kubernetes中将容器的联网通过插件的方式来实现,那么该如何解决这个的联网问题呢? 如果你在本地单台机器上运行docker容器的话注意到所有容器都会处在docker0网桥自动分配的 ...

随机推荐

  1. 配置域从DNS服务器以及缓存DNS服务器

    一.域从DNS服务器的作用 我们在之前上一篇随笔里有提到,DNS服务器一般有三种类型,一个是Primary DNS Server(主DNS服务器),一个是Secondary DNS Server(从D ...

  2. java定时器的使用(Timer)

    1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等. 对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Tim ...

  3. oracle-5-的升级步骤

    升级数据库的步骤 1.决定升级到那个版本 2.确定最近的数据已经备份(非常的重要) 3.安装软件升级包 4.升级方式启动数据库 5.执行必要的脚本 6.升级后的检查

  4. iOS开发中的错误整理,关于用绑定Tag取控件的注意事项,有时候不绑定也是个错!

    如图:红色框中是个自定义的导航工具条titlesView(没有绑定Tag),工具条中有五个按钮(按钮绑定了Tag)以及一个红色的指示器indicatorView(没有绑定Tag),下面的蓝色是可以滚动 ...

  5. Ajax、反向Ajax和WebSocket 概念

    Ajax 异步的JavaScript和XML(Asynchronous JavaScript and XML,Ajax),一种可通过JavaScript来访问的浏览器功能特性,其允许脚本向幕后的网站发 ...

  6. artDialog 文档

    artDialog —— 经典.优雅的网页对话框控件. 支持普通与 12 方向气泡状对话框 完善的焦点处理,自动焦点附加与回退 支持 ARIA 标准 面向未来:基于 HTML5 Dialog 的 AP ...

  7. Oracle11g 32位安装步骤

    1.注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符.官方下地址:http://www.oracle.com/tech ...

  8. 学习笔记 --- 最大流Dinic算法

    为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...

  9. 【poj2983】 Is the Information Reliable?

    http://poj.org/problem?id=2983 (题目链接) 一个SB错误TLE了半个小时... 题意 一条直线上有n个点,给出m条信息,若为P则表示点A在点B的北方X米,若为V则表示A ...

  10. javascript设计模式-装饰模式

    装饰模式:在不改变原类(对象)和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象.在设计原则中,有一条,多用组合,少用继承,装饰模式正是这一原则的体现. UML ...