干货!Kubernates集群搭建及初始化spring cloud环境中遇到的坑

2,107 阅读4分钟

前言

最近被安排去给部门独立整一套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:

node:

0.原文中的坑:

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

如果你做了这一步,那么后面你的pod是无法访问外网的,这个坑困扰了我很久。具体的原因和k8s的底层网络转发有关,pod的网段不能和你初始化的网段相同,否则pod的请求永远无法转发出去,所以我们要做的是,修改calico.yaml中的 CALICO_IPV4POOL_CIDR192.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端口

原文档:docs.projectcalico.org/v3.8/gettin…

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的:

修改mode为"ipvs";

第二个就是加上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上的解决方案:

github.com/kubernetes-…

待续。。。

目前先写这么多坑,后期遇到会持续补充,本人k8s纯小白一个,也是迫于生活兼任起了运维,同时也理解了运维同志们的不容易!如果有什么错误的地方,欢迎大家及时指正!

补一张pod状态图吧,强迫症福音😉