暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kubernetes一些概念知识

慢行的蜗牛 2021-08-21
370

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

一些常用命令

  1. 查看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 显示应用程序运行的时间。

  1. 要查看 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
  1. 要查看 Deployment 创建的 ReplicaSet(rs
    ),运行 kubectl get rs
    。输出类似于:

NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-75675f5897 3 3 3 18s
  1. 更新线上的镜像

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record

或者

kubectl edit deployment.v1.apps/nginx-deployment
  1. 查看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
  1. 回滚到历史的某个版本

kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2
  1. 缩放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。



文章转载自慢行的蜗牛,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论