zoukankan      html  css  js  c++  java
  • Calico在Kubernetes中的搭建

    一,需求

    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=2380
    export port2=2379
    export port3=4002
     
    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=0 --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=0 --master=http://tc-151-97:8080 --cloud-provider="" 2>&1 >controller.out &

    kube-scheduler:

    ./kube-scheduler --logtostderr=true --v=0 --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-5
    spec:
    replicas: 1
    template:
    metadata:
    labels:
    app: test-5
    spec:
    containers:
    - name: iperf
    image: 10.11.150.76:5000/openxxs/iperf:1.2
    nodeSelector:
    kubernetes.io/hostname: tc-151-100

    在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-5
    spec:
    replicas: 70
    template:
    metadata:
    labels:
    app: test-5
    spec:
    containers:
    - name: iperf
    image: 10.11.150.76:5000/openxxs/iperf:1.2
    nodeSelector:
    kubernetes.io/hostname: tc-151-100

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

    可是!
    我们发现居然只有40启动起来了!另外的30个资源分配失败。查找原因发现,kubelet默认只能最多创建40个pods。我们将kubelet重启,加上参数--max-pods=200,将最大pods数量设置为200。重新创建,70pods均创建成功。
  • 相关阅读:
    CSAcademy Or Problem
    BZOJ 4516 [Sdoi2016] 生成魔咒
    SPOJ7258 SUBLEX
    SPOJ1812 LCS2
    SPOJ1811 LCS
    SPOJ8222 NSUBSTR
    洛谷3804 【模板】后缀自动机
    SPOJ287 NETADMIN
    SPOJ1693 COCONUTS
    BZOJ5329 SDOI2018 战略游戏
  • 原文地址:https://www.cnblogs.com/tingfengainiaini/p/5013497.html
Copyright © 2011-2022 走看看