前言
想要深入浅出的认识,并熟悉k8s,需要掌握其相关的概念
相关概念
管理节点(Master Node)
管理节点是k8s集群的管理者,运行着的服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和容器网络等组件,一般3个管理节点组成HA(高可用)的架构
工作节点(Worker Node)
工作节点是k8s集群中承担工作负载的节点,可以是虚拟机,也可以是物理机。工作节点承担实际的Pod调度,以及与管理节点的通信等。一个工作节点上的服务包括Docker运行时环境、kubelet、kube-proxy,以及其它一些可选的Addon组件
命名空间(Namespace)
命名空间为k8s集群提供虚拟的隔离作用。k8s集群初始有3个命名空间,分别是:默认命名空间default、系统命名空间kube-system和kube-public,除此以外,管理员可以创建新的命名空间已满足需求
Pod
-
概述
Pod是k8s部署应用或服务的最小的基本单位。一个pod封装多个应用容器(也可以只有一个容器)、存储资源、一个独立的网络ip,以及管理控制容器运行方式的策略选项 -
相位
一般有5个状态,分别为Pending、Running、Succeeded、Failed和Unkow,其表示如下所示
Pending: Pod未完成调度,通常由于没有符合调度需求的节点
Running: Pod已经调度成功,且已被kubectl创建完成
Succeeded: Pod中的所有容器已经成功部署,且不会被重启
Failed: Pod中至少有一个容器终止失败
Unknow: APIserver无法获取Pod对象的状态信息,通常由于其无法与所在的工作节点的kubectl通信所致
可通过describe查询到该pod的状态,对于定位报错很有用
kubectl describe pod pod_name -n namespace_name
副本控制器(Replication Controller, RC)
RC确保任何时候k8s集群中有指定数量的pod副本(replicas)在运行,通过监控运行中的Pod来保证集群中运行指定书目的Pod副本。指定书目可以是多个,也可以是1个;少于指定书目,RC就会启动运行新的Pod副本;多余指定书目,RC就会终止多余的Pod副本
副本集(Replica Set, RS)
ReplicaSet(RS)是RC的升级版本,唯一区别是对选择器的支持,RS能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用
部署(Deployment)
部署表示用户对k8s集群的依次更新操作。部署比RS应用更广,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新的RS中副本数增加到理想状态,将旧的RS中的副本数减小到0的复合操作;这样一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。不建议手动管理利用Deployment创建的RS
服务(Service)
-
概述
Service也是k8s的基本操作单元,是真是应用服务的抽象,每一个服务后面都有很多对应的容器来提供支持,通过kube-proxy的port和服务selector决定服务请求传递给后端的容器,对外表现为一个单一访问接口,外部不需要了解后端如何运行,这给扩展和维护后端带来很大的好处 -
作用
a. 防止Pod失联(服务发现)
b. 定义一组访问pod的策略(负载均衡)
c. 支持ClusterIP,NodePort及LoadBalancer三种类型 -
样例
一个Service在Kubernetes中是一个REST对象,和Pod类似。像所有的REST对象一样,Service定义可以基于POST方式,请求API server创建新的实例
假定有一组Pod,它们对外暴露了9376端口,同时还被打上app=MyApp标签
apiVersion: v1
kind: Service
metadata:
name: ng
namespace: default
spec:
selector:
app: ng # Pod标签为app=ng的资源
type: ClusterIP # NodePort、LoadBalancer
ports:
- protocol: TCP
targetPort: 80 # 容器端口
port: 80 # 对外暴露服务端口
上述配置创建一个名称为“my-service”的Service对象,它会将请求代理到使用TCP端口9376,并且具有标签"app=MyApp"的Pod上。Kubernetes为该服务分配一个IP地址(有时称为“集群IP”),该IP地址由服务代理使用
Service能够将一个接收port映射到任意的targetPort。默认情况下,targetPort将被设置为与port字段相同的值
-
延伸
lvs是负载均衡器(k8s自带ipvs,1.11版本后),能承载数以百万/千万计的并发量
eg:阿里云基于lvs实现slb(四层),基于nginx实现(七层)tengent -
service与pod的关系
-
service类型说明
标签(Labels)
Labels的实质是附着在资源对象上的一系列Key/Value键值对,用于指定对用户有意义的对象的属性,标签对内核系统是没有直接意义的。标签可以在创建一个对象的时候直接赋予,也刻意在后续随时修改,每一个对象可以拥有多个标签,但key值必须唯一
-
作用
附在某个资源上,用于关联对象,进行查询和筛选 -
组成
key的组成
1. 不得超过63个字符
2. 可以使用前缀,使用/分隔,前缀必须是DNS子域,不得超过253个字符,系统中的自动化组件创建的label必须指定前缀,kubernetes.io/由kubernetes保留
3. 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点
value组成
1. 不得超过63个字符
2. 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点
- 注
Kubernetes最终将对labels最终索引和反向索引用来优化查询和watch,在UI和命令行中会对它们排序。不要在label中使用大型、非标识的结构化数据,记录这样的数据应该用annotation
Label selector
Label不是唯一的,很多object可能有相同的label
通过label selector,客户端/用户可以指定一个object集合,通过label selector对object的集合进行操作
- 类型:
- equality-based:可以使用=、==、!=操作符,可以使用逗号分隔多个表达式
- set-based:可以使用in、not in、!操作符,另外还可以没有操作符,直接写出某个label的key,表示过滤有某个key的object而不管该key的value是何值,!表示没有该label的object
- 示例
~]# kubectl get nodes -l xxx.com/persistent-env=dev
NAME STATUS ROLES AGE VERSION
xxx Ready <none> 319d v1.14.8-aliyun.1
~]# kubectl get nodes -l "xxx.com/persistent-env in (dev)"
NAME STATUS ROLES AGE VERSION
xxx Ready <none> 319d v1.14.8-aliyun.1
~]# kubectl get nodes -l "xxx.com/persistent-env in (dev,uat)"
NAME STATUS ROLES AGE VERSION
xxx Ready <none> 355d v1.14.8-aliyun.1
xxx Ready <none> 319d v1.14.8-aliyun.1
~]# kubectl get nodes -l "xxx.com/persistent-env notin (dev)"
NAME STATUS ROLES AGE VERSION
xxx Ready <none> 355d v1.14.8-aliyun.1
xxx Ready <none> 355d v1.14.8-aliyun.1
常用命令使用
-
查看master/node服务器的label标签
kubectl get nodes --show-labels
示例:
~]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
xxx Ready 355d v1.14.8-aliyun.1 ack.aliyun.com=c358ac1cf2… -
给master/node打label标签
kubectl label node master_name/node_name key/value
示例:
~]# kubectl label node xxx a=b
~]# kubectl get nodes -l a=b
NAME STATUS ROLES AGE VERSION
xxx Ready 355d v1.14.8-aliyun.1 -
删除label标签
kubectl label node master_name/node_name key- # -表示
示例:
~]# kubectl label node xxx a-
~]# kubectl get nodes -l a=b
No resources found in default namespace.
Pod示例
示例
cat > frps/frps-pod.yaml <<-EOF
apiVersion: v1
kind: Pod
metadata:
name: frps
namespace: dev
labels:
app: frps
spec:
nodeSelector:
xxx.com/persistent-env: dev # 使用dev的label标签
imagePullSecrets:
- name: ali-shenzhen-registry-secret
containers:
- name: frps
image: registry-vpc.cn-shenzhen.aliyuncs.com/xxx/frps:latest
env:
- name: FRPS_TOKEN
value: xxx
ports:
- containerPort: 7000
containerPort: 7500
EOF
存储卷(Volume)
k8s集群中的存储卷跟Docker的存储卷有些类似,只不过Docker的存储卷作用范围为一个容器,而k8s的存储卷的生命周期和作用范围是一个Pod。每个Pod中声明的存储卷由Pod中的所有容器共享。支持使用Persistent Volume Claim,即PVC这种逻辑存储,使用者可以忽略后台的实际存储技术,具体关于Persistent Volume(PV)的配置由存储管理者来配置
持久存储卷(Persistent Volume, PV)和持久存储卷声明(Persistent Volume Claim, PVC)
PV和PVC使得k8s机器具备了存储的逻辑抽象能力,使得在配置Pod的逻辑里可以忽略对实际后台存储技术的配置,而把这项配置的工作交给PV的配置者。存储的PV和PVC的这种关系,跟计算的Node和Pod的关系是非常类似;PV和Node是资源的提供者,根据集群的基础设施变化而变化,由k8s集群管理员配置;而PVC和Pod是资源的使用者,根据业务服务的需求变化而变化,由k8s集群的使用者,即服务的管理员来配置
Ingress
-
概述
Ingress是授权入站连接到达集群服务的规则集合。可以通过Ingress配置提供外部可访问的URL、负载均衡、SSL、基于名称的虚拟主机等。用户通过POST Ingress资源到API server的方式来请求Ingress。Ingress controller负责实现Ingress,通常使用负载均衡器,它还可以配置边界路由和其它前端,这有助于以HA方式处理流量 -
ingress controller拓扑图
-
pod与Ingress的关系
Pod
-
概述
pod表示的是一個容器或多個容器的組合,它是K8s最基本的操作和調度單元。在同一个pod中的容器总会被调度和部署到同一个节点上,并共享相同的数据卷和网络栈。这意味着在Pod里定义的几个容器能够同时挂载同一个外部数据卷,还能够通过localhost作为地址相互访问,这个特性对于部署关系紧密的服务具有十分重要的作用。 -
作用
a. 最小容器单元
b. 一组容器的集合
c. 一个Pod中的容器,共享网络命名空间
d. Pod是短暂的 -
pod为亲密性应用而存在 亲密性应用场景如下
a. 两个应用之间发生文件交互
b. 两个应用需要通过127.0.0.1或socket通信
c. 两个应用需要发生频繁的调用 -
实现机制
a. 共享网络
b. 共享存储 -
容器分类与设计模式
-
Infrastructure Container:基础容器
1.1 维护整个Pod网络空间 -
InitContainers: 初始化容器
2.1 先于业务容器开始执行 -
Containers: 业务容器
3.1 并行启动
annotations
其同样是附属于其他资源上的一种键值对标记,但这些标记通常被作为k8s系统服务常见资源时的特殊参数。用户无法使用它来通过API查找资源时进行过滤和匹配。每种资源上能够标记的annotations键的名称是预定义好的,而且每个键都具有特定的作用。
ComfigMap(cm)
-
概述
其是k8s存储应用配置的对象,对于使用"cloud native架构"的服务,将服务进程本身的代码与它的配置区分开管理,是一个非常好的实践。其使得用户能够在服务部署时,动态地将配置与服务进行绑定,而不需要再代码中预先设置。 -
使用场景
1.使用配置项定义Pod环境变量
2.通过配置项设置命令行参数
3.在数据卷中使用配置项
Controllers
-
概述
更高级层次对象,部署和管理pod -
管理对象如下
a. deployment
b. statefuset
c. daemonset
d. job
e. cronjob