在Amazon EKS Kubernetes集群上安装Calico CNI插件
如果我们使用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