Kubernetes核心概念

有了docker,为什么还要用Kubernetes?

为提高业务并发和高可用,会使用多台服务器,因此会面向这些问题

  • 多容器跨主机提供服务
  • 多容器分布节点部署
  • 多容器怎么升级
  • 怎么高效管理这些容器

为解决这些问题,出现了容器编排系统

  • Kubernetes(15年开源)
  • Docker Swarm(Doker 官方容器编排工具.工具比较少,基本没人用了)
  • Mesos Marathon(主要是做分布式集群框架的,容器并不是特别专业)

image-20220424143258576

Kubernetes是什么

Kubernetes是google2014年开源的一个容器集群管理系统,简称K8s.

Kubernetes用于容器化应用程序的部署,扩展和管理,目标是让部署容器化应用简单高效

Kubernetes集群架构与组件

节点

节点分为管理节点和工作节点

image-20220424145114127

管理节点

管理节点的功能主要是接受用户的请求,把用户的请求转化为实际的事物

管理节点主要分为三个组件

  • API Server : 核心组件,是整个集群的访问入口,不论是命令行还是dashboard都是连接API Server ,也是其他组件的协调者,其他的组件也都是和他进行交互(集群统一入口,各组件协调者,以RESTfull API 提供接口服务,所有对象资源的增删改查和监听操作都交给API Server处理后,在提交给Etcd存储)
  • scheduler : 负责任务调度,当你创建一个容器的时候,帮你选择一个合适的工作节点
  • controller-manager : 管理常规的后台任务,控制器会帮你确保副本的数量,包括容器升级,回滚操作(depolyment ,Service)

Etcd 是k8s的数据库,分布式键值数据库,用于保存集群状态数据,比如Pod,Service等对象信息

工作节点

工作节点主要分为两个组件

  • kubelet : 相当于agent,让工作节点受控与管理节点,安装后通过调用docker可以进行容器的创建,管理等,
  • kube-proxy : 负责容器以及集群相关的网络规则,在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作.

所有组件的调度和交互都是通过API Server连接实现的

k8s资源基本概念

  • Pod:k8s最小部署单元,一组容器的集合
  • Deployment:最常见的控制器,用于更高级别的部署和管理,Pod,(滚动升级等)
  • Service:为一组Pod提供负载均衡,对外提供统一的访问入口
  • Label: 标签,附加到某一个资源上,用于关联对象,查询和筛选

image-20220427165104586

Namespace

Namespaces:命名空间,将资源对象逻辑上隔离,从而形成多个虚拟机群,也利于权限控制

应用场景:

  • 根据不同团队划分命名空间
  • 根据项目划分命名空间

kubectl get namespace

  • default:默认命名空间
  • kube-system: k8s系统方面的命名空间
  • kube-public:公开的命名空间,谁都可以访问
  • kube-node-lease:k8s内部命名空间

有两种方式指定资源命名空间

  • 命令行加 -n 参数
  • yaml资源元数据里指定namespace字段
kubectl create namespace anliancloud			#可以通过命令创建新的namespace
kubectl get namespaces							#可以通过命令,查看

image-20220427172337164

Deployment控制器(管理应用)

Deployment是最常用的K8s工作负载控制器(workload Controllers),是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod.

我们在工作中一般不会直接创建Pod,而是通过Deployment来创建Pod

Deployment的主要功能:

  • 管理Pod,即应用程序 和ReplicaSet期望值
  • 具有上线部署,副本设定,滚动升级,回滚等功能
  • 提供声明式更新,例如只更新一个新的Image

应用场景:网站,API微服务

Pod

K8s最小部署单元,一组容器的集合,里面有一个或者一组容器

这些容器共享存储和网络.

pod特点

  • 一个Pod可以理解为是一个应用实例,提供服务
  • Pod中容器始终部署在一个Node上
  • Pod中容器共享网络,存储资源
  • Kubernetes直接管理Pod,而不是容器

Service

为一组Pod提供负载均衡,对外提供统一访问入口

  • 防止Pod失联
  • 定义一组Pod的访问策略(负载均衡)

service有三种模式,ClusterIP,NodePort,LoadBarlancer三种模式,其中ClusterIP是通过一个稳定的集群IP来提供集群内部的负载均衡,NodePort模式是通过映射随机端口,提供从集群外访问Pod的模式,LoadBarlancer是通过连接公有云第三方负载均衡设备来提供服务,service有三种代理模式,userspace,kube-proxy+iptables,kube-proxy+ipvs,其中 userspace是k8s自己的代理模式,工作在内核态,由于效率低下,已经淘汰,现在的k8s默认提供的是kube-proxy+iptables的代理模式,这种模式通过iptables进行DNAT地址转换,功能灵活,强大, 规则遍历匹配和更新,呈延时性.kube-proxy+ipvs模式的代理是通过virtual server --> real server 模式进行地址的转换,可以通过ipvsadm工具进行转换地址的查看和管理.ipvs的转发同样也处于内核态,效率高,开销少.

Label

标签,附加到某个资源上,用于关联对象,查询,筛选

kubectl get pod -A --show-labels 		查看标签
kubectl get pod -A -l app=web10			通过-l参数以及已知标签查看Pod

对应标签的Pod和对应标签的Service进行端口转发

image-20220501182758274

通过命令创建Pod 以及创建Service 可以看到标签是相同的,通过同样的标签进行端口转发

Ingress

Ingress提供7层应用层的负载均衡服务,需要先以Pod的形式部署Ingress-controller,形式有很多种,其中官方在维护的有三种,推荐其中的nginx_ingress,部署方式默认是采用deployment形式,推荐改用daemonset模式,因为Ingress的规则会指向ingress-controller Pod所在的宿主机,所以用daemonset模式无疑更加适合,通过在Ingress中添加host字段,以及配置域名解析服务.可以实现使用域名进行访问,同时在自签认证后,Ingress可以提供tls的https服务.

StatefulSet

  • 部署有状态应用
  • 解决Pod独立生命周期,保持Pod启动顺序和唯一性。
    1. 稳定,唯一的网络标识符,持久存储。
    2. 有序,优雅的部署和扩展,删除和终止。
    3. 有序,滚动更新

应用场景:分布式应用,数据库集群

Logo

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

更多推荐