k8s基础

一、k8s组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97UFtqWX-1691657414960)(D:\云计算学习资料\云计算三阶\k8s\第一章\k8s组件.png)]

K8S 有 master 和 worker node 两类节点
master节点上有 apiserver  controller-manager  scheduler 以及使用 etcd 做 k8s 集群的数据库
node节点上有 kubelet  kube-proxy   容器引擎/容器运行时(docker、containerd)

二、k8s组件作用

1.master节点

apiserver:是所有服务请求的统一访问入口

controller-manager:控制器管理器,负责管理为Pod副本集、命名空间、端点、node等资源对象以及部署的控制器;通过apiserver监控整个K8S集群的状态,并确保集群处于预期的工作状态

scheduler:资源调度器,负责Pod资源的调度,通过调度算法(预选策略、优选策略)为部署的Pod选择最适合的node节点

etcd:K8S集群的数据库,是一种键值对存储结构的分布式数据库,负责存储K8S集群所有的重要信息,只有apiserver有读写权限

2.worker node节点

kubelet:接收master发来的请求,创建和管理Pod和容器,跟容器引擎交互实现容器的生命周期的管理;收集node节点的资源信息和Pod的运行状态汇报给master的apiserver

kube-proxy:作为service资源的载体,实现Pod的网络代理,维护网络规则和四层负载均衡工作

容器引擎/容器运行时:运行容器

三、K8S创建Pod的工作流程?

在这里插入图片描述

1)用户通过客户端发送创建Pod的请求到master节点上的apiserver
2)apiserver会先把请求信息写入到etcd中保存,再找controller-manager根据预设的资源配置模板创建Pod资源
3)然后controller-manager会通过apiserver去找scheduler为新创建的Pod选择最合适的node节点
4)scheduler通过调度算法的预选策略和优选策略筛选出最合适的node节点进行调度
5)然后再通过apiserver找到对应的node节点上的kubelet去创建和管理Pod
6)kubelet会跟容器引擎交互来管理Pod/容器的生命周期
7)用户还可通过apiserver在kube-proxy上写入网络规则,创建service资源,实现对Pod的服务发现和负载均衡

四、K8S资源对象

1.Pod

Pod:是K8S能够创建和管理的最小单元。一个Pod里可以包含一个或者多个应用容器,Pod里的容器之间共享网络、存储等资源。

2.Pod控制器

Pod 控制器是 Pod 启动的一种模版,用来保证在K8S里启动的 Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)
deployment:部署无状态应用。同时也负责管理replicaset(维持Pod副本数量符合期望数量)和Pod(一个容器化的应用进程)
statefulset:部署有状态应用
daemonset:在所有的node节点上部署同一种Pod
job:一次性的部署短期任务的Pod,Pod执行完任务就会自动退出
cronjob:周期性的部署短期任务的Pod,Pod执行完任务就会自动退出

3.service && ingress

service:在K8S集群内部,为通过标签选择器相关联的一组Pod,提供一个统一的访问入口地址(clusterIP),只支持四层代理转发

ingress:作为K8S集群外部接入层,可自定义规则根据用户请求的域名或URL访问路径转发给指定的service,支持七层代理转发

五、K8S资源配置信息

Apiversion:每种资源对象在K8S中使用的api接口版本
Kind:      资源对象的类型
Metedata:  资源对象的元数据,比如 name资源名称,namespace命名空间,labels标签,annotations注释
Spec:      资源对象的资源配置清单(配置属性),比如 副本数,镜像名,数据卷,标签选择器 等
Status:    资源对象的当前运行状态信息

label:标签,将键值对配置到任何资源对象上,用于选择资源
label selector:标签选择器,用于查询和筛选拥有某些 label 的资源对象
annotation:注释,使用元数据来装饰资源,可用于作资源对象的注释或设置资源对象额外的功能特性配置
name:资源名称,在同一个命名空间中,同类型的资源对象的名称是唯一的

六、K8s部署

1.K8S二进制部署

1)etcd集群
使用cfssl签发证书和私钥
解压etcd软件包,获取二进制文件 etcd  etcdctl
准备etcd配置文件
启动etcd服务进程,加入到etcd集群

2)master
使用cfssl签发证书和私钥
准备bootstrap-token认证文件
解压服务端软件包,获取二进制文件 kube-apiserver  kube-controller-manager  kubectl  kube-scheduler
准备apiserver、controller-manager、scheduler的服务配置文件
准备controller-manager、scheduler、kubectl的 kubeconfig 集群配置文件(加入K8S集群的引导文件)
依次启动apiserver、controller-manager、scheduler服务进程

3)node
获取二进制文件 kubelet  kube-proxy
准备 kube-proxy、kubelet 的 kubeconfig 集群配置文件 kube-proxy.kubeconfig  bootstrap.kubeconfig(kubelet初次访问apiserver加入集群的引导文件)
准备 kubelet、kube-proxy 的服务配置文件
启动 kubelet 服务进程,发起 csr 请求证书,master 通过 csr 请求,颁发证书给 kubelet
加载 ipvs 模块,启动 kube-proxy 服务进程

4)多 master 高可用
复制 master 的 k8s 相关的 证书、配置文件、二进制文件 和 etcd 的证书
修改 配置文件启动参数 启动 master 组件(apiserver、controller-manager、scheduler)的服务进程
部署 负载均衡器 和 keepalived 高可用
修改 node 组件(kubelet、kube-proxy)和 kubectl 的 kubeconfig 配置文件中的 server 参数地址为 VIP

2.K8S kubeadm搭建



