在Amazon EKS Kubernetes集群上安装Calico CNI插件

时间:2020-02-23 14:31:40  来源:igfitidea点击:

如果我们使用Amazon EKS在AWS云中运行Kubernetes集群,则Kubernetes的默认容器网络接口(CNI)插件为amazon-vpc-cni-k8s。通过使用此CNI插件,Kubernetes Pod将在Pod中具有与在VPC网络上相同的IP地址。此CNI的问题是运行和管理大型群集所需的大量VPC IP地址。这就是为什么可以选择Calico之类的其他CNI插件的原因。

Calico是一个免费使用的开源网络和网络安全插件,支持多种平台,包括Docker EE,OpenShift,Kubernetes,OpenStack和裸机服务。 Calico提供真正的云原生可扩展性,并提供超快的性能。借助Calico,我们可以选择使用Linux eBPF或者高度优化的Linux内核标准网络管道来提供高性能网络。

对于以租户彼此隔离为关键的多租户Kubernetes环境,可使用Calico网络策略实施来实现网络分段和租户隔离。我们可以轻松创建网络入口和出口规则,以确保将正确的网络控制应用于服务。

在Amazon EKS Kubernetes集群上安装Calico CNI插件

这些是在实施解决方案之前要注意的要点:如果将Fargate与Amazon EKS Calico结合使用,如果我们在Calico策略之外有规则,请考虑将现有iptables规则添加到Calico策略中,以免Calico策略超出规则如果我们使用Pod的安全组,则分支网络接口上的Pod的流量不会受到Calico网络策略的强制执行,并且仅限于Amazon EC2安全组的强制执行

设置EKS群集

我假设我们有一个新创建的EKS Kubernetes集群。我们的教程可用于如下部署EKS集群。

使用EKS轻松在AWS上设置Kubernetes集群

集群运行后,请通过eksctl确认它可用:

$eksctl get cluster -o yaml
- name: My-EKS-Cluster
  region: eu-west-1

删除AWS VPC联网Pod

由于在我们的EKS集群中将使用Calico进行联网,因此我们必须删除aws-node守护程序集以禁用Pod的AWS VPC联网。

$kubectl delete ds aws-node -n kube-system
daemonset.apps "aws-node" deleted

确认所有aws-node Pod已删除。

$kubectl get pods -n kube-system
NAME                       READY   STATUS    RESTARTS   AGE
coredns-6987776bbd-4hj4v   1/1     Running   0          15h
coredns-6987776bbd-qrgs8   1/1     Running   0          15h
kube-proxy-mqrrk           1/1     Running   0          14h
kube-proxy-xx28m           1/1     Running   0          14h

在EKS Kubernetes集群上安装Calico CNI

下载Calico Yaml列表。

wget https://docs.projectcalico.org/manifests/calico-vxlan.yaml

然后应用列表文件yaml文件在Amazon EKS集群上部署Calico CNI。

kubectl apply -f calico-vxlan.yaml

这是我的部署输出,显示了所有正在创建的对象。

configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

获取在kube-system名称空间中部署的DaemonSet的列表。

$kubectl get ds calico-node --namespace kube-system

NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
calico-node   2         2         0       2            0           kubernetes.io/os=linux   14s

印花棉布节点DaemonSet的READY状态中应具有所需的Pod数量。

$kubectl get ds calico-node --namespace kube-system

NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
calico-node   2         2         2       2            2           kubernetes.io/os=linux   48s

也可以使用kubectl命令检查正在运行的Pod。

$kubectl get pods -n kube-system | grep calico
calico-node-bmshb                                     1/1     Running   0          4m7s
calico-node-skfpt                                     1/1     Running   0          4m7s
calico-typha-69f668897f-zfh56                         1/1     Running   0          4m11s
calico-typha-horizontal-autoscaler-869dbcdddb-6sx2h   1/1     Running   0          4m7s

创建新的节点组并删除旧的节点组

如果已经将节点添加到群集中,则需要添加另一个节点组,然后删除其中的旧节点组和计算机。

要创建其他节点组,请使用:

eksctl create nodegroup --cluster=<clusterName> [--name=<nodegroupName>]

列出集群以获取集群名称:

$eksctl get cluster

可以从CLI或者配置文件创建节点组。从CLI创建节点组

