Kubernetes-2

Kubernetes学习第二天

  • k8s-2
    • 1、Kubernetes的核心组件
    • 2、pod
      • 2.1、什么是pod
    • 3、3种启动pod的方式
      • 3.1、命令行启动pod
        • 3.1.1、执行下面命令,背后发生了什么?
      • 3.2、启动一个pod背后发生了什么
      • 3.3、使用yml文件
        • 3.3.1、标准的pod
        • 3.3.2、使用部署控制器启动pod
        • 3.3.3、删除部署控制器
    • 4、部署控制器和副本控制器直接的关系
    • 5、一些命令
      • kubectl get pod -o wide
      • kubectl get deployment(查看部署控制器)--->kubectl get deploy
      • kubectl delete pod pod的名字
      • kubectl get replicaset(查看副本控制器)--->kubectl get rs
      • kubectl delete rs 类型名字
      • kubectl apply -f yaml文件
      • 查看pod的详细信息
    • 6、资源类型有哪些
    • 7、pod有多少种状态
    • 8、各种控制器
      • 8.1、deployment-部署控制器
      • 8.2、ReplicaSet-副本控制器
      • 8.3、daemonSet-守护进程控制器
      • 8.4、job-批处理工作器
      • 8.5、cronjob-计划任务控制器
      • 8.6、statefullSet
    • 9、调度器有哪些调度算法
    • 10、pod的资源限制
      • 10.1、对内存的限制--->通过命名空间
      • 10.2、直接限制pod的资源,不对命名空间进行限制
      • 10.3、对cpu的限制--->命名空间
      • 10.4、对pod的内存和cpu限制
      • 10.5、总的来说对pod的资源限制有两种方式
    • 11、查看cpu资源
    • 12、查看内存资源
    • 13、理解k8s中cpu和内存资源限制参数中cpu计量单位

k8s-2

1、Kubernetes的核心组件

  • apiserver : 背后有一个程序去运行,提供了一个接口,像一个交通枢纽。(6443)
  • etcd:开源的key,value类型的数据库(2379,2380,2381)
  • scheduler:调度器—》监视新创建的,未指定运行节点的pod,并选择节点来让pod在上面运行
    • pod: 一个或者一组容器,最小的可部署单元。
  • kube-controller-manager: 管理控制器的
  • cloud-controller-manager: 与公有云进行对接的控制器
  • kubelet:启容器的,调用docker去启动容器,指挥docker去启动容器
  • Kube Proxy:将业务pod的网络对接出去,包括将数据接进来,把里面的数据送出去,本质上是一个网络代理。

2、pod

2.1、什么是pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

'Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。'

3、3种启动pod的方式

3.1、命令行启动pod

[root@master ~]# kubectl create deployment k8s-nginx  --image=nginx  -r 3
deployment.apps/k8s-nginx created
[root@master ~]# kubectl get pod
NAME                         READY   STATUS              RESTARTS   AGE
k8s-nginx-75f95db655-dxwc6   0/1     ContainerCreating   0          18s
k8s-nginx-75f95db655-f8cnx   0/1     ContainerCreating   0          18s
k8s-nginx-75f95db655-ww9mk   0/1     ContainerCreating   0          18s
[root@master ~]# 
3.1.1、执行下面命令,背后发生了什么?
kubectl create deployment k8s-nginx  --image=nginx  -r 3

执行命令 kubectl create deployment k8s-nginx --image=nginx -r 3 将创建一个名为 “k8s-nginx” 的部署(Deployment),使用 nginx 镜像,并且副本数设置为 3。

背后发生了以下一些步骤:

  1. 通过 kubectl 命令将部署的请求发送到 Kubernetes API 服务器。

  2. API 服务器接收到请求后,将创建一个新的 Deployment 对象,并将其保存到 Kubernetes 的 etcd 数据库中。

  3. **控制器管理器(Controller Manager)**注意到新创建的 Deployment 对象,并启动一个控制器来处理该部署。

  4. 控制器检查当前集群中的节点状态,并根据部署的副本数(这里是 3)开始创建 Pod。

  5. **调度器(Scheduler)**根据节点的可用资源和调度策略,将 Pod 分配到可用的节点上。

  6. **Kubelet 代理(Kubelet Proxy)**在分配给节点的每个节点上启动并管理 Pod 的容器。

  7. 容器运行时(如 Docker)根据指定的镜像(这里是 nginx)拉取镜像并在每个 Pod 中启动容器。

  8. 创建的 Pod 将进入运行状态,并通过 Kubernetes 网络插件与其他 Pod 和服务进行通信。

通过这个过程,您将在集群中创建一个名为 “k8s-nginx” 的 Deployment 对象,并且将有 3 个副本的 Pod 运行 nginx 镜像。

3.2、启动一个pod背后发生了什么

image-20240305212443282