kubeadm init:在使用kubeadm方式安装K8S集群时,可根据初始化配置文件或者配置参数快速的初始化生成一个K8S的master管理平台

kubeadm join:根据kubeadm init初始化的提示信息快速的将一个节点作为node节点或者其它的master节点加入到K8S集群当中

1)所有节点进行初始化,安装docker引擎和kubeadm kubelet kubectl 
2)生成集群初始化配置文件并进行修改
3)使用kubeadm init根据初始化配置文件生成K8S的master控制管理节点
4)安装CNI网络插件(flannel、calico等)
5)在其他节点使用kubeadm join将节点以node或者master角色加入K8S集群

七、K8s网络

节点网络         Node节点网卡的IP  nodeIP
Pod网络         podIP
Service网络     clusterIP

八、K8s接口

CRI  容器运行时接口    docker  containerd  podman  cri-0
CNI  容器网络接口      flannel  calico  cilium 
CSI  容器存储接口      ceph  nfs  gfs  s3

1.CNI(容器网络接口)

1.1flannel3种模式
UDP        出现最早,性能较差,基于flanneld应用程序实现数据包的封装/解封装
VXLAN      默认模式,推荐使用的模式,性能比UDP模式更好,基于内核实现数据包的封装/解封装
Host-gw    性能最好,但是配置复杂,不能跨网段
UDP模式工作原理
1)应用数据包从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel0虚拟接口
2)flanneld服务会监听flannel0接口接收到的数据,flanneld服务会将内部数据包封装到UDP报文里
3)flanneld会根据在etcd中维护的路由表查到目标Pod所在的Node节点IP,在UDP报文外再封装Node节点IP报文、MAC报文后,通过物理网卡发送到目标Node节点
4)UDP报文通过8285号端口送到目标主机的flanneld进程进行解封装,再通过flannel0接口转发到cni0网桥,然后通过cni0网桥转发到目标Pod容器
VXLAN模式工作原理
1)原始数据帧从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel.1虚拟接口
2)flannel.1接口接收到数据帧后添加VXLAN头部,在内核封装成UDP报文
3)flanneld会根据在etcd维护的路由表通过物理网卡发送到目标Node节点
4)UDP报文通过8472号端口送到目标主机的flannel.1接口在内核进行解封装,然后将原始报文通过cni0网桥转发到目标Pod容器
1.2Calico3种模式
IPIP模式、 BGP模式、 混合模式
Calico IPIP模式工作原理
1)源Pod容器发出的原始数据IP包通过内核的IPIP驱动直接封装在宿主机网络的IP包中
2)根据tunnel接口的路由通过物理网卡发送到目标Node节点
3)数据包到达目标节点后再通过IPIP驱动解包得到原始数据IP包
4)然后通过路由规则发送给 veth pair 设备到达目标Pod容器
Calico BGP模式工作原理
1)源Pod容器发出的原始数据IP包会通过 veth pair 设备到达宿主机网络空间
2)然后根据原始数据IP包的目标IP和宿主机的路由规则,找到目标Node节点的IP,再通过物理网卡发送到目标Node节点
3)根据目标Node节点的路由规则,直接通过目标Pod容器的 veth pair 设备发送到目标Pod容器
1.3flannel 和 calico 区别
flannel: UDP   VXLAN   Host-gw
默认网段:10.244.0.0/16
通常使用VXLAN模式,采用的是叠加网络、IP隧道方式传输数据,对性能有一定的影响
功能简单配置方便利于管理,但是不具备复杂的网络策略规则配置能力


calico: IPIP  BGP  混合模式(CrossSubnet)
默认网段:192.168.0.0/16
使用IPIP模式可以实现跨子网传输,但是传输过程中需要封包和解包,对性能有一定的影响
使用BPG模式,把Node节点看作成路由器,根据Felix、BIRD分发和维护的路由规则,可直接实现BGP路由转发,传输过程中不需要封包和解包,因此性能较好,但只能在同一个网段内使用,无法跨子网传输
具有更丰富的网络策略配置管理能力、性能更好、功能更全面,但是维护起来较为复杂

所以对于较小规模且网络要求简单的K8S集群,可以采用flannel。对于集群规模较大且要求更多的网络策略配置时,可以采用性能更好、功能全全面的calico

1.4VLAN和VXLAN的区别

1.ID数
vlan可以有2的12次方个vlan,即4094个
vxlan可以2的24次方个vxlan
2.网络路径利用效率
vlan使用spanning tree protocol避免环路,会将一半的网络路径阻塞
vxlan的数据包封装成UDP通过网络层传输,可以使用所有的网络路径
3.Mac表
vlan需要在交换机的Mac表中记录Mac物理地址
vxlan采用隧道机制,Mac物理地址不需记录在交换机

2.CoreDNS

CoreDNS 是 K8S 的默认 DNS 实现
根据 service 资源名称 解析出 Cluster IP
根据 statefulset 控制器创建的 Pod 资源名称 解析出 Pod IP

3.k8s证书更新

kubeadm 部署的K8S集群更新证书
1)备份老证书和kubeconfig配置文件
mkdir /etc/kubernetes.bak
cp -r /etc/kubernetes/pki/ /etc/kubernetes.bak
cp /etc/kubernetes/*.conf /etc/kubernetes.bak

2)重新生成证书
kubeadm alpha certs renew all --config=kubeadm.yaml

3)重新生成kubeconfig配置文件
kubeadm init phase kubeconfig all --config kubeadm.yaml

4)重启kubelet和其他K8S组件的Pod容器
systemctl restart kubelet

mv /etc/kubernetes/manifests  /tmp
mv /tmp/*.yaml  /etc/kubernetes/manifests 
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