5-7 关于 kubectl apply -f calico.yaml 后续1

来源:5-7 网络插件-Calico_1

yl_testimooc3804939

2022-01-07

1、上一个问题:"https://coding.imooc.com/learn/questiondetail/vQW1lYEpBm7PyE9A.html"
证书我生成失败了,是忘记加"KUBERNETES_SVC_IP=10.233.0.1"变量,重新修改好了。

2、当执行"kubectl apply -f calico.yaml"时,发现状态依然不对:

[root@node-1 ~]# kubectl get po -n kube-system
NAME                                       READY   STATUS              RESTARTS   AGE
calico-kube-controllers-558995777d-kh2l7   0/1     ContainerCreating   0          67m
calico-node-88lc4                          0/1     CrashLoopBackOff    21         67m
calico-node-g4shr                          0/1     CrashLoopBackOff    21         67m
nginx-proxy-node-3                         1/1     Running             1          134m

解决方案:

通过执行
[root@node-1 ~]# kubectl logs pod/calico-node-g4shr -n kube-system --tail=100 calico-node
2022-01-06 20:53:20.010 [ERROR][9] startup/utils.go 179: 
Unable to write to /var/lib/calico/nodename error=open /var/lib/calico/nodename: is a directory

发现这个文件变成了目录,因为在上面"1上一个问题"中列出的错误日志中,
打印/var/lib/calico/nodename不存在,我就给创建成目录了,
nodename这个应该是个calico自己生成的文件,现在当我删除/var/lib/calico/nodename目录,
重新创建/var/lib/calico,POD状态都正常了。

[root@node-1 ~]# kubectl get po -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-558995777d-27mk7   1/1     Running   0          7m12s
calico-node-56n6f                          1/1     Running   0          7m16s
calico-node-jl5zt                          1/1     Running   1          7m16s
nginx-proxy-node-3                         1/1     Running   1          20h

--------------------------------------------------问题的前置内容--------------------------------------------

在"修改IP自动发现"章节中,

修改前:
- name: IP
  value: "autodetect"
修改后:
- name: IP
  valueFrom:
    fieldRef:
      fieldPath: status.hostIP

您修改了这里的内容,在视频中您说
"
经过实践证明,autodetect这种发现方式经常会出现问题,
比如每一条机器的网卡不太一样,一些服务器可能配置了虚拟的网卡,
此时kubelet可能就将错误的网卡识别成真实的IP的地址,从而导致POD网络的不正常。
所以说直接添加真实的IP地址,status.hostIP,因为它是以host network模式启动的,肯定是能取到这个字段的。
这样的话,就不会取错IP了。
"

---------------------------问题1、1

host network模式下,除了127.0.0.1的网卡外,真实IP的网卡就一个,比如192.X.X.X,这样设置status.hostIP的话,是不是取得就是这个192的IP?其他虚拟网卡的就识别不到了?
如果能真正取到真实IP的话,那么有什么方式可以证明取到的IP对呢?
比如日志?我在journalctl -f下,看到node-2 和node-3节点,打印出了如下内容

node-2节点: Using node IP: “X.X.X.X”
node-3节点: Using node IP: “X.X.X.X”

这个是不是就能证明取到的真实IP?

---------------------------问题1、2

您解决的是在仅主机模式host network下,可是在我的虚拟机中,我使用的是NAT模式,有三张网卡,
网卡ifcfg-ens33: 10.0.0.X网段,为公网IP。
网卡ifcfg-ens37: 172.16.1…X网段,为内网IP。.
网卡ifcfg-lo: 默认127.0.0.1,略。
每个节点IP的最后,node-1为21结尾,node-2为22结尾,node-3为23结尾。

那么在这个NAT模式下,node-1节点,修改calico.yaml中

 - name: IP
   value: "autodetect"
   #仅仅加入
   #这个是根据这个问题"https://coding.imooc.com/learn/questiondetail/W48BaXRzEVQXALwG.html"找到的。
 - name: IP_AUTODETECTION_METHOD
   value: "can-reach=172.16.1.21"
#保持不变
 - name: CALICO_IPV4POOL_CIDR
   value: "10.200.0.0/16"

这样是否正确呢?还是说直接改成您在视频中教的内容?

 - name: IP
   valueFrom:
    fieldRef:
      fieldPath: status.hostIP  
 - name: CALICO_IPV4POOL_CIDR
   value: "10.200.0.0/16"

无论我用上述哪种方式,当执行完"kubectl apply -f calico.yaml"时,所有POD的状态最终都是下述正常状态,这里我不确定到底怎么配,麻烦老师指导下,谢谢。

[root@node-1 ~]# kubectl get po -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-558995777d-27mk7   1/1     Running   0          7m12s
calico-node-56n6f                          1/1     Running   0          7m16s
calico-node-jl5zt                          1/1     Running   1          7m16s
nginx-proxy-node-3                         1/1     Running   1          20h

老师您配置的"status.hostIP"在calico官网的哪个链接找到的,能否告知下,谢谢。

---------------------------问题1、3

在上述1、2中,那两种配置,当每次修改完执行"kubectl apply -f calico.yaml"时,node-1的journalctl -f后,日志会输出好长一串内容,中间省略一些:

Jan 07 05:43:51 node-1 kube-controller-manager[2030]: **E0107** 05:43:51.586641    
2030 daemon_controller.go:320] kube-system/calico-node failed with : error storing status for daemon set 
&v1.DaemonSet{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, 
ObjectMeta:v1.ObjectMeta{Name:"calico-node", GenerateName:"", 
Namespace:"kube-system", SelfLink:"", UID:"8505fa1f-6c6e-4406-aa79-634daf85946d", ResourceVersion:"21380", Generation:16, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:63777093359, 
loc:(*time.Location)(0x6f31360)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string{"k8s-app":"calico-node"}, 
略。。。。。。。。。。。。。。。。。。。。。。
 CollisionCount:(*int32)(nil), Conditions:[]v1.DaemonSetCondition(nil)}}:
最后的内容
 **Operation cannot be fulfilled on daemonsets.apps "calico-node": the object has been modified; please apply your changes to the latest version and try again**

这一大段输出的内容是否有影响呢?但最终的都是如下内容。

[root@node-1 ~]# kubectl get po -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-558995777d-27mk7   1/1     Running   0          7m12s
calico-node-56n6f                          1/1     Running   0          7m16s
calico-node-jl5zt                          1/1     Running   1          7m16s
nginx-proxy-node-3                         1/1     Running   1          20h
写回答

1回答

刘果国

2022-01-07

1、calico容器启动日志有打印使用的ip地址

2、配置方法可以参考文章:https://www.imooc.com/article/298228

pod状态是没问题的,这里配置的ip影响的是pod间的通讯,最终需测试确认是否ok

3、跟2一样做一下测试 以结果为准(测试在课程中有)

0
0

Kubernetes生产落地全程实践

一个互联网公司落地Kubernetes全过程点点滴滴

2293 学习 · 2216 问题

查看课程