image-20240305212510962

  1. kubectl 向apiserver发起请求,提交数据,需要创建pod和部署控制器
  2. apiserver收到请求后,会将数据写到ETCD数据库里,通知控制器有新的任务
  3. 副本控制器监视程序去访问apiserver的接口发现有新的任务,然后就立马执行
  4. 监视程序通知副本控制器去创建需要做的事情,例如: 创建几个程序,多少个副本(实例)。然后又将数据写入到ETCD数据库里
  5. 调度器获取新的任务,进行调度,例如:新的pod需要多少cpu或者内存,调度需要在哪台node节点上运行,调度器将调度信息写入到ETCD数据库里。
  6. apiserver会通知调度器选中的node节点上的kubelet,去部署pod,然后根据副本控制器的数据,例如:什么程序,多少个副本等,kubelet通过安装的docker容器去启动相应数量的容器
  7. kubeproxy会将pod的网络打通,配置好ip以及pod的发布和负载均衡

3.3、使用yml文件

3.3.1、标准的pod
[root@master ~]# mkdir /pod
[root@master ~]# cd /pod/
[root@master pod]# 
[root@master pod]# vim simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

[root@master pod]# 

这是一个名为 “simple-pod.yaml” 的 Pod 配置文件,其中定义了一个名为 “nginx” 的 Pod。

  • apiVersion: v1 表示该配置文件使用的 Kubernetes API 版本是 v1。
  • kind: Pod 表示该配置文件定义的是一个 Pod 对象。—>资源类型:pod,node,控制器等都是类型
  • metadata 部分包含了关于 Pod 的元数据,如名称和其他标签等。
    • name: nginx 指定了 Pod 的名称为 “nginx”。
  • spec 部分定义了 Pod 的规格,包括了容器和其他配置信息。—>具体的某个资源对象的详细信息
    • containers 列表中定义了一个容器
      • name: nginx 定义了容器的名称为 “nginx”。
      • image: nginx:1.14.2 指定了容器所使用的镜像为 “nginx:1.14.2”,即使用了版本为 1.14.2 的 Nginx 镜像。
      • ports 列表定义了容器所监听的端口
        • containerPort: 80 表示容器将监听端口号 80,允许其他服务通过该端口访问该容器。

这个配置文件描述了一个非常简单的 Pod,其中只有一个容器运行着 Nginx 服务,并监听容器的 80 端口。

[root@master pod]# kubectl apply -f simple-pod.yaml 
pod/nginx created
[root@master pod]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          3m42s
[root@master pod]# 
3.3.2、使用部署控制器启动pod
[root@master pod]# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:			#打标签
    app: nginx		#具体的标签,一般采用key对应的value,key可以自己定义
spec:
  replicas: 3		#指定pod副本的数量 pod的数量
  selector:			#选择器,我们的副本控制器去匹配需要启动的容器的配置
    matchLabels:	#具体匹配的标签
      app: nginx	#根据app的值去找nginx的标签
  template:			#模板:启动pod的模板
    metadata:		#模板的启动的pod的元数据
      labels:		#给启动的pod打标签
        app: nginx	#具体的标签
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

这是一个名为 nginx-deployment.yaml 的配置文件,用于定义一个 Deployment(部署)资源,用于管理运行在 Kubernetes 集群中的多个 Pod 实例。

让我们逐行解释这个配置文件的内容:

  • apiVersion: apps/v1 指定了使用的 Kubernetes API 版本。
  • kind: Deployment 表示这是一个 Deployment 资源的定义。
  • metadata 部分包含了 Deployment 的元数据,如名称和标签。
  • spec 部分定义了 Deployment 的规范。
    • replicas: 3 指定了要创建的 Pod 实例数量为 3。
    • selector 部分定义了用于选择要管理的 Pod 的标签。
      • matchLabels 部分定义了要匹配的标签。这里使用了 app: nginx 标签来选择所有具有该标签的 Pod。
    • template 部分定义了要创建的 Pod 的模板
      • metadata 部分定义了 Pod 的元数据,包括标签。
      • spec 部分定义了 Pod 的规范。
        • containers 部分定义了 Pod 中的容器。
          • name: nginx 指定了容器的名称为 nginx
          • image: nginx:1.14.2 指定了要使用的容器镜像为 nginx:1.14.2
          • ports 部分定义了容器暴露的端口。
            • containerPort: 80 指定了容器监听的端口为 80。

这个配置文件描述了一个名为 nginx-deployment 的 Deployment,它将创建 3 个 Pod 实例,每个实例运行一个名为 nginx 的容器,使用 nginx:1.14.2 镜像,并将容器的端口 80 暴露出来。