eksctl create nodegroup --cluster <clusterName> --name <nodegroupname> --node-type <instancetype> --node-ami auto

要更改每个节点的最大Pod数,请添加:

--max-pods-per-node <maxpodsnumber>

例:

eksctl create nodegroup --cluster my-eks-cluster --name eks-ng-02 --node-type t3.medium --node-ami auto --max-pods-per-node 150

从配置文件创建"更新nodeGroups"部分。看到是

nodeGroups:
  - name: eks-ng-01
    labels: { role: workers }
    instanceType: t3.medium
    desiredCapacity: 2
    volumeSize: 80
    minSize: 2
    maxSize: 3
    privateNetworking: true

  - name: eks-ng-02
    labels: { role: workers }
    instanceType: t3.medium
    desiredCapacity: 2
    volumeSize: 80
    minSize: 2
    maxSize: 3
    privateNetworking: true

对于Managed,请将nodeGroups替换为managedNodeGroups。完成后,应用配置以创建节点组。

eksctl create nodegroup --config-file=my-eks-cluster.yaml

创建新的节点组后,删除旧的节点组以进行警戒并迁移所有Pod。

eksctl delete nodegroup --cluster=<clusterName> --name=<nodegroupName>

或者从配置文件:

eksctl delete nodegroup --config-file=my-eks-cluster.yaml --include=<nodegroupName> --approve

如果检查群集中的节点,则首先禁用调度:

$kubectl get nodes
NAME                                           STATUS                     ROLES    AGE     VERSION
ip-10-255-101-100.eu-west-1.compute.internal   Ready                      <none>   3m57s   v1.17.11-eks-cfdc40
ip-10-255-103-17.eu-west-1.compute.internal    Ready,SchedulingDisabled   <none>   15h     v1.17.11-eks-cfdc40
ip-10-255-96-32.eu-west-1.compute.internal     Ready                      <none>   4m5s    v1.17.11-eks-cfdc40
ip-10-255-98-25.eu-west-1.compute.internal     Ready,SchedulingDisabled   <none>   15h     v1.17.11-eks-cfdc40

几分钟后,它们将被删除。

$kubectl get nodes
NAME                                           STATUS   ROLES    AGE     VERSION
ip-10-255-101-100.eu-west-1.compute.internal   Ready    <none>   4m45s   v1.17.11-eks-cfdc40
ip-10-255-96-32.eu-west-1.compute.internal     Ready    <none>   4m53s   v1.17.11-eks-cfdc40

如果我们描述新的Pod,则应注意其IP地址的更改:

$kubectl describe pods coredns-6987776bbd-mvchx -n kube-system
Name:                 coredns-6987776bbd-mvchx
Namespace:            kube-system
Priority:             2000000000
Priority Class Name:  system-cluster-critical
Node:                 ip-10-255-101-100.eu-west-1.compute.internal/10.255.101.100
Start Time:           Mon, 26 Oct 2017 15:24:16 +0300
Labels:               eks.amazonaws.com/component=coredns
                      k8s-app=kube-dns
                      pod-template-hash=6987776bbd
Annotations:          cni.projectcalico.org/podIP: 192.168.153.129/32
                      cni.projectcalico.org/podIPs: 192.168.153.129/32
                      eks.amazonaws.com/compute-type: ec2
                      kubernetes.io/psp: eks.privileged
Status:               Running
IP:                   192.168.153.129
IPs:
  IP:           192.168.153.129
Controlled By:  ReplicaSet/coredns-6987776bbd
....

安装calicoctl命令行工具

使用calicoctl,群集用户可以从命令行界面读取,创建,更新和删除Calico对象。运行以下命令以安装calicoctl。

Linux:

curl -s https://api.github.com/repos/projectcalico/calicoctl/releases/latest | grep browser_download_url | grep linux-amd64 | grep -v wait | cut -d '"' -f 4 | wget -i 
chmod +x calicoctl-linux-amd64
sudo mv calicoctl-linux-amd64 /usr/local/bin/calicoctl

苹果系统:

curl -s https://api.github.com/repos/projectcalico/calicoctl/releases/latest | grep browser_download_url | grep darwin-amd64| grep -v wait | cut -d '"' -f 4 | wget -i 
chmod +x calicoctl-darwin-amd64
sudo mv calicoctl-darwin-amd64 /usr/local/bin/calicoctl