Kubernetes

《Kubernetes生产级实践指南》课程手记-FAQ

本文主要是介绍《Kubernetes生产级实践指南》课程手记-FAQ,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1. calico网卡识别错误

Q:我的pod之间ping不通
Q:无法通过curl访问web服务
Q:有一个calico-node总是错误,启动不成功
A:网络有问题,一般都是calico插件的问题,calico就是k8s网络的具体实现者,也是负责人,所以网络问题第一个找它就对了。calico问题出现最多的就是ip识别错误,calico要实现对本机网络的完全控制,首先就得知道你的本机ip,默认它有一个算法自动识别,但根据你的网络情况有一定概率识别错误。这个问题有两种解决方式:
1、删掉识别错误的网桥,比如你运行了harbor,它会自动创建一个br-xxx的网桥,很容易被calico识别错。或者你之前做过一些网络相关的操作创建了一些没用的网桥。如果可以确认被错误识别的网桥没用可以删除。
删除过程:

# 登录到calico有问题的node
$ ssh 
# 查看calico容器启动日志,确认被calico选中的网桥(一般在启动最开始前几行日志)
$ docker logs  | less
# 查看所有网桥
$ ip a
# 停止网桥
$ ifconfig <网桥名> down
# 删除网桥
$ brctl delbr <网桥名>

2、指定calico的启动参数,正则匹配网桥名称或通过can-reach测试可用的网卡,在calico.yaml中找到IP这段,增加“IP_AUTODETECTION_METHOD”

# Auto-detect the BGP IP address.
- name: IP
  value: "autodetect"
# 下面是新增部分,给出了4种匹配模式示例
- name: IP_AUTODETECTION_METHOD
  # 完全匹配
  value: "interface=eth0"
  # 前缀匹配
  value: "interface=ens.*"
  # 多个名字或者
  value: "interface=(eth0|eth1)"
  # 通过can-reach测试可用网卡
  value: "can-reach=192.168.0.1"

2. harbor高可用

Q:前端nginx配置两个harbor的ip为什么不能访问?
Q:视频中为什么nginx只配置了一个harbor地址?如何高可用?
A:课程采用的主备方式的高可用,nginx配置的是基于4层的转发,允许分钟级的不可用,毕竟harbor影响的是新服务的发布,不会影响现有服务的运行。当服务不可用可以通过修改nginx配置快速切换到备的harbor。如果业务对harbor的高可用要求非常高,可以考虑使用共享存储的方式做,对harbor的侵入比较大,但也非常成熟,社区资料也非常多。

3. Ingress-Nginx问题

Q:访问tomcat 提示default backend - 404
Q:日志显示:services “ingress-nginx” not found
A:很多类似的问题是版本导致的,请使用课程中提供的配置文件,地址如下:
https://git.imooc.com/coding-335/course-docs/src/master/5
> 注意mandatory.yaml文件276行有nodeSelector的配置,只会调度在打标签的节点上,并且是host模式运行,对外提供80端口。
> 所以在apply之前要确保两点:
> 1、给要调度的节点打标签
> 2、确保要调度的节点上80和443端口没有被占用

4. APIServer高可用、负载均衡

关于高可用: 课程中只使用了两台master做keepalived高可用,很多同学有疑问为什么不是三台,三台当然更高可用啦,不过一般情况两台也足够了,第三台可以做planB,课程也可以减少些重复工作。
关于负载均衡: 课程没有对apiserver做负载均衡。可以在apiserver和keepalived之间架设一层haproxy做负载均衡,本质上完全是k8s外层的东西,并且这种架构在运维社区已经非常成熟,资料也非常多,课程就略过了。

5. kubeadm init参数(–experimental-upload-certs)

执行kubeadm ini时,在v1.16及以上版本会报错:unknown flag: --experimental-upload-certs,新版本不再支持此参数了,变更为:--upload-certs即可。

6. 安装prometheus出现错误:unable to recognize “”: no matches for kind “Alertmanager”

> 完整的错误:Error: validation failed: unable to recognize “”: no matches for kind “Alertmanager” in version “monitoring.coreos.com/v1”

用老师的资料一步步操作;不要下载https://github.com/helm/charts.git,用老师的deep-in-kubernetes/12-monitoring/prometheus-operator 就好。对于已经下载并安装出现错误的,我提供两条命令,重置后再按步骤重来就好:

$ kubectl delete crd servicemonitors.monitoring.coreos.com prometheusrules.monitoring.coreos.com prometheuses.monitoring.coreos.com alertmanagers.monitoring.coreos.com
$ helm reset

