一,需求

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. Code Hunters: Hello, world!

    大家好!我们是来自MSRA联合培养班的Code Hunters小组,在未来三个月时间里我们将与殷秋丰老师一起学习高级软件工程这门课. 我们小组共有五名分别来自享誉海内外的中国科学技术大学和北京航空航天 ...

  2. 使用git管理代码的心得

    一.简易使用流程 首先下载安装git,点击Git Bash进入编辑界面,之后如下图进入目录并通过命令 git init 把这个目录变成git可以管理的仓库 接下来使用git add .命令将所有文件添 ...

  3. oracle-2-sql数据操作和查询

    主要内容: >oracle 数据类型 >sql建表和约束 >sql对数九的增删改 >sql查询 >oracle伪例 1.oracle的数据类型 oracle数据库的核心是 ...

  4. iOS边练边学--cocoaPods管理第三方框架--命令行方式实现

    更换源 Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.org/)源来查找.安装.升级和写在软件包 gem sources --remove ht ...

  5. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  6. BZOJ-3229 石子合并 GarsiaWachs算法

    经典DP?稳T 3229: [Sdoi2008]石子合并 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 426 Solved: 202 [Submit] ...

  7. POJ2226 Muddy Fields

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10149   Accepted: 3783 Description Rain ...

  8. easyui 动态修改窗口title

    http://blog.csdn.net/liu251890347/article/details/39292307?utm_source=tuicool 使用easyui作为前台框架极大的节省了项目 ...

  9. easyUI框架之学习1--框架

    <!DOCTYPE html><html> <head > <link href="~/Scripts/easyUI/themes/default/ ...

  10. tmux 快捷键

    ctrl+b , 修改窗口名称 ctrl+b ' 快速按名字切换窗口 ctrl+b w 列出窗口列表 Ctrl+b 激活控制台:此时以下按键生效 系统操作 ? 列出所有快捷键:按q返回 d 脱离当前会 ...