k8s集群安装calico 3.16插件

09/24 15:38
阅读数 905

一、准备工作

Node 环境

  • Linux kernel 3.10 以上
    • CentOS 7
    • Ubuntu 16.04
    • Debian 8
  • 修改NetworkManager服务的配置以允许Calico管理网卡

​ Calico 必须能够在宿主机上管理 cali* 网卡。当 IPIP 被启用时(默认),Calico 还需要能够管理 tunl* 网卡。

注意: 许多Linux发行版都安装了 NetworkManager。默认情况下 NetworkManager 不允许 Calico 管理网卡。如果你的节点有 NetworkManager,在安装 Calico 之前,你需要按照这个步骤去防止 NetworkManager 控制 Calico 网卡

key/value存储

Calico v3.16 所有组件需要把数据存储到 kv数据库,在kubernetes平台,你可以配置calico访问etcdv3 集群 或者通过kubernetes api datastore

<!--more-->

网络组件和端口分布

保证主机和防火墙能允许以下端口通信

Configuration Host(s) Connection type Port/protocol
Calico networking (BGP) All Bidirectional TCP 179
Calico networking with IP-in-IP enabled (default) All Bidirectional IP-in-IP, often represented by its protocol number 4
Calico networking with VXLAN enabled All Bidirectional UDP 4789
Calico networking with Typha enabled Typha agent hosts Incoming TCP 5473 (default)
flannel networking (VXLAN) All Bidirectional UDP 4789
All kube-apiserver host Incoming Often TCP 443 or 6443*
etcd datastore etcd hosts Incoming Officially TCP 2379 but can vary

kubernetes 版本要求

  • 1.16
  • 1.17
  • 1.18

开启CNI plug-in

kubelet 配置添加--network-plugin=cni参数

支持的kube-proxy模式

清楚旧的cni 插件配置

如果集群之前有flannel,执行以下命令清除干净

ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/

运行Calico的方式

Calico 有以下三种使用场景:

注意: 策略是指Kubernetes的网络策略(network policy)

安装calico的3种环境

Calico的数据存储(datastore)有2种方式,一个是使用 Kubernetes API;一个是使用etcd。 在使用不同数据存储和集群规模不同的情况下,安装配置的过程会有所不同

本文档基于使用k8s自带etcd集群

二、安装calico

2.1 下载yaml

curl https://docs.projectcalico.org/manifests/calico-etcd.yaml -o calico.yaml

2.2 修改etcd集群地址

kind: ConfigMap
apiVersion: v1
metadata:
  name: calico-config
  namespace: kube-system
data:
  # 这里的etcd地址是k8s 使用的etcd集群.
  etcd_endpoints: "http://172.16.0.12:2379,http://172.16.0.16:2379,http://172.16.0.44:2379"

2.3 修改集群网段

默认是192.168.0.0/16网段,注意不要和k8s集群网络冲突。

注意,这个网段应该与kubeapi定义--service-cluster-ip-range的网段一样

            # The default IPv4 pool to create on startup if none exists. Pod IPs will be
            # chosen from this range. Changing this value after installation will have
            # no effect. This should fall within `--cluster-cidr`.
            - name: CALICO_IPV4POOL_CIDR
              value: "10.96.0.0/12"

2.4 修改ip 发现方式

当 Calico 被用作路由,每个 node 必须配置一个 IPv4 地址 和/或者 一个 IPv6 地址,用作 node 间的路由。为了排除节点特定的 IP 地址的配置,calico/node 这个容器可以被配置为自动检测 IP 地址配置。在许多系统中,一个主机上或许会有多个物理网卡,或者可能有多个 IP 地址配置到一个物理网卡。在这些情况下,自动检测模式下会有多个地址可选,所以难以确认正确的地址。

官方文档

为了改善选择正确地址的过程,Calico 提供了 IP 自动检测的方法,这些方法基于合适的条件给这个选择定义一些限制。

  • first-found
    first-found 方法列举所有网卡 IP 地址然后返回第一个有效网卡上的第一个有效的 IP 地址(基于IP版本和地址的类型)。确切已知的 "local" 网卡会被忽略,例如 docker 网桥。网卡和 IP 地址的顺序根据不同系统会有差异。
    这个是默认的检测方法。然而,由于这个方法只会作非常简单的假设,强烈推荐要么给节点配置一个特定的 IP 地址(应该是通过给 kubelet 指定参数),要么使用另外一种检测方法。
    e.g.


    `IP_AUTODETECTION_METHOD=first-found IP6_AUTODETECTION_METHOD=first-found`
  • can-reach=DESTINATION
    can-reach 方法使用你的本地路由来决定使用哪个 IP 地址来到达提供的目的地。可以使用 IP 地址或者域名。
    使用 IP 地址的例子:

    IP_AUTODETECTION_METHOD=can-reach=8.8.8.8 IP6_AUTODETECTION_METHOD=can-reach=2001:4860:4860::8888

    使用域名的例子:

    IP_AUTODETECTION_METHOD=can-reach=www.google.com IP6_AUTODETECTION_METHOD=can-reach=www.google.com
  • interface=INTERFACE-REGEX
    interface 方法使用提供的网卡正则表达式(golang语法)去列举匹配到的网卡然后返回在第一个匹配到的网卡上的第一个 IP 地址。网卡和 IP 地址的顺序根据不同系统会有差异。
    网卡 eth0, eth1, eth2 etc. 的有效 IP 地址的例子:
    IP_AUTODETECTION_METHOD=interface=eth.* IP6_AUTODETECTION_METHOD=interface=eth.*


  • cidr=CIDR

    指定cidr段作为地址

              - name: IP_AUTODETECTION_METHOD
                value: "cidr=172.16.0.0/24"

2.5 配置kube-api 环境变量

添加环境变量,覆盖kubernetes svc, 保证node安装成功

        - name: calico-node
          image: harbor.foxchan.com/calico/node:v3.16.1
          #envFrom:
          #- configMapRef:
          #    # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.
          #    name: kubernetes-services-endpoint
          #    optional: true
          env:
            # apiserver emargongsi
            - name: KUBERNETES_SERVICE_HOST
              value: "172.16.0.20"
            - name: KUBERNETES_SERVICE_PORT_HTTPS
              value: "8443"
            - name: KUBERNETES_SERVICE_PORT
              value: "8443"

三 、安装配置calicoctl

3.1 下载binary 文件

curl -O -L  https://github.com/projectcalico/calicoctl/releases/download/v3.16.1/calicoctl

3.2 赋予权限

chmod +x calicoctl

3.3 使用环境变量访问

ETCD_ENDPOINTS=http://etcd:2379 calicoctl get bgppeers

四、 配置calico cross-subnet

ipip虽然实现了 calico 跨网段通信,但对于相同网段间的主机通信来说,IP-in-IP 就有点多余了,因为二者宿主机处于同一广播域,2层互通,直接走主机路由即可。此时需要借助calico cross-subnet

IPIP配置文档

$ calicoctl apply -f - << EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  blockSize: 26
  cidr: 10.96.0.0/12
  ipipMode: CrossSubnet
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never
EOF

参考文档

calico官方地址:

https://docs.projectcalico.org/getting-started

自定义安装说明页面

https://docs.projectcalico.org/getting-started/kubernetes/installation/config-options

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部