因为这个坑其实有点深,如果其中每一个知识点都展开讨论,会使篇幅变得非常巨大,所以本篇知识点会有一些跳跃。
踩坑篇-证书、pod网络相关
上面的结果对我来说是一个大坑,但是踩坑过程也是学习中的一个重要组成部分。
从上面的情况来看,pod的yaml配置文件中是否暴露port这个问题已经不是重点,问题的重点在于为什么有的主机能访问到,有的主机不能访问。
我的测试环境:共3台服务器
server1:10.100.1.236 master节点
server2:10.100.1.237 worker节点1
server3:10.100.1.238 worker节点2
测试结果:
从236访问237的nginx,访问不到;
从236访问238的nginx,能访问到;
从237访问237的nginx,能访问到;
从237访问238的nginx,访问不到;
从238访问237的nignx,访问不到。
wr!这是咋回事啊!喝口水冷静一下。
查看系统pod是否都是正常的。果然,237的calico pod没有正常运行。
首先想到的是防火墙,检查防火墙配置,结果防火墙已经全部关闭,看来不是防火墙的问题。
不过这里也解开了我的其中一个疑惑:calico是用到iptables的转发功能的,之前担心如果关闭防火墙会不会影响它的使用,现在的结果中存在不同机器之间正常访问的情况,那就推出关闭防火墙不会影响calico正常使用。(备注:因为关闭防火墙会影响docker的网络使用,本人碰到过这个情况。)
回到我们的主要问题,不是防火墙,会不会是k8s的网络转发配置错了,或者是selinux没关掉,按照之前安装时的步骤重新执行一遍,结果还是不行。
去看那个不正常的calico pod的日志吧,其实开始就应该去看日志,但是对于一个新手,wtm不会看日志啊,于是要先解决k8s是如何查看日志的,现在回过来看比较简单,但刚上手时就像抹黑前行。
kubectl logs ...
貌似很简单的命令,其实这个命令更多的是输出pod内容器的日志,查看了我的那个出问题的calico pod,日志很少,完全看不出有用信息。
kubectl describe ...
这个才是查看pod详细信息的正确打开方式。
虽然知道了这个命令,但是不知道该看哪里,于是一行一行的看下来,这就是学习新知识麻烦之处,还好内容不是很多,看到了报错信息,简单说就是BGP错误(由于工作比较忙,写文档的时候距离我解决问题已经过去2天,当时也没有保留截图), BGP又是啥玩意儿。喝口水继续研究,印象中好像是calico的一个组成部分,再仔细过一下calico的原理。网上搜calico原理的文章不少,抄来抄去的不少,侧重点也不同,一定要多看,才能真正理解。关于BGP就不展开了,展开了又是一大段。
我这里出现BGP报错的的原因是calico pod在选取网卡的时候选错了,237有多块网卡,calico默认的选取方式是first detect,说白了就是随便选一个。结果就选了一个虚拟网卡,只能在本机访问,所以出现了上面有的能访问,有的不能访问的情况。
解决方案:指定IP_AUTODETECTION_METHOD参数的值,告诉calico如何选取网卡。
- name: IP_AUTODETECTION_METHOD
value: "interface=ens.*"
问题又来了,这段东西往哪儿加啊,我的配置文件和网上说的完全不同啊,一脸懵逼。
打开安装calico时的配置文件,耐心摸一遍。
再次阅读calico的文档,发现了calico的三种安装方式。我之前用的是calico的快速开始,下面的才是正确的打开方式。分成了3种情况:小于50节点、大于50节点、etcd存储。
- Install Calico with Kubernetes API datastore, 50 nodes or less
- Install Calico with Kubernetes API datastore, more than 50 nodes
- Install Calico with etcd datastore
尝试使用etcd的方式,因为k8s的基础数据都是存在etcd的,然后下载配置,在daemonset的container的env中,把IP_AUTODETECTION_METHOD加进去,启动试一下,结果说tls有问题。其实启动前我就想到了会有这个问题,但是k8s 的tls老复杂了,砰砰运气,果然还是不行。
再喝一口水,把k8s的tls证书再摸一遍。关于tls和上面的BGP,calico原理的学习需要花一点时间,但是还是有必要的(要不然也没法解决问题),也能学到不少东西。
言归正传,采用etcd的安装方式,需要的证书,在master上可能是没有问题的(偷懒不想去验证了),因为在master的/etc/kubernetes/pki目录下,证书密钥比较齐全,但是在worker节点就没有这些证书了,得手动去创建,创建方法,使用方法我都不清楚,而且在研究k8s tls证书的时候,sa.pub sa.key的知识点让我选择了第二种安装方式 Install Calico with Kubernetes API datastore, more than 50 nodes。
sa.pub sa.key
这两个是servie account用到的公私钥,作用是pod和apiserver通信,而且不需要手动配置到pod里面。而我们要安装的calico网络也正是有pod的方式组成的,正好解决了上面遇到的证书问题,准确说应该是绕过了证书问题。再回想一下k8s的网络通信,虽然k8s数据存在etcd,但是scheduler、control-manager都不是直接和etcd通信的,都是通过api server,所以我选择的第二种方式应该也是合理的。
然后根据官文操作,下载下来啥也不用改,直接启动,还是会出现bgp的问题,这次尝试中找到一个线索,237上的calico pod所使用的网络是192.168.84.1,这是一个虚拟网卡,确认了是网卡选择问题。
按照官文给出的方法,我们给他指定一个,我的网卡都是enp开头的,所以做如下配置。
在daemonset的calico node的container 的env里面添加
- name: IP_AUTODETECTION_METHOD
value: "interface=enp.*"
然后delete后重新create,等待一段时间,所有pod状态都变成running了。
然后尝试访问nginx,已经全部都通了。
这里再简单说一下下面两种方式的不同之处
- Install Calico with Kubernetes API datastore, 50 nodes or less
- Install Calico with Kubernetes API datastore, more than 50 nodes
第二种比第一种,实际上是再flex和api server之间多了一个缓存typha,用于减小api server的压力。(flex是什么:搜索calico原理,很多博文都会介绍的;typha不用多研究,只要知道它是缓存就可以了)
官文上也说了,要给typha指定replicas的数量,建议给每200个node配置一个typha,typha总数不要冲过20个,生产环境建议最少配置3个typha。我现在只是测试环境,为减小硬件开支,我只将其配置为 1。