7. 云服务器要注意的点

用云服务器的同学们,跳过keepalived的章节,不要用虚拟ip(云环境一般都不支持自己定义虚拟ip)就直接把虚拟ip设置为第一个master的ip就可以了(global-config.properties文件中配置)。

> PS:如果是一定要高可用的话可以购买云商的负载均衡服务(比如阿里云的SLB),把backends设置成你的三个master节点,然后虚拟ip就配置成负载均衡的内网ip即可。

顺便也分享一下学员使用阿里云部署的经验分享:

> 已经看完视频了,不容易,对于用公网的服务器做测试小伙伴,我这里分享下我的经验。首先你得要让你所有的云服务器之间可以互相ping通,怎么做呢,首先最好你的所有服务器都是同个运营商的,然后利用运营商的PVC功能,把服务器之间做对等连接,就可以让云机器互相内网ping通了,做对等连接的时候,分配的内网Ip网段最好都是相似的不同网段,比较好管理,比如192.168.1.0/24,192.168.2.0/24,不能设置相同的,不然会冲突,做完对等连接,还需要所有服务器间互相配置路由,路由规则选对等连接。然后你就可以安心的照着老师的视频练习了。还有个小细节,记得搭建完基础服务的系统打包个镜像,一般云服务商都支持这个功能,省的后面k8s服务被你玩蹦了,每次要重装系统,又要搭建基础服务浪费时间。当然你也可以当练习

8. 镜像下载相关问题

如果遇到镜像下载失败的情况,常见的如"quay.io"开头的镜像。请把镜像地址修改为:registry.cn-hangzhou.aliyuncs.com/imooc/ 这个开头。
举个例子:
docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0失败了。
替换后->
docker pull registry.cn-hangzhou.aliyuncs.com/imooc/nginx-ingress-controller:0.19.0
如果依然不行请在问答区中贴出下载失败的镜像,我会及时上传。

9. 关于证书过期

一次性解决方案

时机

初次部署集群时或对集群改造升级时

思路

kubernetes签发证书是由controller-manager组件负责,有效时间默认是1年,通过修改controller-manager的参数,改变默认有效时间,一劳永逸。

实现

修改service配置/etc/systemd/system/kube-controller-manager.service
增加“–experimental-cluster-signing-duration=87600h”【十年有效期】

单台更新方案

时机

集群跑的好好的,突然发现个别节点证书过期了,集群正跑着重要业务不能重建,也不能停。不想动核心组件的配置。

思路

既然核心组件不能动,只能让过期的节点重新加入集群,从而更新证书,相当于延长一年。

实现

1、在管理节点创建token(kubeadm token create)
2、在证书过期的节点找到kubelet的bootstrap配置文件(一般在/etc/kubernetes目录)
3、修改bootstrap配置,更新新的token
4、清理配置

$ rm -f /etc/kubernetes/kubelet.kubeconfig
$ rm -f /etc/kubernetes/pki/kubelet*

5、重启kubelet

$ service kubelet restart

6、在管理节点approve加入请求

$ kubectl get csr
$ kubectl certificate approve xxx

kubeadm方式搭建的集群

目前个人没有亲自实践过,不能给出确切方案。
几个网上的方案供参考:
https://www.jianshu.com/p/289c62200818
https://cloud.tencent.com/developer/article/1689059

10. deployment不正常

先查看基本信息

# 查看deployment状态(重点关注:CURRENT、UP-TO-DATE、AVAILABLE)
$ kubectl get deployment -n 

# 查看pod状态(重点关注:READY、STATUS)
$ kubectl get pods -n 

通过基本信息一般可以归纳为下面几种情况:

- Pod的Status是Pending

pending表示暂时无法调度(比如资源不满足需求、没有镜像等)
可以通过下面命令查看具体原因

$ kubectl describe pod 

11. containerd 配置insecure-registries

镜像上传到harbor后,kubernetses默认下载是通过https下载的,containerd如何配置类似docker的insecure-registries呢?

修改 /etc/containerd/config.toml

在默认配置[plugins.“io.containerd.grpc.v1.cri”.registry.mirrors.“docker.io”]下添加如下内容:

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."hub.mooc.com"]
    endpoint = ["http://hub.mooc.com"]

重新启动containerd

$ systemctl restart containerd
这篇关于《Kubernetes生产级实践指南》课程手记-FAQ的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!