Kubernetes(k8s)是一个基于容器的集群管理平台。它拥有庞大,快速发展的生态系统,是基于 Google 多年大规模容器管理技术 Borg 的开源版本。
k8s能做什么,k8s提供了一个弹性运行分布式系统的框架。它负责您的扩展要求,故障转移,部署模式等。支持服务发现和负载平衡,存储编排,自动部署和回滚,(自动装箱)资源分配与限制,自我修复,密钥和配置管理这些功能。
容器发展史:戳这里
小孩子都能看懂的k8s入门指南: 动画版 , 插画版
可以看到指南中涉及到很多对象,这些在k8s管理中都会被经常使用到:
container,pod,label,node,service,replication controller,volume,namespace
简单总结下就是:
支撑上面那些对象和对象间调度的一些重要组件:
k8s 的node分master和worker:
master的组件: API Server ,Etcd,Scheduler,Controller-Manager
worker的组件: Kube-Proxy,Kubelet, docker, flannel
大致关系:戳图
k8s的架构和组件关系很复杂,举个栗子简单理解下各组件的作用吧:
注: 因为观察者 list-watch 2的支持,各组件才能实时准确处理各种消息事件,具体表现为客户端(kubelet/scheduler/controller-manager)通过 list-watch 监听 apiserver 中资源(pod/rs/rc等等)的 create, update 和 delete 事件,并针对事件类型调用相应的事件处理函数。
客户端访问pod中服务处理流程:
用户请求先到api server,再转发到用户空间监听在某个套接字上的kube-proxy上,proxy转到对应service ip,然后根据service规则代理访问某个pods上的服务。
还有其他一些Add-Ons:
k8s安装比较复杂,安装的方式也有很多,下面只介绍下通过kubeadm安装,按照装基本没啥大问题(笑):
踩坑记录2:apply flannel失败
最近在测试环境新安装了下k8s环境,虽然是说是安装1.14,但由于yum源更新,安装成了1.16,so,安装flannel插件时遇到DaemonSet api版本不对:
Error from server (Invalid): error when creating “kube-flannel.yml”: DaemonSet.apps “kube-flannel-ds-arm” is invalid: spec.template.metadata.labels: Invalid value: map[string]string{“app”:“flannel”, “tier”:“node”}: selector
does not match template labels
这是因为k8s一直在版本更新,对应的apiserver版本也在变化,如我安装的k8s都是1.16.3,对应DaemonSet api版本是 apps/v1。
参考方法:下载 kube-flannel.yml,将apiversion由 extensions/v1beta1 改为 apps/v1,添加对应selector(上图红框里的map[string]string),重新 kubectl apply -f kube-flannel.yml即可,注意yml文件格式。
...
apiVersion: apps/v1 #版本
kind: DaemonSet
metadata:
name: kube-flannel-ds-amd64 #我的服务器是amd64架构的,所以只改这个的版本即可
namespace: kube-system
labels:
tier: node
app: flannel
spec:
selector: #选择器
matchLabels:
app: flannel
tier: node
template:
metadata:
labels:
tier: node
app: flannel
...
踩坑记录3:NotReady
如果你和我一样,安装k8s那天运气不好,apply之后遇到节点一直NotReady的情况:
然后kubectl describe nodes
,发现:
runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
然后根据cni config uninitialized google,百度一番都没有结果,大多数人会建议删掉cni参数,如果你不需要cni插件只用k8s单机版,可以考虑(具体百度),有些人建议修改kube-flannel.yaml增加容忍度,增加了容忍度没啥用,还是要再排错一波。
然后很巧合的看了下kubelet的服务状态 systemctl status kubelet -l
发现了这些比较具体的错误:[plugin flannel does not support config version “”]
Nov 23 14:42:17 master kubelet[6656]: W1123 14:42:17.280754 6656 cni.go:202] Error validating CNI config &{cbr0 false [0xc0012422a0 0xc001242320] [123 10 32 32 34 110 97 109 101 34 58 32 34 99 98 114 48 34 44 10 32 32 34 112 108 117 103 105 110 115 34 58 32 91 10 32 32 32 32 123 10 32 32 32 32 32 32 34 116 121 112 101 34 58 32 34 102 108 97 110 110 101 108 34 44 10 32 32 32 32 32 32 34 100 101 108 101 103 97 116 101 34 58 32 123 10 32 32 32 32 32 32 32 32 34 104 97 105 114 112 105 110 77 111 100 101 34 58 32 116 114 117 101 44 10 32 32 32 32 32 32 32 32 34 105 115 68 101 102 97 117 108 116 71 97 116 101 119 97 121 34 58 32 116 114 117 101 10 32 32 32 32 32 32 125 10 32 32 32 32 125 44 10 32 32 32 32 123 10 32 32 32 32 32 32 34 116 121 112 101 34 58 32 34 112 111 114 116 109 97 112 34 44 10 32 32 32 32 32 32 34 99 97 112 97 98 105 108 105 116 105 101 115 34 58 32 123 10 32 32 32 32 32 32 32 32 34 112 111 114 116 77 97 112 112 105 110 103 115 34 58 32 116 114 117 101 10 32 32 32 32 32 32 125 10 32 32 32 32 125 10 32 32 93 10 125 10]}: [plugin flannel does not support config version ""]
Nov 23 14:42:17 master kubelet[6656]: W1123 14:42:17.280854 6656 cni.go:237] Unable to update cni config: no valid networks found in /etc/cni/net.d
Nov 23 14:42:22 master kubelet[6656]: W1123 14:42:22.285563 6656 cni.go:202] Error validating CNI config &{cbr0 false [0xc000a12120 0xc000a121a0] [123 10 32 32 34 110 97 109 101 34 58 32 34 99 98 114 48 34 44 10 32 32 34 112 108 117 103 105 110 115 34 58 32 91 10 32 32 32 32 123 10 32 32 32 32 32 32 34 116 121 112 101 34 58 32 34 102 108 97 110 110 101 108 34 44 10 32 32 32 32 32 32 34 100 101 108 101 103 97 116 101 34 58 32 123 10 32 32 32 32 32 32 32 32 34 104 97 105 114 112 105 110 77 111 100 101 34 58 32 116 114 117 101 44 10 32 32 32 32 32 32 32 32 34 105 115 68 101 102 97 117 108 116 71 97 116 101 119 97 121 34 58 32 116 114 117 101 10 32 32 32 32 32 32 125 10 32 32 32 32 125 44 10 32 32 32 32 123 10 32 32 32 32 32 32 34 116 121 112 101 34 58 32 34 112 111 114 116 109 97 112 34 44 10 32 32 32 32 32 32 34 99 97 112 97 98 105 108 105 116 105 101 115 34 58 32 123 10 32 32 32 32 32 32 32 32 34 112 111 114 116 77 97 112 112 105 110 103 115 34 58 32 116 114 117 101 10 32 32 32 32 32 32 125 10 32 32 32 32 125 10 32 32 93 10 125 10]}: [plugin flannel does not support config version ""]
Nov 23 14:42:22 master kubelet[6656]: W1123 14:42:22.285669 6656 cni.go:237] Unable to update cni config: no valid networks found in /etc/cni/net.d
说是cni配置错误,不支持什么版本之类的,不过这配置文件是在哪,也不说清楚,心酸。不过第二个错误有说,可能是在/etc/cni/net.d,可能和cbr0有关。。
不管了,先带着问题google一番,然后这个神仙文章会告诉你,cbr0的版本是" “cniVersion”:“0.3.1"”,lucky~~,修改下各个节点的10-flannel.conflist,在再重新kubectl apply -f kube-flannel.yml
下,完美解决ヾ(°∇°)ノ゙
kubectl describe nodes
创建个deployment测试下:
推荐文章:k8s-troubleshooting
To Be Continued
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/ ↩︎
https://blog.csdn.net/weixin_43116910/article/details/88653263 ↩︎