[root@master pod]# kubectl apply -f nginx-deployment.yaml 
deployment.apps/nginx-deployment created
[root@master pod]# kubectl get pod
NAME                                READY   STATUS              RESTARTS   AGE
nginx                               1/1     Running             0          20m
nginx-deployment-66b6c48dd5-6j6tg   0/1     ContainerCreating   0          7s
nginx-deployment-66b6c48dd5-dcbk2   1/1     Running             0          7s
nginx-deployment-66b6c48dd5-k8n5d   1/1     Running             0          7s
[root@master pod]# 
[root@master pod]# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           2m26s
[root@master pod]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-66b6c48dd5   3         3         3       2m32s
[root@master pod]# 
[root@master pod]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx                               1/1     Running   0          23m
nginx-deployment-66b6c48dd5-6j6tg   1/1     Running   0          3m
nginx-deployment-66b6c48dd5-dcbk2   1/1     Running   0          3m
nginx-deployment-66b6c48dd5-k8n5d   1/1     Running   0          3m
[root@master pod]# 

名字是有层次效果的

3.3.3、删除部署控制器

方法1:

[root@master pod]# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           4m54s
[root@master pod]# kubectl delete deploy nginx-deployment
deployment.apps "nginx-deployment" deleted
[root@master pod]# kubectl get pod
NAME                                READY   STATUS        RESTARTS   AGE
nginx                               1/1     Running       0          26m
nginx-deployment-66b6c48dd5-dcbk2   0/1     Terminating   0          5m20s
nginx-deployment-66b6c48dd5-k8n5d   0/1     Terminating   0          5m20s
[root@master pod]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          26m
[root@master pod]# 

方法2:

[root@master pod]# kubectl delete -f nginx-deployment.yaml 
deployment.apps "nginx-deployment" deleted
[root@master pod]# kubectl get pod
NAME                                READY   STATUS        RESTARTS   AGE
nginx                               1/1     Running       0          27m
nginx-deployment-66b6c48dd5-bbvcj   0/1     Terminating   0          19s
nginx-deployment-66b6c48dd5-ddxwl   0/1     Terminating   0          19s
nginx-deployment-66b6c48dd5-mdlg9   0/1     Terminating   0          19s
[root@master pod]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          27m
[root@master pod]# 

4、部署控制器和副本控制器直接的关系

部署控制器和副本控制器是 Kubernetes 中两个不同的概念,它们之间存在一种从属关系

  • 部署控制器(Deployment Controller)是 Kubernetes 中的一个资源对象,用于管理应用程序的部署。它定义了所需的副本数量和期望状态,并负责确保系统中运行的副本数与所需的副本数保持一致。部署控制器还可以实现滚动更新、回滚和自动修复等功能。

  • 副本控制器(ReplicaSet Controller)是 Kubernetes 中的另一个资源对象,用于确保指定数量的 Pod 副本正在运行。副本控制器定义了应该创建和维护的 Pod 副本数量,并根据需要进行扩展或收缩。它通过监视 Pod 的状态并采取必要的操作,以确保所需的副本数与实际运行的副本数一致。

因此,可以说部署控制器是副本控制器的一种高级抽象。部署控制器使用副本控制器来实现对应用程序部署的管理。部署控制器可以创建和管理副本控制器,并在需要时自动进行滚动更新或回滚操作,以确保应用程序的可用性和稳定性。

简而言之,部署控制器是用于管理应用程序部署的高级控制器,而副本控制器是用于确保指定数量的 Pod 副本正在运行的基础控制器。

  • 即:部署控制器去控制副本控制器,副本控制器去控制管理pod

  • 如果把副本控制器删了,部署控制器会帮我们去重一个副本控制器,然后重启副本控制器下边的pod

  • 删除了副本控制器,会把副本控制器下面的pod删了

  • 删除部署控制器,不会重新去创建副本控制器和pod了

5、一些命令

kubectl get pod -o wide

[root@master ~]# kubectl get pod -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
k8s-nginx-75f95db655-gkbqs   1/1     Running   0          13m   10.244.247.4    node-2   <none>           <none>
k8s-nginx-75f95db655-rkzxv   1/1     Running   0          13m   10.244.84.133   node-1   <none>           <none>
[root@master ~]# 

kubectl get pod -o wide 命令用于获取当前集群中所有Pod的详细信息,包括它们的名称、状态、所在的节点、IP地址等。

具体作用如下:

  • kubectl get pod:获取当前集群中所有Pod的摘要信息,包括名称、状态、重启次数等。
  • -o wide:使用"wide"输出格式,该格式会显示更多的列,包括所在的节点、IP地址、节点选择器等。

通过执行 kubectl get pod -o wide 命令,将获得一个详细的列表,其中包含了所有Pod的信息,以便更好地了解它们在集群中的状态和位置。

kubectl get deployment(查看部署控制器)—>kubectl get deploy

[root@master ~]# kubectl get deployment
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
k8s-nginx   2/2     2            2           5m56s

kubectl get deployment 命令用于获取当前集群中所有部署(Deployment)的摘要信息,包括它们的名称、就绪副本数、最新副本数、可用副本数等。

具体作用如下:

  • kubectl get deployment:获取当前集群中所有部署的摘要信息,包括名称、就绪副本数、最新副本数、可用副本数等。
  • 默认情况下,输出的信息包括部署的名称、就绪副本数、最新副本数、可用副本数和创建时间。

