k8s基础概念

什么是k8s1

Kubernetes(k8s)是一个基于容器的集群管理平台。它拥有庞大,快速发展的生态系统,是基于 Google 多年大规模容器管理技术 Borg 的开源版本。

k8s能做什么,k8s提供了一个弹性运行分布式系统的框架。它负责您的扩展要求,故障转移,部署模式等。支持服务发现和负载平衡,存储编排,自动部署和回滚,(自动装箱)资源分配与限制,自我修复,密钥和配置管理这些功能。

容器发展史:戳这里

小孩子都能看懂的k8s入门指南: 动画版 , 插画版

一些名词和组件

名词解释

可以看到指南中涉及到很多对象,这些在k8s管理中都会被经常使用到:
container,pod,label,node,service,replication controller,volume,namespace

大致关系:k8s基础概念_第1张图片

简单总结下就是:

  1. node: 提供基础的cpu,内存等资源,可以是物理机或虚拟机,分master和worker,可运行多个pod;
  2. container: 运行在pod中,创建pod时可一次创建一个或多个,不能被直接访问,容器间通过lo虚拟接口通信;
  3. pod: k8s最基本的操作单元,可直接被访问,提供统一服务,pod中可以运行多个容器;
  4. label: 标签,是附着在资源对象上的一组或多组 Key/Value 键值对,用于指定对用户有意义的对象的属性,标签对内核系统是没有直接意义的,在创建对象时就可以指定;
    一般其他资源关联pod时就通过pod的label和label选择器关联。
  5. replication controller: 确保任何时候集群中有指定数量的 pod 副本(replicas)在运行。管理 pod 的生命周期,包括扩/缩容,滚动部署和监控等功能。方便支持k8s高可用,弹性伸缩这些功能;
  6. service: 类似iptables,service中定义了一系列映射规则,将pod服务端口映射到固定ip端口,对集群内外提供统一服务接口。原因是pod中的服务默认不能被集群外访问,并且pod是动态的,hostname和ip不固定,所以直接访问pod的服务比较困难。
  7. volume: 存储卷,挂载在pod上。防止pod被删数据丢失;方便外部配置,也方便多个pod共享配置/存储等,和docker的volume类似;
  8. namespace: 为集群提供虚拟的隔离作用,上面那些对象创建时都需要指定命名空间,默认是default;

组件

支撑上面那些对象和对象间调度的一些重要组件:
k8s 的node分master和worker:
master的组件: API Server ,Etcd,Scheduler,Controller-Manager
worker的组件: Kube-Proxy,Kubelet, docker, flannel
大致关系:戳图

k8s的架构和组件关系很复杂,举个栗子简单理解下各组件的作用吧:

栗子1

k8s创建pod处理流程:
k8s基础概念_第2张图片

  1. 客户端kubectl发起创建pod请求到api server;
  2. api server 处理请求,存储pod数据到etcd;
  3. scheduler 通过调度算法选择到合适的node,执行binding操作;
  4. kubelet 根据调度结果创建pod,绑定后,scheduler 调用api在etcd创建boundpod对象,将绑定信息和pod所有信息存放在boundpod对象中;
  5. kubelet 也会定期与etcd同步pod信息到etcd中,一旦发现应该在该工作节点上运行的boundpod对象没有更新,则调用Docker API创建并启动pod内的容器。

注: 因为观察者 list-watch 2的支持,各组件才能实时准确处理各种消息事件,具体表现为客户端(kubelet/scheduler/controller-manager)通过 list-watch 监听 apiserver 中资源(pod/rs/rc等等)的 create, update 和 delete 事件,并针对事件类型调用相应的事件处理函数。

栗子2

客户端访问pod中服务处理流程:

用户请求先到api server,再转发到用户空间监听在某个套接字上的kube-proxy上,proxy转到对应service ip,然后根据service规则代理访问某个pods上的服务。

总结:

  1. API Server : k8s的总控制器,k8s对外的唯一接口,所有请求都要通过api server。通过该接口对k8s上各种资源(Pod,Service,RC等)做增删改查操作,并获得API对象;
  2. Scheduler : 负责资源的调度,将pod通过某个调度算法调度到某个核实的node上;
    (踩坑记录1:若没有找到符合要求的node,pod会处于pending状态,直到出现符合要求的节点)
  3. Etcd: 所有master的持续状态都存在etcd的一个实例中。因为有内部有watch(观察者)的支持,各部件协调中的改变可以很快被etcd察觉,并通知相关组件。如service映射pod规则,如果pod被增删,其动态变化信息会存放在Etcd中,并通知service,service会自动重新做映射。
  4. Controller-Manager: 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  5. Kubelet: 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  6. Kube-proxy: 负责为Service提供cluster内部的服务发现和负载均衡;

还有其他一些Add-Ons

  1. CoreDNS : 负责为整个集群提供DNS服务;
  2. Ingress Controller: 提供7层负载均衡支持;
  3. Dashboard: 提供GUI界面
  4. 一些监控,日志收集检索等组件

安装

k8s安装比较复杂,安装的方式也有很多,下面只介绍下通过kubeadm安装,按照装基本没啥大问题(笑):

  • 通过kubeadm安装kubernates 1.14最佳实践,各组件以pod方式运行
  • 安装minikube(单机版)
  • github自动部署脚本,各组件以守护进程的方式运行

参考文档 kubernates 1.14最佳实践。。。的踩坑记录

踩坑记录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基础概念_第3张图片
这是因为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
...

k8s基础概念_第4张图片
踩坑记录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

k8s基础概念_第5张图片
说是cni配置错误,不支持什么版本之类的,不过这配置文件是在哪,也不说清楚,心酸。不过第二个错误有说,可能是在/etc/cni/net.d,可能和cbr0有关。。
k8s基础概念_第6张图片
不管了,先带着问题google一番,然后这个神仙文章会告诉你,cbr0的版本是" “cniVersion”:“0.3.1"”,lucky~~,修改下各个节点的10-flannel.conflist,在再重新kubectl apply -f kube-flannel.yml下,完美解决ヾ(°∇°)ノ゙
在这里插入图片描述
kubectl describe nodes
k8s基础概念_第7张图片
创建个deployment测试下:
在这里插入图片描述在这里插入图片描述
推荐文章:k8s-troubleshooting

To Be Continued


  1. https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/ ↩︎

  2. https://blog.csdn.net/weixin_43116910/article/details/88653263 ↩︎

你可能感兴趣的:(k8s)