一,需求

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. NumberFormat类的用法

    NumberFormat.getInstance()方法返回NumberFormat的一个实例(实际上是NumberFormat具体的一个子类,例如DecimalFormat), 这适合根据本地设置格 ...

  2. 理解jar

    对于大多数 Java 开发人员来说,JAR 文件及其 “近亲” WAR 和 EAR 都只不过是漫长的 Ant 或 Maven 流程的最终结果.标准步骤是将一个 JAR 复制到服务器(或者,少数情况下是 ...

  3. python 中颜色的表示

    字背景颜色范围:40----49 40:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色 字颜色:30-----------39 30:黑 31:红 32:绿 33 ...

  4. ovs-agent流程

    1. 代码流程分析 neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:main() plugin = OVSNeutronAgent(**a ...

  5. hdu3613 扩展KMP

    #include<stdio.h> #include<string.h> #define maxn 501000 char s[maxn],t[maxn]; int next[ ...

  6. 【poj1804】 Brainman

    http://poj.org/problem?id=1804 (题目链接) 题意 求逆序对 Solution1 归并排序. 每次合并时计算逆序对.  代码1 // poj1804 #include&l ...

  7. ECSHOP \admin\edit_languages.php GETSHELL Based On Injection PHP Code Into /languages/zh_cn/user.php

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对于很多CMS网站来说,它们都需要保存很多的网站META信息,最常用的最佳实践是以 ...

  8. HackerRank and MiniMax

    传送门 Sherlock and MiniMax Authored by darkshadows on May 07 2014 Problem Statement Watson gives Sherl ...

  9. Java初学(五)

    一.成员变量和局部变量区别(成员变量默认为包内访问权限,即使是子类,不在一个包内也无法访问) 1.在类中的位置不同 成员变量:在类中方法外: 局部变量:在方法定义中或者方法声明上 2.在内存中的位置不 ...

  10. mysql union 详解

    Union:作用:把2次或多次查询结果合并起来要求:两次查询的列数一致推荐:查询的每一列,相对应的列类型也一样 可以来自于多张表 多次sql语句取出的列名可以不一致,此时,以第1个sql的列名为准 例 ...