欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 一、kubernetes k8s

一、kubernetes k8s

2025/2/10 9:34:21 来源:https://blog.csdn.net/2401_87896172/article/details/145468632  浏览:    关键词:一、kubernetes k8s

k8s概述:


k8s的全称:kubernetes k8s
k8s的版本:1.30
                 1.20------------用的最多的版本,1.18-1.21

                 1.24------------>k8s的镜像不再使用docker,containerd

k8s的作用:

用于自动部署,自动扩展和管理“容器化应用程序”的开源系统。k8s是google基于go语言开发的自动化运维管理容器。

为什么要用k8s:

1、docker是单机模式,不能实现跨主机部署,无法实现集群化

2、docker不能实现高可用和负载均衡。docker没有自愈机制(docker应用一旦报错,就会进入停止状态,不能自动恢复)。

3、随着容器数量的上升,管理成本也跟着一起攀升。

4、docker没有预设模板,无法实现快速,大规模的容器的调度。

5、docker没有生命周期的管理工具,没有图形化工具。

k8s是管理容器化部署的微服务管理工具。

k8s的组件和功能*:

架构:主----从的架构

主节点:所有的操作都在主节点

从节点:工作节点,主节点发出的指令,在工作节点完成和实施。

主节点也可以作为工作节点,也可以进行容器应用程序的部署。(一般不用)

核心组件*:

master组件:

kube-apiserver:是集群的核心的核心,所有的操作都是由apiserver调用集群内其他组件实现,apiserver也是整个集群的入口,访问apiserver来访问集群,apiserver一旦故障,整个集群都将无法使用。

所有对象和资源的增删改查和监听都是由apiserver来实现的,所有的信息的变更,都是由apiserver处理,处理完之后交给etcd进行保存。

etcd:是k8s集群自己的存储服务,类似于数据库,etcd是一个分布式键值存储系统,集群的所有信息都保存在etcd,k8s的配置信息也保存在这里。etcd只能是奇数台,只有apiserver可以访问etcd,读写权限。其他组件只能通过apiserver的接口才能够获取etcd的数据。 ---配置存储中心。

kube-controller-manager:运行管理控制器,在k8s集群中,一个资源对应一个控制器,controller-manager就是来管理这些控制器。

node组件:

kubelet: node节点的监视器,以及于master节点的通讯器。node节点上的信息,kubelet会定时向master汇报节点的情况(apiserver)并且接受来自master节点的指示,采取调整措施。

在k8s集群中,每个node节点都会有一个kubelet,用来管理从节点的服务状态,信息等等,定时发送给master。

kube-proxy:在每个node节点上实现pod的网络代理。是service实现的载体

负责网络的规划和四层负载,写入iptables的数据包转发的规则,ipvs实现流量的分发。

docker: 容器引擎,拉去镜像,运行容器,都是由docker自己完成的。

控制器的类型:

1、node controller: 节点控制器,节点出现故障时发现和响应

2、replication controller 副本控制器,k8s集群中,一个资源对象可以创建多个副本,也就是有多个pod。pod的数量定义好之后,副本控制器来进行管理(pod的数量可以动态的变化)

3、endpoints controller 端点控制器,service和pod之间的对应关系,负载监听service和pod之间的变化关系。访问指定的服务,必须要知道对应的endpoint。

4、service account & token controller: 账户和令牌控制器,为新的命令空间内创建默认账户和api访问的令牌

5、resourcequota controller: 资源配额控制器,pod可以在配额的情况下使用系统资源

6、namespace controller: 命令空间控制器,管理namespace的生命周期
7、service controller: 服务控制器,k8s集群和外部的云平台之间的接口控制器。

kube-scheduler: 根据用户设置的调度算法,为新创建的pod选择一个合适的node节点。

k8s所有node节点的调度器,用户要部署应用时,scheduler会根据调度算法选择一个最合适的节点部署pod
预选策略
优先策略

数据流向图

核心的概念:

pod:pod里面包含有容器,一个pod可以有多个容器,但是k8s集群管理的最小单位就是pod。

pod中的容器共享网络,存储,资源配额。

pod控制器:pod启动的模板,也属于controller-manager的一部分,当我们定义好模板之后(YAML文件),定义好之后,所有的pod都会按照这一模板创建。

pod控制器的类型:

deployment: 无状态应用部署,最常用的方式

replicaset: 确保pod的数量。受控于deployment。

daemonset:确保所有节点都会运行一个pod。无法设置副本数。

statefulset:有状态部署,pod是按照序号排列,可以设定副本数。

job:一次性任务,根据用户的设置,任务执行完毕,pod就自动退出

cronjob:pod会按照定时任务执行,执行完毕退出。

label:标签,k8s特有的管理方式,分类管理资源对象。

pod service node replica label是一个键值对形式,key和value由用户来自行定义。

service-------------pod 1 2 3

k8s对外提供访问的方式:

service:只要创建好了pod,集群一定会为pod分配一个全局独立的ip地址。但是pod的生命周期有限,pod的ip地址会发生变化

10.244.0.0/16

service可以通过标签匹配pod的标签,就可以直接访问到对象pod的资源,无需再关联。

