K8S全称叫Kubernetes,用于管理容器化服务的工具,具有很多插件,使操作容器更简单、快捷。
0x01 功能
- 服务发现和负载均衡。服务发现就是可以通过DNS域名或者主机IP地址来暴露容器的服务。负载均衡是当外部访问集群中的容器网络流量很大时,K8S可以分配网络流量,避免宕机
- 存储编排。个人认为就是挂载文件,包括本地文件和云文件。
- 自动部署和回滚。k8s可以将容器部署成你期望的状态。通过yaml文件来让k8s自动操作。
- 自动完成装箱计算。K8S允许指定某个容器所需的CPU和内存。
- 自我修复。当K8S启动某个容器失败的时候,会一直重新启动这个容器,直到容器成功启动。
- 密钥与配置管理。K8S允许存储和管理敏感信息,可以在不重新构建容器的情况下部署和更新秘钥和应用程序配置。
0x02 组件
控制平面组件(Master)
- kube-apiserver
是K8S整个集群中的大脑,集群中的所有组件都与它进行交互。Api Server 为REST操作提供服务。可以运行多个Api server,并在这些server中平衡网络流量
- etcd
一个键值数据库。集群中的数据都在里面
- kube-scheduler
将pod指派到节点上,会根据各个node节点上的资源进行分配
- kube-controller-manager
是K8S集群的管理控制中心,负责管理node节点、pod及其副本、命名空间、服务账号等,将这些的当前状态调整到用户所期望的状态。比如说一个pod意外挂掉了,那么该组件就会自动重新启动。
Node组件(Worker)
0x03 Kubernetes 对象
什么是K8S对象?
官方解释:在 Kubernetes 系统中,Kubernetes 对象 是持久化的实体。 Kubernetes 使用这些实体去表示整个集群的状态。
在K8S中,所有内容都被抽象成资源,如Pod、Service、Node等。对象就是资源的实例,是持久化的实体。K8S使用这些实体去表示整个集群的状态。把对象和资源联系到一块,能更好的理解K8S对象的概念。
K8S对象是“目标性记录”,也就是说一旦创建对象,K8S系统将持续工作来确保这个对象是存在的,直至该对象被删除。创建对象本质上就是告诉K8S系统应该做些什么,做到什么程度,也就是K8S集群的期望状态。
对象规约(Spec)是对象的一个期望状态,用户在创建对象的时候必须要指出。状态(Status)是该对象在K8S集群中的当前状态,它是由K8S系统和组件设置并且实时更新。在任何时候,K8S都持续管理着对象的实际状态,确保当前状态和Spec是一样的。
怎么描述K8S对象?
必须字段有:
- apiVersion : 指定创建该对象所使用的K8S API的版本
- kind : 指定创建的对象的类别,如pod、Deployment、service等
- metadata : 唯一识别对象的字段,有name、UID和namespace(可选)
- spec字段:描述了对象要做些什么,可以从https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/ 获取不同对象的详细描述字段。
怎么管理K8S对象?
kubectl
工具提供了多种方式来创建和管理K8S对象- 指令式命令:
kubectl create deployment nginx --image nginx
- 指令式对象配置:
kubectl create -f nginx.yaml
- 声明式对象配置:之后再总结
对象名称和IDs
集群中的每一个对象都有一个名称来标识在同类资源中的唯一性,并且每个对象还有一个UID来标识在整个集群中的唯一性,K8S系统自动为对象生成的唯一标识符。也就是说作用域不一样。
比如说:在同一个命名空间中,可以有一个名字是test
的pod,也可以有一个名字为test
的Deployment
对象名称用在哪里?有什么限制?
对象名称是由用户提供
- 当我们通过Api Server来获取某对象信息时,就会用到对象名称,比如
/api/v1/pods/podname
- 不能包含“.”、”..“、“/”
- 许多资源类型需要用作DNS子域名的名称。那么就要求该名称必须是如下格式:
- 不能超过253个字符
- 只能包含小写字母、数字、'-'、'.'
- 以字母或数字开头和结尾
- 某些资源类型需要准守RFC 1123 所定义的标签标准
- 最多63个字符
- 只能包含小写字母、数字、'-'、'.'
- 以字母或数字开头和结尾
命名空间
K8S支持多个虚拟集群,也就是命名空间(namespace),这些虚拟集群依赖在同一个物理集群中。
什么时候使用命名空间?
名字空间适用于存在很多跨多个团队或项目的用户的场景。是在多用户之间划分集群资源的一种方法。
使用时需要注意什么?
- 命名空间不能嵌套使用,每个K8S资源只能在一个命名空间中。
- 不必使用命名空间来分隔仅仅轻微不同的资源。(建议)
- 避免使用前缀
kube-
创建名字空间,因为它是为 Kubernetes 系统名字空间保留的。
查看命名空间
[root@k8s-master:~ 10:43 $]kubectl get namespaces
NAME STATUS AGE
default Active 16d
kube-node-lease Active 16d
kube-public Active 16d
kube-system Active 16d
K8S 会创建四个初始命名空间
- default :没有指明使用命名空间的对象会使用它
- kube-system :K8S系统穿件对象所使用的命名空间
- kube-public :所有用户都可以读取它,包括未经过身份验证的用户
- kube-node-lease :它是用于与各个节点相关的租期对象。租期对象使得集群规模很大时节点心跳检测性能的到提升。(暂时还不懂)
为
kubectl
请求设置命名空间:kubectl get pods --namespace=default
可以永久保存命名空间,就是说之后的命令都是在该命名空间中执行的。kubectl config set-context --current --namespace=kube-system
名字空间和 DNS:暂无
查看在命名空间中的资源和不在命名空间中的资源
# 位于名字空间中的资源
kubectl api-resources --namespaced=true
# 不在名字空间中的资源
kubectl api-resources --namespaced=false
自动打标签 :暂无
标签和选择运算符
标签是附加到K8S对象上的键值对。标签的使用时能够标识对象的特殊特点,它的值对K8S系统本身没有什么含义,只是对用户才有意义。需要注意的是,在同一个资源对象的标签属性的key必须是唯一的;标签可以附加到各种对象上,如pod、Node、Service等。每个资源可以拥有多个标签。可以在创建资源的时候附加上,也可以在资源创建后通过API再添加或修改。
标签命名规范:
- 最长为63个字符,也可以为空
- 以字母或数字开头和结尾
- 可以包含“-”、“_”、“.”、大小写字母、数字
标签选择算符与名称、UID不同,标签只需要在同一个资源中保持唯一性,在其他范围内不需要保持唯一性。通常情况下,更希望许多对象携带相同的标签,便于管理。通过标签选择算符Label selector是Kubernetes核心的分组机制,通过label selector客户端/用户能够识别一组有共同特征或属性的资源对象。
Api支持两种类型的selector:基于等值 和 基于集合
基于等值
- “=” :键名等于某个值(
environment = production
)
- “!=”:键名不等于某个值(
tier != frontend
)
基于集合
- “in”:
environment in (production, qa)
表示键名为environment并且值在括号中之一
- “notin” :
tier notin (frontend, backend)
表示键名为tier且值不等于括号中的任意一个,和没有tier标签的资源
partition
:表示包含所有包含该标签的资源,没有check键的值
!partition
:表示没有包含该标签的资源,没有check键的值
Annotations(注解)
和标签类似,也是使用键值对的形式来定义的。它用来为对象附加任意的非标识的元数据。注解可以包含标签不允许的字符。