目录
[Calico 工作原理](#Calico 工作原理)
部署Calico
安装步骤来到 CNI 网络组件 ,在(二)中我们安装了flannel,现在我们要尝试安装另一网络组件Calico
calico 不使用隧道或NAT来实现转发,而是把Host 当作 Internet 中的路由器,使用BGP同步路由,并使用iptables来做安全访问策略,完成跨Host转发。
Calico 主要由三个部分组成:
Calico CNI插件:主要负责与kubernetes对接,供kubelet调用使用。
Felix:负责维护宿主机上的路由规则、FIB转发信息库等。
BIRD:负责分发路由规则,类似路由器。
Confd:配置管理组件。
Calico 工作原理
Calico 是通过路由表来维护每个 pod 的通信。Calico 的 CNI 插件会为每个容器设置一个 veth pair 设备, 然后把另一端接入到宿主机网络空间,由于没有网桥,CNI 插件还需要在宿主机上为每个容器的 veth pair 设备配置一条路由规则, 用于接收传入的 IP 包。 有了这样的 veth pair 设备以后,容器发出的 IP 包就会通过 veth pair 设备到达宿主机,然后宿主机根据路由规则的下一跳地址, 发送给正确的网关,然后到达目标宿主机,再到达目标容器。
部署Calico
在部署Calico之前,我们需要完全清除我们部署的flannel
kubectl delete -f kube-flannel.yml

在 master01 节点上操作
上传 calico.yaml 文件到 /opt/k8s 目录中,部署 CNI 网络
或者下载calico.yaml文件
wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml --no-check-certificate
sed -i 's#docker.io/##g' calico.yaml 移除docker.io/ 前缀
cd /opt/k8s
vim calico.yaml
#3878行,将 ip 改为10.244.0.0/16


应用calico.yaml
kubectl apply -f calico.yaml

我这里下面有unchanged是因为中间有一个报错
查看kube-system 命名空间下的所有正在运行的pod
kubectl get pods -n kube-system

部署CoreDNS
PS:CoreDNS可以为集群中的 service 资源创建一个域名 与 IP 的对应关系解析
在node 节点上操作
上传 coredns.tar 到/opt 目录种
cd /opt
docker load -i coredns.tar

在 master01 上操作
上传 coredns.yaml 文件到 /opt/k8s 目录中,部署 CoreDNS
cd /opt/k8s
应用coredns
kubectl apply -f coredns.yaml

列出位于 kube-system 命名空间的所有pod
kubectl get pods -n kube-system

在master02 节点部署
(把 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点 ,暂且还在 master01 上操作)
scp -r /opt/etcd/ root@172.16.233.102:/opt/
scp -r /opt/kubernetes/ root@172.16.233.102:/opt
scp -r /root/.kube root@172.16.233.102:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@172.16.233.102:/usr/lib/systemd/system/
修改配置文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserver

随后在master02 节点上启动各服务,并设置开机自启
systemctl start kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service
为master02 做软链接,方便使用和系统读取
ln -s /opt/kubernetes/bin/* /usr/local/bin/
在02 机器上查看节点状态
kubectl get nodes

负载均衡部署
配置load balancer集群双机热备负载均衡(nginx 负载均衡 keepalived 双机热备)
在 lb01 lb02 节点上操作
配置nginx 官方在线yum 源
cat > /etc/yum.repos.d/nginx.repo << 'EOF' [nginx] name=nginx repo baseurl=Index of /packages/centos/7/$basearch/ gpgcheck=0 EOF
yum install nginx -y
随后修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口
vim /etc/nginx/nginx.conf

nginx -t 检查语法是否有误

启动nginx服务,并查看已监听6443端口
systemctl start nginx
systemctl enable nginx
接下来部署 keepalived 服务
yum install keepalived -y
修改 keepalived 主配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER #lb02 是NGINX_BACKUP
}
vrrp_script check_nginx {
script "/etc/nginx/check_nginx.sh" # 添加nginx 健康检查脚本
}
vrrp_instance VI_1 {
state MASTER #lb02 是BACKUP
interface eth33 # ens33
virtual_router_id 51
priority 100 #lb02 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.233.99 #虚拟ip
}
track_script {
check_nginx
}
}
创建nginx状态检查脚本
vim /etc/nginx/check_nginx.sh

赋权
启动keepalived 服务
systemctl start keepalived
ip a 查看虚拟ip

在node 节点上操作
修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig

vim kubelet.kubeconfig

vim kube-proxy.kubeconfig

重启kubelet和kube-proxy服务
systemctl restart kubelet.service
systemctl restart kube-proxy.service
在lb01 上查看 nginx 和 node 、 master 节点的连接状态
netstat -natp | grep nginx

在master01节点上操作
测试创建pod
kubectl run nginx --image=nginx
//查看Pod的状态信息
kubectl get pods

kubectl get pods -o wide

在对应的node节点上 curl 访问

部署dashboard
在 master01 节点上操作
上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml

kubectl apply -f recommended.yaml
创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
这里会输出一个token

浏览器访问
登录的时候输入token

到这里二进制部署安装就完成了