通过执行 kubectl get deployment 命令,将获得一个部署的列表,其中包含了所有部署的信息,以便了解它们在集群中的状态和可用性。在示例中,部署名称为 “k8s-nginx”,它有2个就绪副本、2个最新副本和2个可用副本,已经运行了5分钟56秒。

kubectl delete pod pod的名字

[root@master ~]# kubectl delete pod test-pod
pod "test-pod" deleted

kubectl delete pod test-pod 命令用于删除名为 “test-pod” 的Pod。

具体作用如下:

  • kubectl delete pod:删除指定名称的Pod。
  • test-pod:要删除的Pod的名称。

执行该命令后,Kubernetes将会删除名为 “test-pod” 的Pod。请注意,删除Pod将导致Pod被终止并从集群中移除。

kubectl get replicaset(查看副本控制器)—>kubectl get rs

[root@master ~]# kubectl get replicaset
NAME                   DESIRED   CURRENT   READY   AGE
k8s-nginx-75f95db655   2         2         2       19m
[root@master ~]# 

kubectl get replicaset 命令用于获取当前集群中所有副本集(ReplicaSet)的摘要信息,包括它们的名称、期望副本数、当前副本数、就绪副本数等。

就是说kubectl get replicaset用来查看副本控制器的

kubectl get replicaset 可以简写为:kubectl get rs

具体作用如下:

  • kubectl get replicaset:获取当前集群中所有副本集的摘要信息,包括名称、期望副本数、当前副本数、就绪副本数等。
  • 默认情况下,输出的信息包括副本集的名称、期望副本数、当前副本数、就绪副本数和创建时间。

通过执行 kubectl get replicaset 命令,将获得一个副本集的列表,其中包含了所有副本集的信息,以便了解它们在集群中的状态和可用性。在示例中,副本集名称为 “k8s-nginx-75f95db655”,它有2个期望副本、2个当前副本和2个就绪副本,已经存在了19分钟。

kubectl delete rs 类型名字

 kubectl delete rs k8s-nginx-75f95db655

这是删除副本控制器

删除了副本控制器,部署控制器会再次启动副本控制器

kubectl apply -f yaml文件

利用yaml文件去启pod

[root@master pod]# kubectl apply -f simple-pod.yaml 
pod/nginx created
[root@master pod]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
nginx                        1/1     Running   0          29s

这个命令 kubectl apply -f simple-pod.yaml 用于创建一个 Pod,它会根据提供的配置文件 simple-pod.yaml 中的定义来创建 Pod。

  • kubectl apply 是一个命令行工具,用于向 Kubernetes 集群提交资源配置文件并进行创建或更新操作。
  • -f simple-pod.yaml 参数指定了要使用的配置文件,这里是 simple-pod.yaml
  • pod/nginx created 是命令的输出结果,表示 Pod nginx 创建成功。

接下来,您使用 kubectl get pod 命令来获取 Pod 的列表。输出结果中的各列含义如下:

  • NAME 列显示 Pod 的名称。
  • READY 列显示 Pod 当前的就绪状态,即容器是否已经启动并就绪。
  • STATUS 列显示 Pod 的当前状态,如 Running(运行中)、Pending(等待中)等。
  • RESTARTS 列显示容器重启的次数。
  • AGE 列显示 Pod 创建的时间距离现在的时长。

在输出中,Pod 名称为 nginx,它的 READY 列显示为 1/1,表示该 Pod 中的容器已经启动并且就绪,STATUS 列显示为 Running,表示该 Pod 正在运行且正常。

查看pod的详细信息

[root@master pod]# kubectl describe pod nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         node-1/192.168.182.134
Start Time:   Tue, 05 Mar 2024 22:02:41 +0800
Labels:       <none>
Annotations:  cni.projectcalico.org/podIP: 10.244.84.134/32
              cni.projectcalico.org/podIPs: 10.244.84.134/32
Status:       Running
IP:           10.244.84.134
IPs:
  IP:  10.244.84.134
Containers:
  nginx:
    Container ID:   docker://0af57985c5ca8512cfb91264add1d08613bf7c09873dfc2fe885d468cf47a15b
    Image:          nginx:1.14.2
    Image ID:       docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Tue, 05 Mar 2024 22:02:58 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-zdvg8 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-zdvg8:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-zdvg8
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  49m   default-scheduler  Successfully assigned default/nginx to node-1
  Normal  Pulling    49m   kubelet            Pulling image "nginx:1.14.2"
  Normal  Pulled     49m   kubelet            Successfully pulled image "nginx:1.14.2" in 16.01565299s
  Normal  Created    49m   kubelet            Created container nginx
  Normal  Started    49m   kubelet            Started container nginx
[root@master pod]# 

6、资源类型有哪些

  • node
  • pod
  • 控制器:部署控制器,副本控制器
  • 命名空间:namespace

