1 介绍
k8s 部署的时候可以选择多种cni插件,每种插件都有其对应的特殊,最经典的的莫过于 Flannel 和 Calico。
Flannel 是一个为 Kubernetes 提供叠加网络的网络插件,它基于 Linux TUN/TAP,使用 UDP 封装 IP 报文来创建叠加网络,并借助 etcd 维护网络的分配情况 。其后端支持VxLAN、host-gw和UDP,默认为VxLAN(在三层构建了一个大二层网络)。
如下为flannel VxLAN后端结构示意图:
Calico 是一个基于 BGP 的 三层网络插件,并且也支持网络策略来实现网络的访问控制;它在每台机器上运行一个 vRouter,利用 Linux 内核来转发网络数据包 , 并借助 iptables 实现防火墙等功能 。
Calico 本身是一个三层的虚拟网络方案,它将每个节点都当做一个路由器(router),将每个节点的容器都当做是"节点路由器"的一个终端并为其分配一个IP地址,各个节点路由器通过BGP学习生成路由规则,从而将不同节点上的容器连接起来。
如下为calico的系统结构示意图:
笔者在 k8s笔记6–使用kubeadm快速部署k8s集群 v1.19.4 中部署了基于Flannel的集群,但是Flannel暂时不支持网络策略,因此此处部署一个基于Calico的集群。其节点配置和上文相同,部署方法和上文几乎一致,此处只添加了一些重要步骤。
2 搭建集群
-
配置基础环境 和 软件
参考笔者博文进行设置即可,唯一区别就是需要load calico相关的镜像,其它基本完全一样。
k8s笔记6–使用kubeadm快速部署k8s集群 v1.19.4->2.1 安装基础软件 -
初始化master
# kubeadm init --apiserver-advertise-address=192.168.2.131 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.224.0.0/16 # mkdir -p $HOME/.kube # sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # sudo chown $(id -u):$(id -g) $HOME/.kube/config
注:Calico 网络默认pod网络网段为192.168.0.0/16 ,会自动分配service网段,因此不需要像Flannel一样设置service网段。笔者虚拟机网段为192.168.2.x,为了更方便测试网络信息,此处将网段设置为 --pod-network-cidr=10.224.0.0/16 。
笔者在安装 1.21 版本的k8s时候发现报错,无法正常拉取coredns,# docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.0 Error response from daemon: manifest for registry.aliyuncs.com/google_containers/coredns:v1.8.0 not found: manifest unknown: manifest unknown 但是测试后发现有:registry.aliyuncs.com/google_containers/coredns:1.8.0 ,因此推测阿里云没有tag v1.8.0 版本,自己拉取1.8.0后打tag v1.8.0, 再执行init 命令后顺利执行成功了。
-
master部署cni网络
wget https://docs.projectcalico.org/manifests/calico.yaml # kubectl apply -f calico.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 poddisruptionbudget.policy/calico-kube-controllers created
-
加入node节点
master节点apply cni网络后,等几分钟,以确保相关服务的pod都正常拉起来了,然后再加入work节点。# kubeadm join --token 7qm7bu.16iurmxsyp10h5e8 192.168.2.131:6443 --discovery-token-ca-cert-hash sha256:dcb4c0d4d1204134f4e99e164f210e6f96494c63314306d1da0f49458654206f
-
安装 metrics-server
# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml 需要在 container metrics-server 的args 中添加: --kubelet-insecure-tls,否则会启动报错 # kubectl apply -f components.yaml $ kubectl apply -f components.yaml serviceaccount/metrics-server created clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created clusterrole.rbac.authorization.k8s.io/system:metrics-server created rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created service/metrics-server created deployment.apps/metrics-server created apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
查看node metrics信息:
Lens 查看当前pod信息:
4 注意事项
- 默认情况下k8s config 对apiserver-advertise-address 开放访问权限,因此如果需要用额外的外网访问该服务,那么需要配置 apiserver-cert-extra-sans选项,例如
# kubeadm init --apiserver-advertise-address=10.0.8.4 --apiserver-cert-extra-sans=106.xxx.xxx.12,10.0.8.4 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.224.0.0/16
生成config 文件后更改 server: https://106.xxx.xxx.12:6443 , 那么可以通过该master的外网访问集群。
如不设置,那么直接通过外网的6443访问,会报错 Unable to connect to the server: x509: certificate is valid for xxx
- docker 的 cgroupdriver 需要和kubelet 启动的cgroupdriver匹配,否则无法正常启动。
正常情况下可以配置docker的daemon.json, 按需配置和kubelet一样的cgroupdriver
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
3 说明
1 calico 官方文档 about-calico
2 kubernetes-sigs/metrics-server
3 Kubernetes 进阶实战
4 github.com/kubernetes/dashboard