yamlip 安装_在Kubernetes中正确地安装Calico

title: 在Kubernetes中正确地安装Calico top: false cover: false toc: true mathjax: true date: 2019-08-23 18:08:30 password: summary: tags: - k8s - Calico categories: - DevOps

下述内容以 Calico 当前(2019-6-11)最新版本 v3.7 为基础。 k8s集群的安装方式以kubeadm工具安装为前提。

目录

本文目的解读 Calico 官网上关于作为 Kubernetes cni 安装 Calico 的部分。

系统要求

在安装Calico之前,有必要先了解安装前提的系统要求,包括: 节点硬件、存储架构、网络基础设施、OS特权、Kubernetes版本、Kubernetes参数、内核依赖。

详细的说明请参见官网。

开通防火墙

我把ens33这个网卡加入到了firewalld的public zone中,这个网卡是nat网卡,打算直接使用nat网卡来安装k8s集群。

[root@k8s-master-01 ~]# firewall-cmd --get-active-zones

public

interfaces: ens33

[root@k8s-master-01 ~]#

ens33 : 这个是通过vmware workstation创建的NAT网卡。

网卡可以使用NAT,在DHCP配置文件中绑定MAC地址与固定IP。

# Calico networking (BGP)

firewall-cmd --zone=public --add-port=179/tcp --permanent

# Calico networking with Typha enabled

firewall-cmd --zone=public --add-port=5473/tcp --permanent

# flannel networking (VXLAN)

firewall-cmd --zone=public --add-port=4789/udp --permanent

修改NetworkManager服务的配置以允许Calico管理网卡

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

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

NetworkManager 会篡改 default namespace 中的网卡的路由表,而这些路由表将要被 Calico 的虚拟网卡链接到容器。这会干扰 Calico agent 导致不能正确路由。

创建这个配置文件在 /etc/NetworkManager/conf.d/calico.conf,用来防止 NetworkManager 去干扰网卡:

[keyfile]

unmanaged-devices=interface-name:cali*;interface-name:tunl*

运行Calico的方式

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

安装Calico作为策略(policy)和网络(networking)(推荐用法)

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

使用Kubernetes API作为数据存储--少于50个节点的情况

1. 先下载Calico的manifest文件。

curl https://docs.projectcalico.org/v3.7/manifests/calico.yaml -O

2. 根据使用 kubeadm 进行 k8s 集群初始化时传递的 --pod-network-cidr 参数,或许需要修改 calico.yaml。--pod-network-cidr 这个参数是用来给 controller-manager 用作自动分配pod子网(用作给每个node上的pod分配IP address)。 根据官方文档,如果在初始化时没有指定此参数,则不会自动分配pod子网。 另外在初始化时,要根据节点本身的网卡IP地址和将要使用的pod网络插件来ef="https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network">指定合理的--pod-network-cidr的数值。

你的 pod 网络绝对不能和宿主机(节点)的任何网络重叠,否则将会产生问题。如果你发现你的网络插件的默认 pod 网络和你的一些宿主机网络冲突,你应该在 kubeadm 初始化时通过 --pod-network-cidr 传递一个合适的 CIDR,并且替换网络插件的 YAML 文件中的相应的值。

以下是我准备用来安装 kubernetes master(control-plane with etcd)的 vmware 虚拟机(CentOS7)的IP信息。

[root@k8s-master-01 ~]# ip address show

1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

link/ether 00:0c:29:8a:5d:f6 brd ff:ff:ff:ff:ff:ff

inet 192.168.79.128/24 brd 192.168.79.255 scope global noprefixroute dynamic ens33

valid_lft 1448sec preferred_lft 1448sec

inet6 fe80::e587:6e91:1cee:5ef8/64 scope link noprefixroute

valid_lft forever preferred_lft forever

3: virbr0: mtu 1500 qdisc noqueue state DOWN group default qlen 1000

link/ether 52:54:00:e0:fa:4c brd ff:ff:ff:ff:ff:ff

inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

valid_lft forever preferred_lft forever

4: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000

link/ether 52:54:00:e0:fa:4c brd ff:ff:ff:ff:ff:ff

5: docker0: mtu 1500 qdisc noqueue state DOWN group default

link/ether 02:42:1e:9f:2c:14 brd ff:ff:ff:ff:ff:ff

inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

valid_lft forever preferred_lft forever

You have new mail in /var/spool/mail/root

然后看一下 calico.yaml 中的 CIDR 这个环境变量的设置。

# 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: "192.168.0.0/16"

可以看到 Calico 默认的 IPv4 CIDR 和我的虚拟机的主网卡的IP地址网段有重叠部分。Calico 的默认 CIDR -- 192.168.0.0/16 包括了我的虚拟机上 public zone 的网卡 ens33 的 192.168.79.128/24。 在网上找了一个私有网络CIDR的规范,决定在以下网段中找一个网段作为--pod-network-cidr:10.0.0.0 - 10.255.255.255(掩码范围需在16 - 28之间)