7、pod有多少种状态

  • Pending: Pod没有调度到节点上。----》资源不够,cpu,内存 或者污点
  • Running: Pod中至少一个容器正在运行。
  • Succeeded: 停止pod成功。
  • Failed: 停止pod失败。
  • Unknown: Pod的状态无法确定。
  • Terminating: Pod正在被终止,可能由于删除请求或其他终止操作。
  • ContainerCreating: Pod中的容器正在被创建。
  • ContainerRunning: Pod中的容器正在运行。
  • ContainerTerminated: Pod中的容器已经终止。
  • completed: pod里的容器主进程已经退出,容器没有退出。
  • OOMKilled: pod进入了循环启动被杀死,然后又启动又被杀死。—》使用的内存超过我们的限制就会被杀死。
  • CrashLoopBackOff: 是一个表示容器在启动后立即崩溃并进入循环重启的状态。这通常是由于容器在启动过程中遇到了问题或崩溃而导致的。
  • ErrImagePull: 拉取镜像拉不下来。

8、各种控制器

8.1、deployment-部署控制器

部署pod

  • 作用: Deployment的主要目的是提供一种机制,用于定义、创建和更新Pod副本。它包含一个Pod模板,定义了所需的容器和其他相关配置,以及一个副本数的定义。Deployment确保所需的副本数一直在运行,同时支持滚动更新、回滚和扩缩容等功能。
  • 使用场景:
    • 应用部署和升级: 通过定义Deployment,用户可以轻松地部署应用程序,并在需要时进行滚动更新。Deployment会逐步替换现有的Pod,确保应用程序在升级期间保持可用性。
    • 回滚操作: 如果升级后发现问题,可以通过回滚到先前的版本来还原。Deployment会管理这个过程,确保回滚是平滑而可控的。
    • 故障恢复: 如果某个Pod异常终止,Deployment会自动启动新的Pod,确保系统中的副本数达到所需的状态。
    • 扩缩容: 通过调整Deployment的副本数,可以实现应用程序的扩缩容,以适应变化的负载。

通过使用Deployment,用户不需要直接操作Pod,而是通过声明性的方式描述所需的状态和配置。Kubernetes系统会根据用户定义的Deployment规范来自动管理和维护应用程序的运行状态。这种抽象层简化了应用程序的部署和维护,提高了操作的可靠性和可重复性。

8.2、ReplicaSet-副本控制器

控制pod个数的

  • 作用: 保持指定数量的Pod副本运行。如果有Pod异常终止或删除,副本控制器将启动新的Pod,以确保达到所需的副本数。
  • 使用场景: 适用于水平扩展应用程序,确保在任何时候都有指定数量的相同Pod在运行。

8.3、daemonSet-守护进程控制器

  • 作用: 确保在集群中的每个节点上运行一个副本的Pod。当新节点加入集群时,守护进程控制器会自动在新节点上启动Pod。
  • 使用场景: 适用于在每个节点上运行后台守护进程,如日志收集、监控等。

8.4、job-批处理工作器

  • 作用: 用于一次性执行任务或作业。Pod运行完任务后会被删除。
  • 使用场景: 适用于需要执行一次性任务的场景,如数据处理、批量作业等。

8.5、cronjob-计划任务控制器

  • 作用: 基于时间调度周期性运行的任务。类似于Job,但是可以定期执行。
  • 使用场景: 适用于需要按照预定的时间表执行任务的场景,如定时备份、定期清理等。

8.6、statefullSet

  • 作用: 维护有状态应用程序的稳定标识。确保每个Pod都有唯一的标识和持久存储,以便支持有状态应用程序的运行。
  • 使用场景: 适用于需要持久化存储、有序部署和唯一标识的应用程序,如数据库。

9、调度器有哪些调度算法

根据pod调度策略和方法:

  1. deployment: 全自动调度算法 --》根据每台节点服务器的综合算力
  2. nodename 节点名字
  3. node selector:定向调度算法–>根据node的标签去调度
  4. nodeaffinity 节点亲和性算法 --》尽量把不同的pod放到一台node上
  5. podaffinity pod亲和性算法–》尽量把相同的pod放到一起
  6. taintstolerations 污点和容忍度

10、pod的资源限制

k8s集群的总算力是固定的,所以得通过命名空间去限制资源

10.1、对内存的限制—>通过命名空间

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/

1.创建命名空间

[root@master pod]# kubectl create namespace default-mem-example
namespace/default-mem-example created
[root@master pod]# kubectl get namespace|grep default-mem
default-mem-example   Active   20s
[root@master pod]# 

2.写yaml文件

[root@master pod]# vim default-mem.yaml 
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
  namespace: default-mem-example
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

[root@master pod]# 

3.执行yaml文件

[root@master pod]# kubectl apply -f default-mem.yaml 
limitrange/mem-limit-range created
[root@master pod]# 

4.查看资源限制

[root@master pod]# kubectl get limitrange
NAME              CREATED AT
mem-limit-range   2024-03-06T12:26:34Z
[root@master pod]# 