每个service都有一个固定的虚拟ip地址。cluster ip,只能局域网访问,自动的而且是动态的绑定后端的pod

service有多种类型,都是基于四层的转发,ip+端口

kube-proxy/来实现网络的转发,转发的形式:iptables,ipvs(主流转发模式,性能最好)

内网使用

ingress:

对外提供访问,可以使用7层代理,可以使用域名。

namespace:命名空间,k8s集群做一个人为的划分,逻辑上的一种隔离方式,每个项目都在自己的命名空间内部署,互相隔离,互不干扰。

集群搭建补充

pause镜像 保持pod中的容器运行的一个组件,pause会为每一个容器创建一个独立的网络空间,pod中的所有容器共用这个网络空间。pod中的容器不管是什么代码框架写的,都可以共享网络。当pod退出时,pause也会退出。

coredns:k8s集群自带的解析服务组件,提供集群内的服务器域名和ip的映射关系。

k8s集群搭建

61    master01   kubeadm   kubelet  kubectl 网络模式 flannel calico

62    node01      kubeadm   kubelet  kubectl 网络模式 flannel calico

63    node02      kubeadm   kubelet  kubectl 网络模式 flannel calico

安装docker

安装  kubeadm   kubelet  kubectl

tee /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

apt-get update

apt-get install -y kubelet=1.20.15-00 kubeadm=1.20.15-00 kubectl=1.20.15-00

主节点

从节点    输入密钥加入集群

kubeadm join 192.168.32.61:6443 --token 1rve5o.yortjuql4hpkh2y9 \
    --discovery-token-ca-cert-hash sha256:e9b405c82301d9196e7bef697ade57b7d4b378d7868d16af7d3d569e9b988022

k8s的cn网络插件:

kube-prxoy属于节点组件,网络代理,实现服务的自动发现和负载均衡。

1、pod内的容器于容器之间的通信。

2、一个节点上的pod之间的通信,docker0网桥直接通信

3、不同节点上的pod之间的通信

通过物理网卡的ip地址和其他节点上的物理网卡的设备进行通信然后把流量转发到指定的pod内。

CNI作用:1、给每个pod提供一个全局的ip地址。

                 2、cni是一个标准接口,用于容器运行时调用网络插件,配置容器的网络。

设置容器的网络命令空间,ip地址,路由等等参数。

cni的插件类型:

flannel插件   是一种overlay网络模式,tcp数据包封装在另一种网络里面进行路由转发的模式,在二层的基础上创建一个逻辑上的网络层,可以实现跨节点的容器通信

工作模式:

1、udp模式    性能最差    基于应用层转发

2、vxlan 基于内核转发,最常用的方式

3、host-gw  性能最好,但是配置麻烦 

vxlan模式的工作原理:

1、数据帧从主机上的pod1出发,二次封装源ip和目的ip。(flannel会通过apiserver保存一张路由表到etcd)

2、从pod1出发的数据包,经过docker0/cni0网络接口转到flannel.1接口(vxlan模式的默认接口)

3、flannel.1接口收到数据后添加vxlan头部,封装在udp报文中

vlan10

vlan20

4、主机A的网络收到flannel.1接口的数据包,封装主机A的ip,和主机B的ip。

5、数据包到达主机B,vxlan默认接口是8472,主机B收到数据包之后,解包,传送到8472端口,就是flannel.1的接口,然后再解包,把数据转发到指定的pod。

UDP网络:flannel0
vxlan: flannel.1

calico插件:把主机作为路由器,使用BGP同步路由的方式转发数据包

BGP动态路由,自动实现路由选择。

可以让在集群内不同节点上创建的pod都拥有全局内唯一的ip地址。

calico的组成部分:

1、felix  维护宿主机上的路由规则,以及FIB(转发信息库)。

2、BIRD 分发路由规则

3、confd 配置管理组件

转发原理:

为每一个容器设置一个veth pair的设备。相当于桥接的功能,一端接入宿主机的网络空间,veth pair的另一端配置一个路由规则,接入容器docker0/cni0.

路由传播:

1、Felix在节点上添加pod的ip地址,添加pod的子网路由

2、BIRD在集群内节点上建立BGP的会话,广播本机的路由节点

3、集群内的节点学习整个路由,如何能够到达其他节点的pod的下一跳的地址。

4、宿主机直接把数据包发送到目标主机,通过veth pair设备直接转发到目标pod。

基础操作命令

kubectl create deployment nginx --image=nginx:1.22 --replicas=3

kubectl expose deployment nginx --port=80 --type=NodePort

自动补全

查看集群节点状态

查看默认命名空间里的pod状态

-n指定命名空间

显示详细信息

基于控制器创建的pod,删除pod相当于重启,不能把pod完全销毁

删除控制器

查看版本

查看api资源对象

kubectl api-resources

查看具体资源的详细信息

查看完整的信息

查看pod日志

进入pod容器内部

pod数量的扩缩容*(pod的副本数)

手动改:

1、命令行

kubectl scale deployment nginx --replicas=1

2、改pod的配置文件,修改副本数

自动扩缩容:

HPA 根据cpu的负载自动扩缩容

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com