Pod
Pod是kubernetes的最重要也是最基本的概念。包含一个被称为"根容器"的Pause容器,和一个或者多个紧密相关的用户业务容器。
Pod的IP加上这里的容器端口,就组成一个新的概念--EndPoint,它代表着此Pod里的一个服务进程的对外通信地址。
每个Pod都可以对其资源设置限额,当前可以设置的资源有两种CPU和Memory,其中CPU资源单位为CPU(core)的数量,是一个绝对值(不会因为CPU的核数变化而变化)。用m表示,如CPU的配额为100~300m,表示占用0.1~0.3个CPU。Memory也是一个绝对值,单位是内存字节数。
Requests:该资源的最小申请量,系统必须满足要求
Limits: 该资源的最大允许使用量,不能被突破,当容器试图使用超过这个量的资源时,可能会被Kill并重启。
spec:
containers:
- name: service
image: serviceImage
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Node
Kubernetes 通过将容器放入在节点(Node)上运行的 Pod 中来执行你的工作负载。节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。每个Node节点上都运行这一组关键进程:
Kubelet: 负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
kube-proxy: 实现Kubernetes Service的通信与负载均衡机制的重要组件
Container Runtime: 负责运行容器的软件,目前支持多个容器运行环境,如docker、containerd、CRI-O等
Label
label是附加到kubernetes对象(如:Node、Pod等)上的键值对。Label旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义。Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。
有效标签值:
必须为 63 个字符或更少(可以为空)
除非标签值为空,必须以字母数字字符(
[a-z0-9A-Z]
)开头和结尾包含破折号(
-
)、下划线(_
)、点(.
)和字母或数字。
Lable支持基于等值和基于集合的运算。
基于等值的运算符:=
、==
和 !=
三种。
environment = production
tier != frontend
基于集合的运算符:in
、notin
和 exists
environment in (production, qa)
tier notin (frontend, backend)
Deployment
Deployment是kubernetes 1.2引入的新概念,引入的目的是为了更好的解决Pod的编排问题,其内部仍然是用ReplicaSet来实现。
以下是一个deployment模板:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
一些常用命令
查看Deployments是否已经创建
kubectl get deployments输出:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 0 0 0 1s
各个字段的含义:
NAME 列出了集群中 Deployment 的名称。
READY 显示应用程序的可用的 副本 数。显示的模式是“就绪个数/期望个数”。
UP-TO-DATE 显示为了达到期望状态已经更新的副本数。
AVAILABLE 显示应用可供用户使用的副本数。
AGE 显示应用程序运行的时间。
要查看 Deployment 上线状态,运行
kubectl rollout status deployment/nginx-deployment输出类似于:
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out
要查看 Deployment 创建的 ReplicaSet(
rs
),运行kubectl get rs
。输出类似于:
NAME DESIRED CURRENT READY AGE
nginx-deployment-75675f5897 3 3 3 18s
更新线上的镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record
或者
kubectl edit deployment.v1.apps/nginx-deployment
查看Deployment上线历史
kubectl rollout history deployment.v1.apps/nginx-deployment
输出类似于
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true
2 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
3 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true
查看具体某个历史版本可以通过如下方式
kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2
回滚到历史的某个版本
kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2
缩放Deployment
将Nginx的Pod的副本数更改为10.
kubectl scale deployment.v1.apps/nginx-deployment --replicas=10
基于CPU利用率选择要运行Pod个数的上限和下限。如下,以CPU的80%为限,最小10个Pod,最大15个Pod。
kubectl autoscale deployment.v1.apps/nginx-deployment --min=10 --max=15 --cpu-percent=80
一些Deployment的参数
revisionHistoryLimit
默认为:10,保留多少个旧有 ReplicaSet
spec:
revisionHistoryLimit: 10
strategy(更新策略)
策略指定用于用新 Pods 替换旧 Pods 的策略。
strategy.type
可以是 “Recreate” 或 “RollingUpdate”。RollingUpdate 是默认值。spec:
replicas: 5
strategy: #升级策略(默认为滚动升级,不需要修改)
type: RollingUpdate
rollingUpdate:
maxSurge: 25% #滚动升级中,容器副本的最大数量(默认值,可根据实际情况修改)
maxUnavailable: 25% #滚动升级中,容器副本停止的最大数量(默认值,可根据实际情况修改)Recreate,在创建新 Pods 之前,所有现有的 Pods 会被杀死。
RollingUpdate,采取 滚动更新的方式更新 Pods。你可以指定
maxUnavailable
和maxSurge
来控制滚动更新 过程
ReplicaSet
ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。尽管 ReplicaSet 可以独立使用,目前它们的主要用途是提供给 Deployment 作为 编排 Pod 创建、删除和更新的一种机制。
StatefulSets
StatefulSet 是用来管理有状态应用的工作负载 API 对象。StatefulSet 用来管理某Pod集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符。
使用StatefulSets的场景:
稳定的、唯一的网络标识符。
稳定的、持久的存储。
有序的、优雅的部署和缩放。
有序的、自动的滚动更新。
扩容与缩容
对于包含 N 个 副本的 StatefulSet,当部署 Pod 时,它们是依次创建的,顺序为
0..N-1
。当删除 Pod 时,它们是逆序终止的,顺序为
N-1..0
。在将缩放操作应用到 Pod 之前,它前面的所有 Pod 必须是 Running 和 Ready 状态。
在 Pod 终止之前,所有的继任者必须完全关闭。
更新策略
OnDelete:
.spec.updateStrategy.type
设置为OnDelete
时,它的控制器将不会自动更新 StatefulSet 中的 Pod。用户必须手动删除 Pod 以便让控制器创建新的 Pod,以此来对 StatefulSet 的.spec.template
的变动作出反应。RollingUpdate:默认配置。将按照与 Pod 终止相同的顺序(从最大序号到最小序号)进行,每次更新一个 Pod。
.spec.updateStrategy.rollingUpdate.partition可以实现更新策略的分区。所有序号大于等于该分区序号的 Pod 都会被更新。所有序号小于该分区序号的 Pod 都不会被更新,并且,即使他们被删除也会依据之前的版本进行重建。
Service
将运行在一组 Pods上的应用程序公开为网络服务的抽象方法。就是逻辑上的一组 Pod,一种可以访问它们的策略 。
Service配置样例:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
上述配置是定义了一个名为my-service的Service,其会将请求代理到标签为app=MyApp且TCP端口9376的Pod上。
超容量
当某个EndPoints资源中包含的端点个数超过1000,则集群会为Endpoints 添加注解 endpoints.kubernetes.io/over-capacity: truncated
。Endpoints 控制器会将 Endpoints 对象数量截断到 1000。
流量策略
你可以设置 spec.externalTrafficPolicy
字段来控制来自于外部的流量是如何路由的。可选值有 Cluster
和 Local
。
你可以设置 spec.internalTrafficPolicy
字段来控制内部来源的流量是如何转发的。可设置的值有 Cluster
和 Local
。
Cluster:会将外部流量路由到所有就绪的端点
Local:会只路由到当前节点上就绪的端点。如当前节点上没有就绪的端点,kube-proxy 不会转发请求相关服务的任何流量
IP 和 Port
NodeIP
: Node节点的IP地址,这是真实的物理网卡的IP地址。Kubernetes集群之外的节点访问集群,必须通过NodeIP进行通信。
ClusterIP
:Service的IP地址,虚拟的IP,无法Ping通。PodIP
: Pod的IP地址NodePort
:通过每个节点上的 IP 和静态端口(NodePort
)暴露服务。NodePort
服务会路由到自动创建的ClusterIP
服务。通过请求<节点 IP>:<节点端口>
,你可以从集群的外部访问一个NodePort
服务。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: MyApp
ports:
# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
- port: 80
targetPort: 80
# 可选字段
# 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号(默认:30000-32767)
nodePort: 30007
DaemonSet
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
DaemonSet 的一些典型用法:
在每个节点上运行集群守护进程
在每个节点上运行日志收集守护进程
在每个节点上运行监控守护进程
Namespace
Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。这些虚拟集群被称为Namespace。




