k8s基础
文章目录
- k8s基础
- 一、k8s组件
- 二、k8s组件作用
- 1.master节点
- 2.worker node节点
- 三、K8S创建Pod的工作流程?
- 四、K8S资源对象
- 1.Pod
- 2.Pod控制器
- 3.service && ingress
- 五、K8S资源配置信息
- 六、K8s部署
- 1.K8S二进制部署
- 2.K8S kubeadm搭建
- 七、K8s网络
- 八、K8s接口
- 1.CNI(容器网络接口)
- 1.1flannel3种模式
- UDP模式工作原理
- VXLAN模式工作原理
- 1.2Calico3种模式
- Calico IPIP模式工作原理
- Calico BGP模式工作原理
- 1.3flannel 和 calico 区别
- 1.4VLAN和VXLAN的区别
- 2.CoreDNS
- 3.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