安装calico
安装docker:https://www.cnblogs.com/cjsblogs/p/8717304.html
安装etcd集群:https://www.cnblogs.com/cjsblogs/p/8716976.html
注意:
(1) 这里要说明下,因为后期需要固定nginx-ingress的容器IP地址。实验在创建calico网络之后会有个BUG,即2.6.2之后版本在创建指定IP的容器的时候会报错,所以calico的版本必须为<=2.6.2。
(2) 因为需要针对nginx-ingress容器单独做端口打通,所以需要在calico的calico.env和calico-node.service添加参数CALICO_LIBNETWORK_LABEL_ENDPOINTS=true,允许calico策略读取docker容器的label标签。
(3)calico版本需要选择v1.6.2, 如v1.6.4会有bug,不建议使用,其余版本需要测试
先安装docker以及etcd集群
将etcd集群的/opt/ssl/*.pem全部拷贝到对应的docker宿主机的/opt/ssl下
daemon.json添加etcd相关配置
1 2 3 4 5 6 7 | "cluster-store" : "etcd://172.16.150.25:2379" , "cluster-store-opts" : { "kv.cacertfile" : "/opt/ssl/ca.pem" , "kv.certfile" : "/opt/ssl/etcd.pem" , "kv.keyfile" : "/opt/ssl/etcd-key.pem" } } |
重启docker
1 | systemctl daemon-reload && systemctl restart docker |
搭建配置calico
配置准备:创建calico目录(以下路径均为自定义方便管理,在配置的时候跟官网有些区别,注意修改配置文件)
1 | mkdir -p /opt/platform/calico/certs /opt/platform/calico/log |
创建证书:由于搭建etcd集群中已经创建了etcd的证书,calico只需要复用即可
1 | cp -a /opt/ssl/*.pem /opt/platform/calico/certs/ |
安装配置calico
安装calicoctl
1 2 | wget -O /opt/platform/calico/calicoctl https: //github.com/projectcalico/calicoctl/releases/download/v1.6.2/calicoctl chmod +x /opt/platform/calico/calicoctl |
下载calicoctl镜像,如果下载不了,需要FQ
1 | docker pull quay.io/calico/node:v2.6.2 |
配置calico系统服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | vim /lib/systemd/system/calico-node.service [Unit] Description=calico-node After=docker.service Requires=docker.service [Service] EnvironmentFile=/opt/platform/calico/calico.env ExecStartPre=-/usr/bin/docker rm -f calico-node ExecStart=/usr/bin/docker run --net=host --privileged \ --name=calico-node \ -e NODENAME=${CALICO_NODENAME} \ -e IP=${CALICO_IP} \ -e IP6=${CALICO_IP6} \ -e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} \ -e AS=${CALICO_AS} \ -e NO_DEFAULT_POOLS=${CALICO_NO_DEFAULT_POOLS} \ -e CALICO_LIBNETWORK_ENABLED=${CALICO_LIBNETWORK_ENABLED} \ -e ETCD_ENDPOINTS=${ETCD_ENDPOINTS} \ -e ETCD_CA_CERT_FILE=${ETCD_CA_CERT_FILE} \ -e ETCD_CERT_FILE=${ETCD_CERT_FILE} \ -e ETCD_KEY_FILE=${ETCD_KEY_FILE} \ -v /opt/platform/calico/certs:/etc/calico/certs \ -v /opt/platform/calico/log:/ var /log/calico \ -v /run/docker/plugins:/run/docker/plugins \ -v /lib/modules:/lib/modules \ -v / var /run/calico:/ var /run/calico \ -v / var /run/docker.sock:/ var /run/docker.sock \ quay.io/calico/node:v2.6.2 ExecStop=-/usr/bin/docker stop calico-node Restart= on -failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target |
这里需要注意的是,官方的service配置中没有certs及docker.sock的映射路径,会导致calico找不到证书及无法启动容器
配置环境变量
1 2 3 4 5 6 7 8 9 10 11 12 | vim /opt/platform/calico/calico.env ETCD_ENDPOINTS= "https://172.16.150.25:2379,https://172.16.150.26:2379,https://172.16.150.27:2379" ETCD_CA_CERT_FILE= "/etc/calico/certs/ca.pem" ETCD_CERT_FILE= "/etc/calico/certs/etcd.pem" ETCD_KEY_FILE= "/etc/calico/certs/etcd-key.pem" CALICO_NODENAME= "" CALICO_NO_DEFAULT_POOLS= "" CALICO_IP= "" CALICO_IP6= "" CALICO_AS= "" CALICO_LIBNETWORK_ENABLED= true CALICO_NETWORKING_BACKEND=bird |
这里需要注意的是,此配置为容器内部读取的变量,所以证书路径为容器路径,而不是宿主机路径。
配置calicoctl的etcd存储
1 2 3 4 5 6 7 8 9 10 | mkdir -p /etc/calico/ vim /etc/calico/calicoctl.cfg apiVersion: v1 kind: calicoApiConfig metadata: spec: etcdEndpoints: https: //172.16.150.25:2379,https://172.16.150.26:2379,https://172.16.150.27:2379 etcdKeyFile: /opt/platform/calico/certs/etcd-key.pem etcdCertFile: /opt/platform/calico/certs/etcd.pem etcdCACertFile: /opt/platform/calico/certs/ca.pem |
这里需要注意的是,这是配置calicoctl调用etcd接口的环境变量,所以证书路径为宿主机路径。calicoctl 默认读/etc/calico/下的calicoctl.cfg
启动calico
1 | systemctl daemon-reload && systemctl enable calico-node && systemctl start calico-node |
以上配置均需要在每个node节点上操作
创建calico网络
1 2 | docker network create --driver calico --ipam-driver calico-ipam --subnet=10.233.0.0/16 calico docker network ls #查看docker所有网络 |
--driver calico:网络使用calico驱动
--ipam-driver calico-ipam:指定使用calico的IPAM驱动管理IP
--subnet:如果需要指定容器IP的话,需要指定calico网络的IP段calico是global网络,etcd会将calico-net1同步到所有主机
创建calico网络IP池
1 2 3 4 5 6 7 8 9 10 11 | calicoctl apply -f ipPool.yaml apiVersion: v1 kind: ipPool metadata: cidr: 10.233.0.0/16 spec: ipip: enabled: true mode: always nat-outgoing: true disabled: false |
查看calico IPAM配置
1 | ln -s /opt/platform/calico/calicoctl /usr/local/sbin/calicoctl #创建命令快捷方式 |
1 | calicoctl get ipPool |
cidr:IP地址段,docker默认为192.168.0.0/16
ipip:IP 地址封装,能实现不同网段的宿主机同docker网络通信,mode有always和cross-subnet 2种模式,实测cross-subnet模式下容器之间无法ping通,github上有类似的问题,貌似是BUG。
网络验证:
分别在node1和node2创建job
1 2 3 4 5 6 | node1 docker run --net calico --name workload-a -tid busybox docker run --net calico --name workload-b -tid busybox node2 docker run --net calico --name workload-c -tid busybox docker run --net calico --name workload-d -tid busybox |
ping测试
1 2 3 | docker exec workload-a ping -c 4 workload-b docker exec workload-a ping -c 4 workload-c docker exec workload-c ping -c 4 workload-d |
正常情况下,
同网络下能互相ping通,比如a和c(跨宿主)及a和b(同宿主)。
相关参考命令
查看网络
1 | docker network ls |
查看具体信息
1 | docker network inspect b69fb4a79dfb |
其中在Containers下就有容器的信息,其中EndpointID就是下面提到的workloadEndpoint
查看workloadEndpoint
1 | calicoctl get workloadEndpoint |
删除workloadEndpoint容器在calico服务停止的情况下被删除了,calico服务再次启动的时候注册到etcd里的数据并没会刷新掉被删除容器的信息,如果你启动的是固定IP的容器,则会提示workloadEndpoint信息冲突,需要手动去删除
1 2 3 | calicoctl delete workloadEndpoint 8173e77ea4b8dd69f68d21d846e99b27e57140dfdca28346ceeea50d4abc7e84 --node=W708- ATMQZLPR-1 --orchestrator=libnetwork --workload=libnetwork |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Vue3封装支持Base64导出的电子签名组件
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)