One-K8S学习笔记

One-K8S学习笔记

Created
Sep 7, 2021 01:55 AM
Tags
容器
K8S
K8S全称叫Kubernetes,用于管理容器化服务的工具,具有很多插件,使操作容器更简单、快捷。

0x01 功能

  1. 服务发现和负载均衡。服务发现就是可以通过DNS域名或者主机IP地址来暴露容器的服务。负载均衡是当外部访问集群中的容器网络流量很大时,K8S可以分配网络流量,避免宕机
  1. 存储编排。个人认为就是挂载文件,包括本地文件和云文件。
  1. 自动部署和回滚。k8s可以将容器部署成你期望的状态。通过yaml文件来让k8s自动操作。
  1. 自动完成装箱计算。K8S允许指定某个容器所需的CPU和内存。
  1. 自我修复。当K8S启动某个容器失败的时候,会一直重新启动这个容器,直到容器成功启动。
  1. 密钥与配置管理。K8S允许存储和管理敏感信息,可以在不重新构建容器的情况下部署和更新秘钥和应用程序配置。
 

0x02 组件

控制平面组件(Master)

  1. kube-apiserver
是K8S整个集群中的大脑,集群中的所有组件都与它进行交互。Api Server 为REST操作提供服务。可以运行多个Api server,并在这些server中平衡网络流量
  1. etcd
一个键值数据库。集群中的数据都在里面
  1. kube-scheduler
将pod指派到节点上,会根据各个node节点上的资源进行分配
  1. 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对象?

必须字段有:
  1. apiVersion : 指定创建该对象所使用的K8S API的版本
  1. kind : 指定创建的对象的类别,如pod、Deployment、service等
  1. metadata : 唯一识别对象的字段,有name、UID和namespace(可选)
  1. spec字段:描述了对象要做些什么,可以从https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/ 获取不同对象的详细描述字段。
 

怎么管理K8S对象?

kubectl工具提供了多种方式来创建和管理K8S对象
  1. 指令式命令:kubectl create deployment nginx --image nginx
  1. 指令式对象配置:kubectl create -f nginx.yaml
  1. 声明式对象配置:之后再总结
 

对象名称和IDs

集群中的每一个对象都有一个名称来标识在同类资源中的唯一性,并且每个对象还有一个UID来标识在整个集群中的唯一性,K8S系统自动为对象生成的唯一标识符。也就是说作用域不一样。
比如说:在同一个命名空间中,可以有一个名字是test的pod,也可以有一个名字为test的Deployment
 
对象名称用在哪里?有什么限制?
对象名称是由用户提供
  1. 当我们通过Api Server来获取某对象信息时,就会用到对象名称,比如/api/v1/pods/podname
    1. 不能包含“.”、”..“、“/”
  1. 许多资源类型需要用作DNS子域名的名称。那么就要求该名称必须是如下格式:
    1. 不能超过253个字符
    2. 只能包含小写字母、数字、'-'、'.'
    3. 以字母或数字开头和结尾
  1. 某些资源类型需要准守RFC 1123 所定义的标签标准
    1. 最多63个字符
    2. 只能包含小写字母、数字、'-'、'.'
    3. 以字母或数字开头和结尾
 

命名空间

K8S支持多个虚拟集群,也就是命名空间(namespace),这些虚拟集群依赖在同一个物理集群中。
 
什么时候使用命名空间?
名字空间适用于存在很多跨多个团队或项目的用户的场景。是在多用户之间划分集群资源的一种方法。
使用时需要注意什么?
  1. 命名空间不能嵌套使用,每个K8S资源只能在一个命名空间中。
  1. 不必使用命名空间来分隔仅仅轻微不同的资源。(建议)
  1. 避免使用前缀 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 会创建四个初始命名空间
  1. default :没有指明使用命名空间的对象会使用它
  1. kube-system :K8S系统穿件对象所使用的命名空间
  1. kube-public :所有用户都可以读取它,包括未经过身份验证的用户
  1. 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再添加或修改。
 
标签命名规范:
  1. 最长为63个字符,也可以为空
  1. 以字母或数字开头和结尾
  1. 可以包含“-”、“_”、“.”、大小写字母、数字
 
标签选择算符与名称、UID不同,标签只需要在同一个资源中保持唯一性,在其他范围内不需要保持唯一性。通常情况下,更希望许多对象携带相同的标签,便于管理。通过标签选择算符Label selector是Kubernetes核心的分组机制,通过label selector客户端/用户能够识别一组有共同特征或属性的资源对象。
 
Api支持两种类型的selector:基于等值 和 基于集合
 
基于等值
  1. “=” :键名等于某个值(environment = production
  1. “!=”:键名不等于某个值(tier != frontend
 
基于集合
  1. “in”:environment in (production, qa) 表示键名为environment并且值在括号中之一
  1. “notin” :tier notin (frontend, backend) 表示键名为tier且值不等于括号中的任意一个,和没有tier标签的资源
  1. partition:表示包含所有包含该标签的资源,没有check键的值
  1. !partition :表示没有包含该标签的资源,没有check键的值
 

Annotations(注解)

和标签类似,也是使用键值对的形式来定义的。它用来为对象附加任意的非标识的元数据。注解可以包含标签不允许的字符。