前言
最近被安排去给部门独立整一套k8s环境,于是一个人撑起了一个运维的团队(并不是)。
前前后后弄了4-5天,算是搭了一个可用的环境,踩了也不知道多少个坑。

所以写一篇文章记录下自己遇到的坑以及如何解决的,都是干货,希望能帮到正在搭建k8s集群环境的你。
本文并非新手向,不介绍基本概念,希望各位多包涵。涉及到的概念可以去其他的优秀文章系统学习。
集群搭建
我一共用到4台机器,centos 7,k8s版本1.17.0, docker版本19.3.5 ,其中1台作为master,3台作为node集群,只能说并不是非常HA,能够应付比较小并发的场景。

集群的搭建我是按照掘金的另外一篇文章搭建的,按照他的做法一步步下去是基本可以搭建成功一个集群的,当然了,还是有一些问题的,要不然也不会有我篇记录了。
贴上文章链接:juejin.cn/post/684490… (我使用的)
顺便介绍下github上一个开源项目,可以使用ansible脚本一键安装:github.com/easzlab/kub…
踩坑记录
首先说一下,原文博主搭建的前提是,关闭防火墙,但是我们使用线上环境的时候,不能完全关闭,所以我是选择打开对应的端口:
master:


0.原文中的坑:
这一点我放在最前面,按照上文链接搭建k8s集群初始化master的时候,我们会安装calico网络组建,原文中博主要求我们修改calico.yaml
,将原有的192.168.0.0/16
修改为 10.96.0.0/12
:

如果你做了这一步,那么后面你的pod是无法访问外网的,这个坑困扰了我很久。具体的原因和k8s的底层网络转发有关,pod的网段不能和你初始化的网段相同,否则pod的请求永远无法转发出去,所以我们要做的是,修改calico.yaml
中的 CALICO_IPV4POOL_CIDR
为192.168.0.0/16
或者其他不重复网段

1.calico.yaml的修改
我们需要修改一下calico.yaml解决node节点calico通信失败问题
calico.yaml 文件添加以下二行
- name: IP_AUTODETECTION_METHOD
value: "interface=ens.*" # ens 根据实际网卡开头配置
配置如下
- name: CLUSTER_TYPE
value: "k8s,bgp"
- name: IP_AUTODETECTION_METHOD
value: "interface=ens.*"
#或者 value: "interface=ens160"
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Always"
然后要开一下179端口

2.image pull失败
这个问题在启动pod的时候会出现,describe pod先确认下是否是这个问题。如果是, 首先尝试一下你是否能login到你的镜像库
docker login --username=你的用户名 harbor.xxxx(你的镜像库地址,我以harbor举例)
然后输入密码,如果报错,先去查看配置下你的dns解析,路径为:
/etc/resolv.conf
然后需要生成一个sercet认证,
kubectl create secret docker-registry 自定义名字 --docker-server=harbor.xxxxx.tech --docker-username=用户名 --docker-password=密码
最后在你的deployment.yaml中加上
imagePullSecrets:
- name: 自定义名字

3.ingress 10245端口请求失败
这个问题发生在配置ingress的时候,ingress会去请求10254端口进行健康检查。
网上也有很多攻略,说在kube-proxy配置文件中加一行-masquerade-all=true
但是博主的这个方式安装的kube-proxy是docker启动的,配置文件根本找不到😒。
其实他是读取的configMap的配置,我们使用命令kubectl edit cm kube-proxy -n kube-system
可以查看到kube-proxy的配置文件。
这里修改两个地方,一个是将网络模型改成 ipvs的,它默认是iptables的:

第二个就是加上masquerade-all=true
,不过写法有些不一样,上图可以看到,在iptables的模型中,masqueradeAll: false
,我们可以将它提到全局的变量中,如:

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
接着执行:
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
最后重启kube-proxy:
kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
这里我说一下,我不太清楚是否需要切换成ipvs模型,是否有可能iptables模式下,将masqueradeAll
设置为ture也能成功,但是总之ipvs也没坏处🤣。
4.ingress启动后报错: err services "ingress-nginx" not found
请参考github上的解决方案:
待续。。。
目前先写这么多坑,后期遇到会持续补充,本人k8s纯小白一个,也是迫于生活兼任起了运维,同时也理解了运维同志们的不容易!如果有什么错误的地方,欢迎大家及时指正!
补一张pod状态图吧,强迫症福音😉