kubectl get limitrange 是 Kubernetes 命令行工具中的一个命令,用于获取集群中定义的资源限制范围(LimitRange)的信息。

在 Kubernetes 中,LimitRange 是一种资源对象,用于定义容器中的资源限制。它可以限制容器的 CPU 使用量、内存使用量、存储资源等。通过定义 LimitRange,可以确保容器在运行时不会超出指定的资源限制,从而保证集群的稳定性和资源的公平分配。

运行 kubectl get limitrange 命令会列出集群中所有已定义的 LimitRange 对象的名称和创建时间。在你的输出中,只显示了一个 LimitRange 对象,名称为 mem-limit-range,创建时间为 2024-03-06T12:26:34Z

如果想获取更详细的关于某个 LimitRange 对象的信息,可以使用 kubectl describe limitrange <limitrange-name> 命令,将 <limitrange-name> 替换为想要查看的 LimitRange 对象的名称。

5.启pod

[root@master pod]# vim memory-defaults-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo
  namespace: default-mem-example
spec:
  containers:
  - name: default-mem-demo-ctr
    image: nginx
[root@master pod]# 

这是一个名为 memory-defaults-pod.yaml 的 YAML 文件,用于创建一个 Kubernetes Pod 对象。下面是文件内容的解释:

  • apiVersion: v1: 指定使用的 Kubernetes API 版本为 v1。
  • kind: Pod: 定义要创建的资源类型为 Pod。
  • metadata: 定义资源的元数据,包括名称和命名空间等。
    • name: default-mem-demo: 指定 Pod 的名称为 default-mem-demo
    • namespace: default-mem-example: 指定 Pod 所属的命名空间为 default-mem-example
  • spec: 定义 Pod 的规格,包括容器和其他配置。
    • containers: 定义 Pod 中的容器列表。
      • - name: default-mem-demo-ctr: 定义容器的名称为 default-mem-demo-ctr
      • - image: nginx: 指定容器使用的镜像为 nginx

这个 YAML 文件描述了一个简单的 Pod,其中包含一个名为 default-mem-demo-ctr 的容器,使用 nginx 镜像。这个 Pod 的名称是 default-mem-demo,所属的命名空间是 default-mem-example

你可以使用 kubectl apply -f memory-defaults-pod.yaml 命令将这个 YAML 文件应用到 Kubernetes 集群中,从而创建该 Pod 对象。

6.继续启动pod(查看pod要指定命名空间)

[root@master pod]# kubectl apply -f memory-defaults-pod.yaml 
pod/default-mem-demo created
[root@master pod]# kubectl get pod -n default-mem-example  #这里要指定命名空间
NAME               READY   STATUS    RESTARTS   AGE
default-mem-demo   1/1     Running   0          57s
[root@master pod]# 

7.查看pod的详细信息

[root@master pod]# kubectl describe pod default-mem-demo -n default-mem-example
Name:         default-mem-demo
Namespace:    default-mem-example
Priority:     0
Node:         node-2/192.168.182.135
Start Time:   Wed, 06 Mar 2024 20:36:37 +0800
Labels:       <none>
Annotations:  cni.projectcalico.org/podIP: 10.244.247.13/32
              cni.projectcalico.org/podIPs: 10.244.247.13/32
Status:       Running
IP:           10.244.247.13
IPs:
  IP:  10.244.247.13
