Kubernetes三探(安装calico,join,以及遇到的问题)

5 篇文章 0 订阅

昨晚加班到10点····搞这个破玩意儿
言归正传
上一篇在master成功 kubeadm init了,但是安装network add-on时总是出错。今天来再试一试。
首先我是按照这篇博文安装的,
https://blog.csdn.net/weixin_43645454/article/details/124952184
因为国内安装真的太多坑了。官网根本没法看

首先我按照这篇博文没有成功安装calico,原因是:
在kubeadm init 时 配置了serviceSubnet,很明显是service的子网的意思
同时 在calico.yml 中配置的是CALICO_IPV4POOL_CIDR,意思是pod ip池
博文中介绍要一样。
但实际上。apiservice的网段跟 pod的网段 是不一样的。我目前成功启动的配置是:

networking:
  dnsDomain: cluster.local
  serviceSubnet: 172.21.0.0/16
  podSubnet: 172.22.0.0/16

然后calico.yml 中:

    - name: CALICO_IPV4POOL_CIDR
      value: "172.22.0.0/16"

这样就成功启动了。

下面说一下遇到的问题:
错误1:
kubectl apply -f calico.yaml 后,calico-node报错
或者worker节点join后,calico-node 启动失败(例如:CrashLoopBackOff )

929 16:12:48 master kubelet[12272]: E0929 16:12:48.116920   12272 remote_runtime.go:222] "RunPodSandbox from runtime service failed" err="rpc error: code = Unknown desc = failed to setup network for sandbox \"71281bf7c6d991756cac784f7c9943e200a3e69fa49afe3299f98c6a5fd6b366\": plugin type=\"calico\" failed (add): stat /var/lib/calico/nodename: no such file or directory: check that the calico/node container is running and has mounted /var/lib/calico/"
929 16:12:48 master kubelet[12272]: E0929 16:12:48.117002   12272 kuberuntime_sandbox.go:71] "Failed to create sandbox for pod" err="rpc error: code = Unknown desc = failed to setup network for sandbox \"71281bf7c6d991756cac784f7c9943e200a3e69fa49afe3299f98c6a5fd6b366\": plugin type=\"calico\" failed (add): stat /var/lib/calico/nodename: no such file or directory: check that the calico/node container is running and has mounted /var/lib/calico/" pod="kube-system/calico-kube-controllers-58dbc876ff-bc5dg"
929 16:45:31 master kubelet[32709]: E0929 16:45:31.311990   32709 pod_workers.go:965] "Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"calico-kube-controllers-58dbc876ff-7lxsj_kube-system(1eec9a3f-6310-492d-b2c5-c6278356c48e)\" with CreatePodSandboxError: \"Failed to create sandbox for pod \\\"calico-kube-controllers-58dbc876ff-7lxsj_kube-system(1eec9a3f-6310-492d-b2c5-c6278356c48e)\\\": rpc error: code = Unknown desc = failed to setup network for sandbox \\\"84dfe491af29e30551e124ac6c73bfcd2ffd089ab900192d745441868083f6dd\\\": plugin type=\\\"calico\\\" failed (add): error adding host side routes for interface: cali11848191ccc, error: route (Ifindex: 9, Dst: 10.0.0.1/32, Scope: link) already exists for an interface other than 'cali11848191ccc': route (Ifindex: 5, Dst: 10.0.0.1/32, Scope: link, Iface: cali13a7d337791)\"" pod="kube-system/calico-kube-controllers-58dbc876ff-7lxsj" podUID=1eec9a3f-6310-492d-b2c5-c6278356c48e

这个是因为calico安装 卸载了很多次,有时候 k delete -f calico.yaml 没有删除虚拟网卡或者路由(暂时这样称呼,暴露了我基础知识的薄弱,鸟哥的书买了好几年也没有看,要把这个提上日程了)。
解决办法:

// 每次kubeadm reset 后
// 都要先删除网络的配置,其实reset的提示里有让删除这个
rm -rf /etc/cni/net.d/*
// 然后删除 遗留的路由或网卡
// link/ipip 或 link/ether

// 查询网卡/路由
ip a / ip addr / ip link / ip route
或者
ifconfig
// 如果能看到别的网卡 例如我的是这样
[root@master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:2f:98:e0 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic enp0s3
       valid_lft 65590sec preferred_lft 65590sec
    inet6 fe80::be6e:ee2a:bcd9:e981/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:bc:f7:2b brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.106/24 brd 192.168.56.255 scope global noprefixroute dynamic enp0s8
       valid_lft 552sec preferred_lft 552sec
    inet6 fe80::5753:6a6a:3f3:6f5b/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:cc:58:a5:6e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
15: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
    inet 172.22.219.64/32 scope global tunl0
       valid_lft forever preferred_lft forever
16: cali9035434f5df@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
17: cali4af7a3781d7@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
18: calib71dfeb1411@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever

// 后面三个 cali开头的还有tunl0都是要删除的
modprobe -r ipip // 删除tunl0
ip link delete cali23bcdbdbc8c // 删除cali开头的ip link


错误2:
worker join 后 的calico-node 报的错

929 16:55:44 master kubelet[9251]: E0929 16:55:44.151178    9251 pod_workers.go:965] "Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"coredns-c676cc86f-dh5bn_kube-system(70d1a056-dd07-4162-b350-85d6be15276b)\" with CreatePodSandboxError: \"Failed to create sandbox for pod \\\"coredns-c676cc86f-dh5bn_kube-system(70d1a056-dd07-4162-b350-85d6be15276b)\\\": rpc error: code = Unknown desc = failed to setup network for sandbox \\\"b1bced40c96601e0c114392e6388991a6609fcfd81ac2f1c2a359840f272e997\\\": plugin type=\\\"calico\\\" failed (add): error getting ClusterInformation: Get \\\"https://10.0.0.1:443/apis/crd.projectcalico.org/v1/clusterinformations/default\\\": dial tcp 10.0.0.1:443: connect: connection refused\"" pod="kube-system/coredns-c676cc86f-dh5bn" podUID=70d1a056-dd07-4162-b350-85d6be15276b
2022-09-29 13:22:02.617 [FATAL][1] cni-installer/<nil> <nil>: Unable to create token for CNI kubeconfig error=Post "https://10.244.0.1:443/api/v1/namespaces/kube-system/serviceaccounts/calico-node/token": dial tcp 10.244.0.1:443: i/o timeout

查看下url
https://10.0.6.1:443/api/
很明显,请求的ip是我当时设置的CALICO_IPV4POOL_CIDR,ip咋会是443? 我在init.yaml 里面是这样定义的

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.56.106
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: master
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.25.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 172.21.0.0/16
  podSubnet: 172.22.0.0/16
  
scheduler: {}

绑定的端口是6443。所以,就像开头说的,把serviceSubnet和podSubnet分开,启动成功。还要注意网段,我的虚拟机的网段都是192的。
看了百度上很多 解决办法

//有说在calico.yaml中加入KUBERNETES_SERVICE_HOST和KUBERNETES_SERVICE_PORT的

- name: KUBERNETES_SERVICE_HOST
  value: "kube-apiserver"  # master apiserver 地址
- name: KUBERNETES_SERVICE_PORT
  value: "6443"
- name: KUBERNETES_SERVICE_PORT_HTTPS
  value: "6443"
  
//有说加IP_AUTODETECTION_METHOD的
            - name: IP_AUTODETECTION_METHOD
              value: "interface=enp.*"
     
//官网上说可以加一个ConfigMap来设置,也尝试了
https://projectcalico.docs.tigera.io/maintenance/ebpf/enabling-ebpf#configure-calico-to-talk-directly-to-the-api-server

kind: ConfigMap
apiVersion: v1
metadata:
  name: kubernetes-services-endpoint
  namespace: kube-system
data:
  KUBERNETES_SERVICE_HOST: "192.168.56.106"
  KUBERNETES_SERVICE_PORT: "6443"
  KUBERNETES_SERVICE_PORT_HTTPS: "6443"
  

反正最后都没有成功,最后还是修改子网的配置成功了,因为网段压根不一样。
最后worker节点成功加入集群

[root@master ~]# kubectl get pods --all-namespaces -owide
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
kube-system   calico-kube-controllers-58dbc876ff-pvpft   1/1     Running   0          4h15m   172.22.219.66    master   <none>           <none>
kube-system   calico-node-bd4vg                          1/1     Running   0          4h15m   192.168.56.106   master   <none>           <none>
kube-system   calico-node-p98gc                          1/1     Running   0          4h12m   192.168.56.107   node01   <none>           <none>
kube-system   coredns-c676cc86f-lq4kx                    1/1     Running   0          4h15m   172.22.219.65    master   <none>           <none>
kube-system   coredns-c676cc86f-rjkp8                    1/1     Running   0          4h15m   172.22.219.67    master   <none>           <none>
kube-system   etcd-master                                1/1     Running   9          4h15m   192.168.56.106   master   <none>           <none>
kube-system   kube-apiserver-master                      1/1     Running   0          4h15m   192.168.56.106   master   <none>           <none>
kube-system   kube-controller-manager-master             1/1     Running   0          4h15m   192.168.56.106   master   <none>           <none>
kube-system   kube-proxy-4k9rr                           1/1     Running   0          4h12m   192.168.56.107   node01   <none>           <none>
kube-system   kube-proxy-mzp7q                           1/1     Running   0          4h15m   192.168.56.106   master   <none>           <none>
kube-system   kube-scheduler-master                      1/1     Running   9          4h15m   192.168.56.106   master   <none>           <none>

[root@master ~]# k get nodes
NAME     STATUS   ROLES           AGE     VERSION
master   Ready    control-plane   4h15m   v1.25.0
node01   Ready    <none>          4h11m   v1.25.0

最后说一下,其实k8s 官方文档里面 troubleshooting kubeadm 页面的东西能解决你 99.99%的问题。剩下 0.01%是网络环境的问题。
但是这0.01%的网络问题很难··因为不太了解linux网络的东西。
比如安装ipset及ipvsadm,都是啥··
还有 搜索问题应该是
1、去官网找
2、去github上找相关issue
3、实在没办法,百度

最后总结下查找错误日志的命令,这些也很重要,要不然你都无从下手。

// 查看配置
kubectl config view
// kubernetes查看当前context
kubectl config get-contexts
// 切换名称空间
kubectl config set-context --current --namespace=<namespace>
// get 所有 pod
kubectl get pods --all-namespaces
// 更详细
kubectl get pods --all-namespaces -owide
// 删除 pod 或者 node
kubectl delete pod -n kube-system coredns-6f4fd4bdf-8q7zp
kubectl delete nodes node01

// kubelet 的日志
journalctl -xefu kubelet
// 查询某个pod,仔细观察日志
kubectl describe pod -n kube-system pod_name 
// 查询某个pod的某个container的日志 
kubectl logs -n kube-system calico-node-jx4k5 -c install-cni
// watch 很有意思
watch kubectl get pods --all-namespaces
// 查询状态
systemctl status kubelet
// 给node设置标签
kubectl label no node2 kubernetes.io/role=test-node

基本就这三板斧 describe logs journalctl

好,下一篇开始部署点东西试试

不太对啊,还是有问题

Warning  Unhealthy  69s (x2 over 70s)  kubelet            Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: connection refused

虽然是个warning,但不知道会不会有什么问题,反正目前都正常,都在running状态

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Kubernetes是一种容器编排和管理系统,而Calico是一种网络插件,用于为Kubernetes集群提供高性能、可扩展和安全的网络互连。 Kubernetes作为容器编排和管理系统,负责管理和调度容器化的应用程序。它提供了一个统一的管理界面,使得用户可以方便地定义、部署和管理容器。但是,Kubernetes只关注容器的调度和管理,对于容器之间的网络连接则没有提供特定的解决方案。 而Calico则提供了一种容器网络解决方案,旨在为Kubernetes集群提供高性能、可扩展和安全的网络互连。它基于Linux内核的网络技术,如Linux虚拟路由、BGP路由协议等,提供了一套灵活的网络架构。通过将Kubernetes集群中的每个节点配置为一个路由器,Calico能够实现容器之间的直接通信,而无需通过NAT或其他网络转换技术。这样可以提供更低的网络延迟和更高的网络吞吐量。 除了高性能和可扩展性,Calico还提供了安全性方面的功能。它支持基于网络策略的安全控制,可以定义和限制容器之间的通信规则。通过使用网络策略,用户可以实现微服务之间的安全隔离,确保只有经过授权的容器可以相互通信。 总之,KubernetesCalico是两个不同但相关的技术。Kubernetes是用于容器编排和管理的系统,而Calico是提供高性能、可扩展和安全的网络连接的插件。它们可以一起使用,通过Calico插件为Kubernetes集群提供高效和可靠的容器网络解决方案。 ### 回答2: Kubernetes是一种用于容器编排和管理的开源平台,而Calico是一种用于容器网络的开源软件定义网络(SDN)解决方案。它们可以一起使用来提供强大和可靠的容器平台。 Kubernetes提供了容器编排和管理功能,允许用户在集群中创建、部署和管理容器化应用程序。它可帮助用户自动化容器的创建、启动、停止和销毁,并提供负载均衡、服务发现和自动扩展等功能。Kubernetes提供了一个灵活可扩展的架构,能够适应不同规模的应用和不同类型的基础设施。 Calico是一个开源的容器网络解决方案,它使用了标准的IP路由协议来提供高性能和高度可扩展的容器网络。Calico使用BGP(边界网关协议)来管理容器之间的网络连接,并提供了灵活的控制面和数据面,可以与Kubernetes无缝集成。 KubernetesCalico的结合可以提供更强大的容器平台。Kubernetes通过提供容器编排和管理功能来简化应用程序的部署和管理,而Calico则负责管理容器之间的网络连接和流量控制。使用Calico可以实现容器之间的高性能通信,并提供网络策略控制,以确保容器间的安全性。 总而言之,Kubernetes提供了容器的编排和管理功能,而Calico则提供了容器网络的解决方案。它们可以一起使用来构建可靠、高性能和安全的容器平台。 ### 回答3: Kubernetes是一个开源的容器编排和管理平台,而Calico是用于网络与网络安全的Kubernetes插件。 Kubernetes是用于管理容器化应用程序的平台,它可以自动管理和编排容器的生命周期,并提供了水平扩展、自我修复和服务发现等功能。而Calico是一个网络解决方案,它为Kubernetes集群提供了高性能、高可靠性和灵活性的网络连接Calico使用BGP协议,为Kubernetes集群中的每个节点提供独立的虚拟网络,使得所有容器都能够在不同主机上相互通信。Calico利用Linux的内核技术来实现网络隔离和安全性,通过为每个容器分配唯一的IP地址,实现容器之间的通信和访问控制。 在Kubernetes中,Calico还提供了网络策略的功能,可以通过定义网络策略规则来控制容器之间的通信。这些规则可以基于IP地址、端口、协议和标签等进行匹配,从而实现微服务之间的灵活和可靠的通信。Calico还支持加密和认证功能,可以确保容器之间的通信是安全和保密的。 总而言之,KubernetesCalico是两个互补的技术,Kubernetes提供了容器编排和管理的功能,而CalicoKubernetes提供了高性能、高可靠性和灵活性的网络解决方案,使得容器之间可以安全、可靠地通信和交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值