在Kubernetes上部署Calico网络

 2018年5月27日 22:40   Nick王   云计算    0 评论   404 浏览 

Calico Version v3.1.1
Kubernetes Version v1.9.3

在Kubernetes上部署Calico网络

官方链接: https://docs.projectcalico.org/v3.1/getting-started/kubernetes/

系统依赖

Node 依赖

  • 64位 处理器

  • Linux 3.10的内核或者更高。

key / value 存储

Calico v3.1的所有组件都需要访问 key/value 存储。在Kubernetes中,你可以配置Calico直接访问etcdv3集群或者使用Kubernetes API 数据存储。

网络依赖

Calico要求网络允许以下类型的流量:

TrafficProtocolPort
BGPTCP179
IPIP*4n/a

Kubernetes 依赖

支持版本
  • 1.8

  • 1.9

  • 1.10

启用 CNI plug-in

在Kubernetes中Calico是作为CNI插件安装的。所以必须给kubelet配置使用CNI网络。查看是否开启参数--network-plugin=cni

其他 network providers

Calico必须是每个集群的唯一的network providers。

已经支持的kube-proxy模式

Calico支持下面的kube-proxy模式:

  • iptables

  • ipvs

IP池配置

为pod IP地址选择的IP范围不能与网络中的任何其他IP范围重叠,其中包括:

  • Kubernetes service cluster IP范围

  • 宿主机的IP范围

内核依赖
  • nf_conntrack_netlink

  • ip_tables

  • ip6_tables

  • ip_set

  • xt_set

  • ipt_set

  • ipt_rpfilter

  • ipt_REJECT

  • ipip


安装Calico用于网络策略和通信

安装针对于使用不同的数据存储而不同:

  • 使用etcd存储

  • 使用Kubernetes API 数据存储(50节点以下)

  • 使用Kubernetes API 数据存储(50节点以上)

使用etcd存储

  1. 如果你的集群启用了RBAC,那么应该使用如下的命令配置Calico必要的角色绑定。

wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/rbac.yaml
sed -i '#apiVersion: rbac.authorization.k8s.io/v1beta1#apiVersion: rbac.authorization.k8s.io/v1#' rbac.yaml
kubectl apply -f rbac.yaml
  1. 下载基于etcd存储的Calico 网络配置

wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/calico.yaml
  1. ConfigMap中修改名为calico-config的配置,修改etcd相关的配置:

# This ConfigMap is used to configure a self-hosted Calico installation.
kind: ConfigMap
apiVersion: v1
metadata:
  name: calico-config
  namespace: kube-system
data:
  # Configure this with the location of your etcd cluster.
  etcd_endpoints: "https://10.2.30.203:2379,https://10.2.30.204:2379,https://10.2.30.205:2379"

  # Configure the Calico backend to use.
  calico_backend: "bird"
……省略……
  # If you're using TLS enabled etcd uncomment the following.
  # You must also populate the Secret below with these files.
  etcd_ca: /calico-secrets/etcd-ca
  etcd_key: /calico-secrets/etcd-key
  etcd_cert: /calico-secrets/etcd-cert

--

# The following contains k8s Secrets for use with a TLS enabled etcd cluster.
# For information on populating Secrets, see http://kubernetes.io/docs/user-guide/secrets/
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: calico-etcd-secrets
  namespace: kube-system
data:
  # Populate the following files with etcd TLS configuration if desired, but leave blank if
  # not using TLS for etcd.
  # This self-hosted install expects three files with the following names.  The values
  # should be base64 encoded strings of the entire contents of each file.
  etcd-key: xxxx
  etcd-cert: xxxxx
  etcd-ca: xxx
……省略……

注意: 使用cat <file> | base64 -w 0 将文件内容转换为base64编码格式。

参考链接: https://docs.projectcalico.org/v3.0/reference/advanced/etcd-rbac/kubernetes

修改IPAM的IP池,修改名称为calico-nodeDaemonSet

            # 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: "172.100.0.0/16"
            - name: CALICO_IPV4POOL_IPIP
              value: "Always"
  1. 在所有的节点上准备镜像:

docker pull quay.io/calico/node:v3.1.1
docker pull quay.io/calico/cni:v3.1.1
docker pull quay.io/calico/kube-controllers:v3.1.1
  1. 使用以下命令应用yaml

kubectl apply -f calico.yaml

在Kubernetes中使用calicoctl

首先安装calicoctl,可以使用二进制的方式,也可以使用Pod的方式:

wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/calicoctl.yaml
docker pull quay.io/calico/ctl:v3.1.1
kubectl apply -f calicoctl.yaml
kubectl exec -it -n kube-system calicoctl -- /calicoctl version
kubectl exec -it -n kube-system calicoctl -- /calicoctl get profiles -o wide

特别提示: 注意yaml中的etcd TLS的相关配置。

查看注册节点:

kubectl exec -it -n kube-system calicoctl -- /calicoctl get nodes

查看IP池:

kubectl exec -it -n kube-system calicoctl -- /calicoctl get ippool -o wide

查看所有容器已经分配的IP地址(WorkloadEndpoint Resource)

kubectl exec -it -n kube-system calicoctl -- /calicoctl get wep --all-namespaces

配置IPIP为跨子网模式

默认情况下总是IPIP模式:

# kubectl exec -it -n kube-system calicoctl -- /calicoctl get ippool -o wide
NAME                  CIDR             NAT    IPIPMODE   DISABLED
default-ipv4-ippool   172.100.0.0/16   true   Always     false

导出IPPOOL为yaml,并且修改ipipModeCrossSubnet:

# # kubectl exec -it -n kube-system calicoctl sh
~ # /calicoctl get ippool -o yaml > ippool.yaml

应用更改:

~ # /calicoctl apply -f ippool.yaml
Successfully applied 1 'IPPool' resource(s)

查看效果:

# kubectl exec -it -n kube-system calicoctl -- /calicoctl get ippool -o wide
NAME                  CIDR             NAT    IPIPMODE      DISABLED
default-ipv4-ippool   172.100.0.0/16   true   CrossSubnet   false

必要的内核参数

为提高iptables的性能,增大nf_conntrack_max

sysctl -w net.netfilter.nf_conntrack_max=1048576
echo "net.netfilter.nf_conntrack_max=1048576" >> /etc/sysctl.conf

扩展阅读:




如无特殊说明,文章均为本站原创,转载请注明出处