Kubernetes实战系列(1)
本来是打算开始刷LeetCode了,但是想想还是再加深对K8S的理解比较好。这个系列的文章其实是从一本书上摘录的,全称“Kubernetes实战构建生产级应用平台”,再加上我自身的一些理解。希望写作顺利!
K8S控制平面组件
虽然讲过但是还是再讲一次,主要是kube-apiserver、kube-controller-manage、kube-scheduler以及etcd。虽然K8S集群的状态存储服务不要一定要用etcd,但是这是常用的选择。这里我说的都是以容器的方式运行,或者说是以静态Pod的形式在宿主机上运行。
kube-apiserver主要是与K8S集群中的其他组件进行通信,还有与kubectl客户端进行交互。负责管理集群对象,包括创建和删除等,同时将对象的状态委托给后端的存储服务,如etcd。
kube-controller-manager则主要是调度对象的,根据etcd中的期望状态来与kube-apiserver通信,实现对象的期望状态。而kube-scheduler则是调度对象应该去哪个节点上,根据节点的内存和CPU情况。
etcd虽然在kubeadm搭建集群的时候是以容器形式安装的,但是也可以作为专用的存储服务器。在集群内的node数量比较大的时候,推荐作为单独的存储服务器,并且时刻注意备份etcd中的数据,因为时刻小心集群故障。
当然,还有kubelet需要提一提,因为这是主机与kube-apiserver通信的代理,负责向kube-apiserver报告节点的状态,并且与容器运行时进行通信。
容器运行时接口
首先讲一讲K8S中的容器运行时,我们知道k8S是通过容器运行时接口和容器进行交互的。所以任何实现该容器运行时接口的容器都能够作为K8S的容器运行时,包括cri-dockerd,containerd和CRI-O等。
注意docker并没有实现该CRI,所以需要使用cri-dockerd作为适配器。cri-dockerd会接受CRI请求并转化为docker的API调用,将docker返回的结果转化为符合CRI的结果。我们可以使用crictl客户端工具来调试CRI,也就是通过CRI来与容器进行交互。
既然是能够支持多种容器,那么存在多个容器运行时K8S怎么选择呢?答案是通过cri-socket参数来指定与实现CRI的容器的unix sock来进行通信。我们使用crictl的时候同样如此,指定对应容器运行时(实现CRI)的sock文件。
容器网络接口
其实也就是CNI,或许大家对于kube-proxy和caclio之间的功能作用会有点混淆。毕竟二者都是为K8S集群的网络工作的,但是两者的功能不同。
kube-proxy是为service服务提供clusterIP的,然后负责将流向该IP的流量转发给后端的Pod,并且能够实现负载均衡,以随机或者轮询的方式。使用 iptables 或 ipvs 模式,在节点内核中设置网络规则,来实现流量的转发。
前面说的kube-proxy能够为service服务提供IP,但是不能够为Pod提供虚拟IP。因为K8S本身就不为集群提供网络功能,而是使用实现CNI的插件。而caclio是一种CNI插件,提供PodIP,并且实现了网络策略NetworkPolicy,而且支持边界网关路由协议。
同样实现CNI的插件有flannel等,我们需要在每个节点上都安装这样的插件。但是也可以通过daemonset配置集来部署,同样是作为Pod在每个节点上运行,只不过使用的是nodeIP而没有PodIP。
如果某个节点没有安装 Calico,那么该节点上的 kubelet 就无法为 Pod 分配 IP 和设置网络,导致 Pod 处于 ContainerCreating 状态并失败。不过CNI 关注的不是 Pod,而是 Pod 中的基础设施容器(pause 容器)。网络 namespace 由该容器创建,其他业务容器共享该网络空间。
访问控制
除了K8S的组件需要和kube-apiserver通信之外(主机用kubelet代理和apiserver通信),用户或者工作负载也需要和kube-apiserver通信。但是为了确保数据不会泄露,通信必须是安全的并且是受限的。
为什么节点能够和apiserver通信呢,因为在节点加入集群的时候添加了token。如果主用户要用kubectl与apiserver通信,注意将/etc/kubernetes/admin.conf文件放在该用户的家目录下。
至于其他用户要与apiserver通信的话,可以通过集群的role或者clusterrole来设置权限。然后绑定到对应的用户上,当然可以绑定到serveraccount上,提供给Pod使用。
但是什么样的工作负载需要访问集群资源呢?那就只能是控制器了,用于创建或者删除对应的集群资源,因为有很多集群资源是自定义的资源,可以由用户自己定义管理规则。
K8S目录介绍
/etc/kubernetes/存放 Kubernetes 集群的核心配置文件,包括控制平面组件的配置和认证文件。该目录下的manifests目录下存放着静态pod的yml文件。
该目录也存放着kubelet 组件的配置文件kubelet.conf,包含节点认证信息。还有admin.conf文件,也是集群管理员(root)的 kubeconfig 文件,用于通过 kubectl 管理集群。
/var/lib/kubelet/目录则是kubelet 的数据目录(Pod 清单、卷挂载等),而/var/lib/etcd/则是etcd 数据库的存储目录(如果 etcd 是独立部署)。
还有/opt/cni/bin/ 和 /etc/cni/net.d/目录,前者是所有 CNI 插件二进制文件 的存放位置。这些插件是实际干活的程序,负责创建、删除网络设备、分配IP等具体操作,后者是是 CNI 配置文件 的存放目录。这些文件(通常以 .conf 或 .conflist 结尾)告诉 Kubelet 和 CNI 插件如何使用上面 bin/ 目录中的插件来配置网络。
/var/lib/docker/则是Docker 的默认数据存储目录(镜像、容器、卷等),很多时候我们可以通过该目录查看容器的根文件系统,还有命名空间等。
更多推荐


所有评论(0)