172.16.0.0 - 172.31.255.255(掩码范围需在16 - 28之间)

192.168.0.0 - 192.168.255.255 (掩码范围需在16 - 28之间)

于是就决定用这个网段作为 pod CIDR 了: 172.16.0.0/16,所以修改 calico.yaml中上述 CALICO_IPV4POOL_CIDR 的值。

3. 对于多网卡环境下的主机需要配置 IP autodetection methods。

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

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

以下部分描述了可用的 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.*

4. 适用manifest。

kubectl apply -f calico.yaml

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kubernetes是一种容器编排和管理系统,而Calico是一种网络插件,用于为Kubernetes集群提供高性能、可扩展和安全的网络互连。 Kubernetes作为容器编排和管理系统,负责管理和调度容器化的应用程序。它提供了一个统一的管理界面,使得用户可以方便地定义、部署和管理容器。但是,Kubernetes只关注容器的调度和管理,对于容器之间的网络连接则没有提供特定的解决方案。 而Calico则提供了一种容器网络解决方案,旨在为Kubernetes集群提供高性能、可扩展和安全的网络互连。它基于Linux内核的网络技术,如Linux虚拟路由、BGP路由协议等,提供了一套灵活的网络架构。通过将Kubernetes集群的每个节点配置为一个路由器,Calico能够实现容器之间的直接通信,而无需通过NAT或其他网络转换技术。这样可以提供更低的网络延迟和更高的网络吞吐量。 除了高性能和可扩展性,Calico还提供了安全性方面的功能。它支持基于网络策略的安全控制,可以定义和限制容器之间的通信规则。通过使用网络策略,用户可以实现微服务之间的安全隔离,确保只有经过授权的容器可以相互通信。 总之,KubernetesCalico是两个不同但相关的技术。Kubernetes是用于容器编排和管理的系统,而Calico是提供高性能、可扩展和安全的网络连接的插件。它们可以一起使用,通过Calico插件为Kubernetes集群提供高效和可靠的容器网络解决方案。 ### 回答2: Kubernetes是一种用于容器编排和管理的开源平台,而Calico是一种用于容器网络的开源软件定义网络(SDN)解决方案。它们可以一起使用来提供强大和可靠的容器平台。 Kubernetes提供了容器编排和管理功能,允许用户在集群创建、部署和管理容器化应用程序。它可帮助用户自动化容器的创建、启动、停止和销毁,并提供负载均衡、服务发现和自动扩展等功能。Kubernetes提供了一个灵活可扩展的架构,能够适应不同规模的应用和不同类型的基础设施。 Calico是一个开源的容器网络解决方案,它使用了标准的IP路由协议来提供高性能和高度可扩展的容器网络。Calico使用BGP(边界网关协议)来管理容器之间的网络连接,并提供了灵活的控制面和数据面,可以与Kubernetes无缝集成。 KubernetesCalico的结合可以提供更强大的容器平台。Kubernetes通过提供容器编排和管理功能来简化应用程序的部署和管理,而Calico则负责管理容器之间的网络连接和流量控制。使用Calico可以实现容器之间的高性能通信,并提供网络策略控制,以确保容器间的安全性。 总而言之,Kubernetes提供了容器的编排和管理功能,而Calico则提供了容器网络的解决方案。它们可以一起使用来构建可靠、高性能和安全的容器平台。 ### 回答3: Kubernetes是一个开源的容器编排和管理平台,而Calico是用于网络与网络安全的Kubernetes插件。 Kubernetes是用于管理容器化应用程序的平台,它可以自动管理和编排容器的生命周期,并提供了水平扩展、自我修复和服务发现等功能。而Calico是一个网络解决方案,它为Kubernetes集群提供了高性能、高可靠性和灵活性的网络连接。 Calico使用BGP协议,为Kubernetes集群的每个节点提供独立的虚拟网络,使得所有容器都能够在不同主机上相互通信。Calico利用Linux的内核技术来实现网络隔离和安全性,通过为每个容器分配唯一的IP地址,实现容器之间的通信和访问控制。 在KubernetesCalico还提供了网络策略的功能,可以通过定义网络策略规则来控制容器之间的通信。这些规则可以基于IP地址、端口、协议和标签等进行匹配,从而实现微服务之间的灵活和可靠的通信。Calico还支持加密和认证功能,可以确保容器之间的通信是安全和保密的。 总而言之,KubernetesCalico是两个互补的技术,Kubernetes提供了容器编排和管理的功能,而CalicoKubernetes提供了高性能、高可靠性和灵活性的网络解决方案,使得容器之间可以安全、可靠地通信和交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值