Containers:
  default-mem-demo-ctr:
    Container ID:   docker://c2c5eaecd0d1d8f814d1de0c19b526ddb0d0336f20a42587871dfd3b889cc63d
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 06 Mar 2024 20:36:53 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-rx2hs (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-rx2hs:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-rx2hs
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  3m22s  default-scheduler  Successfully assigned default-mem-example/default-mem-demo to node-2
  Normal  Pulling    3m22s  kubelet            Pulling image "nginx"
  Normal  Pulled     3m6s   kubelet            Successfully pulled image "nginx" in 15.68468529s
  Normal  Created    3m6s   kubelet            Created container default-mem-demo-ctr
  Normal  Started    3m6s   kubelet            Started container default-mem-demo-ctr
[root@master pod]# 

8.查看命名空间的资源限制

[root@master pod]# kubectl describe limitrange mem-limit-range
Name:       mem-limit-range
Namespace:  default
Type        Resource  Min  Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---  ---  ---------------  -------------  -----------------------
Container   memory    -    -    256Mi            512Mi          -
[root@master pod]# 
[root@master pod]# kubectl describe namespace default-mem-example
Name:         default-mem-example
Labels:       <none>
Annotations:  <none>
Status:       Active

No resource quota.

Resource Limits
 Type       Resource  Min  Max  Default Request  Default Limit  Max Limit/Request Ratio
 ----       --------  ---  ---  ---------------  -------------  -----------------------
 Container  memory    -    -    256Mi            512Mi          -
[root@master pod]# 

10.2、直接限制pod的资源,不对命名空间进行限制

1.创建命名空间

[root@master pod]# kubectl create namespace mem-example
namespace/default-mem-example created
[root@master pod]# kubectl get namespace|grep mem-example
mem-example           Active   41m
[root@master pod]# 

2.编写yaml文件

[root@master pod]# vim limit-pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-ctr
    image: polinux/stress
    resources:
      requests:
        memory: "100Mi"
      limits:
        memory: "200Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

[root@master pod]# 

3.启动pod

[root@master pod]# kubectl apply -f limit-pod-2.yaml 
pod/memory-demo created
[root@master pod]# kubectl get pod -n mem-example
NAME          READY   STATUS    RESTARTS   AGE
memory-demo   1/1     Running   0          16s
[root@master pod]# 

4.查看资源限制

[root@master pod]# kubectl describe pod memory-demo -n mem-example
    State:          Running
      Started:      Wed, 06 Mar 2024 21:00:21 +0800
    Ready:          True
    Restart Count:  0
    Limits:
      memory:  200Mi
    Requests:
      memory:     100Mi

10.3、对cpu的限制—>命名空间

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/

10.4、对pod的内存和cpu限制

https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-cpu-resource/
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-memory-resource/

10.5、总的来说对pod的资源限制有两种方式

  1. 通过限制命名空间的cpu和内存来限制pod的大小—>pod要去绑定这个命名空间

    • 命名空间和limitrange进行绑定限制条件

      e5ea372048b5c15c9abc4696e4701bd

  2. 不对命名空间进行资源限制,而是直接限制pod的cpu和内存

11、查看cpu资源

  • top 1
  • lscpu
  • cat /proc/cpuinfo

image-20240307105511274

CPU 单位

CPU 资源以 CPU 单位度量。Kubernetes 中的一个 CPU 等同于:

  • 1 个 AWS vCPU
  • 1 个 GCP核心
  • 1 个 Azure vCore
  • 裸机上具有超线程能力的英特尔处理器上的 1 个超线程

小数值是可以使用的。一个请求 0.5 CPU 的容器保证会获得请求 1 个 CPU 的容器的 CPU 的一半。 你可以使用后缀 m 表示毫。例如 100m CPU、100 milliCPU 和 0.1 CPU 都相同。 精度不能超过 1m。

CPU 请求只能使用绝对数量,而不是相对数量。0.1 在单核、双核或 48 核计算机上的 CPU 数量值是一样的。

12、查看内存资源

  • top m
  • free -h

image-20240307105816142

内存单位

内存资源的基本单位是字节(byte)。你可以使用这些后缀之一,将内存表示为 纯整数或定点整数:E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki。 例如,下面是一些近似相同的值:

128974848, 129e6, 129M, 123Mi

13、理解k8s中cpu和内存资源限制参数中cpu计量单位

https://cloud.tencent.com/developer/article/1903034

  • requests:代表容器启动请求的资源限制,分配的资源必须要达到此要求。

  • limits:代表最多可以请求多少资源。

  • 单位m:CPU的计量单位叫毫核(m)。一个节点的CPU核心数量乘以1000,得到的就是节点总的CPU总数量。如,一个节点有两个核,那么该节点的CPU总量为2000m。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/440061.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows部署腾讯tmagic-editor01-Hello world

之前写过一篇使用yarn实现的https://blog.csdn.net/qq_36437991/article/details/133644558&#xff0c;后面的两个没有写&#xff0c;这次准备重新实现 环境 pnpm 8.15.1 node 18.19.0 创建vue项目 pnpm create vitecd hello-world pnpm install执行pnpm dev启动项目 安…

[PTA] 分解质因子

输入一个正整数n&#xff08;1≤n≤1e15&#xff09;&#xff0c;编程将其分解成若干个质因子&#xff08;素数因子&#xff09;积的形式。 输入格式: 任意给定一个正整数n&#xff08;1≤n≤1e15&#xff09;。 输出格式: 将输入的正整数分解成若干个质因子积的形式&#…

TypeScript 基础(一)

目录 一、概述 二、开发环境 三、数据类型 1.boolean 2.number 3.string 4.Array 5.type 6.tuple 7.enum 8.any 9.null / undefined 10.never 11.object 结束 一、概述 TypeScript 是一种由微软开发的开源编程语言。它是 JavaScript 的一个超集&#xff0c;这意…

正则表达式-分组

1、oracle-正则表达式&#xff1a;将09/29/2008 用正则表达式转换成2008-09-29 select regexp_replace(09/29/2008, ^([0-9]{2})/([0-9]{2})/([0-9]{4})$, \3-\1-\2) replace from dual; 解析&#xff1a;regexp_replace-替换&#xff0c; 第一个参数&#xff1a;需要进行处…

5个实用的PyCharm插件

大家好&#xff0c;本文向大家推荐五个顶级插件&#xff0c;帮助开发人员提升PyCharm工作流程&#xff0c;将生产力飞升到新高度。 1.CodiumAI 安装链接&#xff1a;https://plugins.jetbrains.com/plugin/21206-codiumate--code-test-and-review-with-confidence--by-codium…

项目的搭建与配置

vue create calendar_pro 选择如下配置选项 安装 vue3 支持 vue add vue-next package.json 关闭 eslint 检测。 vue.config.js 配置跨域同源策略。 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServe…

【uni-app】condition 启动模式配置,生产环境无效,仅开发期间生效

在小程序开发过程中&#xff0c;每次代码修改后&#xff0c;都会启动到首页&#xff0c;有时非常不方便&#xff0c;为了更高效的开发&#xff0c;有时需要模拟直接跳转到指定的页面&#xff0c; 操作方法如下&#xff1a; 在pages.joson里面配置下列代码&#xff1a; "…

【自然语言处理六-最重要的模型-transformer-上】

自然语言处理六-最重要的模型-transformer-上 什么是transformer模型transformer 模型在自然语言处理领域的应用transformer 架构encoderinput处理部分&#xff08;词嵌入和postional encoding&#xff09;attention部分addNorm Feedforward & add && NormFeedforw…

24/03/07总结

esayx: 贪吃蛇: #include "iostream" #include "cmath" #include "conio.h" #include "easyx.h" #include "time.h" #define NODE_WIDTH 40 using namespace std; typedef struct {int x;int y; }node; enum direction /…

Python笔记|基础算数运算+数字类型(1)

重新整理记录一下python的基础知识 基础运算符 、-、*、/ &#xff1b;括号 ()用来分组。 >>>2 2 4 >>>50 - 5*6 20 >>>(50 - 5*6) / 4 5.0 >>>8 / 5 1.6向下取整除法&#xff1a;向下舍入到最接近的整数的数学除法。运算符是 //。比如1…

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…

谷歌浏览器打包扩展插件,提示清单文件缺失或不可读取

今天想把谷歌浏览器的扩展打包一下&#xff0c;放到我虚拟机的谷歌浏览器&#xff0c;但是一直打包不成功。 问题 打包扩展程序错误 提示‘清单文件缺失或不可读取’ 原因 路径没有选择正确&#xff01; 解决办法 1.首先找到google浏览器的安装路径。在谷歌浏览器地址栏输…

穷人想赚钱该怎么选打工VS创业?2024年如何把握新机遇?

在贫穷的困境中&#xff0c;打工与创业似乎成为了两条截然不同的道路&#xff0c;摆在每一个渴望改变命运的人面前。然而&#xff0c;这并非简单的选择题&#xff0c;而是一场关于勇气、智慧与机遇的较量。打工&#xff0c;对于许多人来说&#xff0c;是稳定且相对安全的收入来…

XSS靶场-DOM型初级关卡

一、环境 XSS靶场 二、闯关 1、第一关 先看源码 使用DOM型&#xff0c;获取h2标签&#xff0c;使用innerHTML将内容插入到h2中 我们直接插入<script>标签试一下 明显插入到h2标签中了&#xff0c;为什么不显示呢&#xff1f;看一下官方文档 尽管插入进去了&#xff0…

Java后端八股笔记

Java后端八股笔记 Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f44…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的技术应用

原文链接&#xff1a;双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的技术应用https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&tempkeyMTI2MF9DVWNrMFpvV1d3RGxBZUE2QXJBRnI1NEJkcVhzRFZwakRqYXhhVFQzQnh1MVhJcy1laWh6Nmd4R…

[密码学]入门篇——加密方式

一、概述 加密方法主要分为两大类&#xff1a; 单钥加密&#xff08;private key cryptography&#xff09;&#xff1a;加密和解密过程都用同一套密码双钥加密&#xff08;public key cryptography&#xff09;&#xff1a;加密和解密过程用的是两套密码 历史上&#xff0c…

Redis与 Memcache区别

Redis与 Memcache区别 1 , Redis 和 Memcache 都是将数据存放在内存中&#xff0c;都是内存数据库。不过 Memcache 还可用于缓存 其他东西&#xff0c;例如图片、视频等等。 2 , Memcache 仅支持key-value结构的数据类型&#xff0c;Redis不仅仅支持简单的key-value类型的数据&…

vue2 element 实现表格点击详情,返回时保留查询参数

先直观一点&#xff0c;上图 列表共5条数据&#xff0c;准备输入Author过滤条件进行查询 进入查看详情页&#xff0c;就随便搞了个按钮&#xff0c;将就看吧 点击返回后 一开始准备用vuex做这个功能&#xff0c;后来放弃了&#xff0c;想到直接用路由去做可能也不错。有时间…

如何获取国外信用卡?需要国外银行卡支付怎么解决?如何订阅国外产品?

当国内的用户想要使用国外的产品时&#xff0c;很多产品是需要订阅付费的。其中有些产品还没有引入国内&#xff0c;只能用国外的信用卡支付&#xff0c;对于在国内的朋友&#xff0c;如何获取一张国外的信用卡呢&#xff1f; 这里推荐一个平台&#xff1a;wildCard waildCard…