Kubernetes中的pod管理及优化

news2024/10/10 5:06:51

华子目录

  • 什么是pod
  • 1.创建`自主式pod`(生产不推荐)
    • 优点
    • 缺点
    • 示例1
    • 示例2
    • 示例3
    • 示例4
  • 2.利用`控制器`管理`pod`(推荐)
    • 应用版本的更新
  • 3.利用`yaml`文件部署应用
    • 优点
    • 3.1`yaml`配置文件参数
    • 3.2如何获取资源帮助
  • yaml文件编写示例
    • 1.运行简单的单个容器pod
    • 2.运行多个容器`pod`
    • 3.理解`pod`间的网络整合
    • 4.端口映射
    • 5.如何设定`环境变量`
    • 6.资源限制
    • 7.容器启动管理
    • 8.选择运行节点
    • 9.共享宿主机网络
  • `pod`的生命周期
    • init容器
    • `init容器`的功能
    • init容器示例

什么是pod

  • pod是可以创建和管理Kubernetes计算的最小可部署单元
  • 一个pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip
  • 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker
  • 多个容器间共享NetworkmemoryUTC namespace
    在这里插入图片描述

查看所有pod

[root@k8s-master ~]# kubectl get pods --all-namespaces

1.创建自主式pod(生产不推荐)

  • 所谓自主式,就是不是控制器中的pod

优点

  • 灵活性高

    • 可以精确控制pod的各种配置参数,包括容器的镜像、资源限制、环境变量、命令和参数等,满足特定的应用需求。
  • 学习和调试方便

    • 对于学习Kubernetes的原理和机制非常有帮助,通过手动创建pod可以深入了解pod结构配置方式。在调试问题时,可以更直接地观察和调试pod的设置。
  • 适用于特殊场景

    • 在一些特殊情况下,如进行一次性任务快速验证概念或在资源受限的环境中进行特定配置时,手动创建pod可能是一种有效的方式。

缺点

  • 管理复杂
    • 如果需要管理大量的pod手动创建和维护会变得非常繁琐和耗时。难以实现自动化扩缩容、故障恢复等操作
  • 缺乏高级功能
    • 无法自动享受Kubernetes提供的高级功能,如自动部署、滚动更新、服务发现等。这可能导致应用的部署和管理效率底下。
  • 可维护性差
    • 手动创建的pod在更新应用版本修改配置时需要手动干预,容易出现错误,并且难以保证一致性。相比之下,通过声明式配置或使用Kubernetes部署工具可以更方便地进行应用地维护和更新。

示例1

#运行一个名为web的pod
[root@k8s-master ~]# kubectl run web --image nginx
pod/web created

#显示pod的较为详细的信息
[root@k8s-master ~]# kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
web    1/1     Running   0          14s   10.244.1.12   k8s-node1.org   <none>           <none>

示例2

#在一个pod中运行2个nginx
[root@k8s-master ~]# cat testpod1.yml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: huazi   #pod的标签
  name: huazi   #pod的名字
spec:
  containers:
    - image: nginx   #pod的第一个镜像
      name: web1   #容器名
    - image: nginx  #pod中的第二个镜像
      name: web2   #容器名
[root@k8s-master ~]# kubectl apply -f testpod1.yml
pod/huazi created

#我们发现一个pod中运行2个nginx,只能运行一个
[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS             RESTARTS      AGE     IP            NODE            NOMINATED NODE   READINESS GATES
huazi   1/2     CrashLoopBackOff   5 (19s ago)   3m17s   10.244.2.21   k8s-node2.org   <none>           <none>
#查看日志后,发现80端口被占用
[root@k8s-master ~]# kubectl logs pods/huazi web2

在这里插入图片描述

  • 从侧面可以反应出:pod是一个系统pod中的容器是一个应用程序一个系统一个应用程序只能有一个
[root@k8s-master ~]# kubectl delete -f testpod1.yml
pod "huazi" deleted

[root@k8s-master ~]# kubectl get pods
No resources found in default namespace.

示例3

#在一个名为huazi的pod中,运行两个容器,一个是nginx,一个是buysboxplus
[root@k8s-master ~]# vim testpod1.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi   #pod的标签
  name: huazi   #pod的名字
spec:
  containers:
    - image: nginx  #pod中第一个容器镜像
      name: web1     #容器名
    - image: busyboxplus  #pod中第二个容器镜像
      name: test     #容器名
      command: ["/bin/sh","-c","sleep 10000"]


[root@k8s-master ~]# kubectl apply -f testpod1.yml
pod/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   2/2     Running   0          10s   10.244.2.22   k8s-node2.org   <none>           <none>
  • 进入test容器中,test容器是一个busyboxplus镜像
[root@k8s-master ~]# kubectl exec pods/huazi -c test -it -- /bin/sh
/ # curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  • 这里我们发现,test是一个busyboxplus容器,但是为什么可以访问到nginx容器呢?原因就是:busyboxplusnginx在一个pod中,共用同一个资源。也从侧面可以反应出:pod是一个系统
[root@k8s-master ~]# kubectl delete -f testpod1.yml

示例4

#在一个名为huazi的pod中,运行两个容器,一个是nginx,一个是buysboxplus
[root@k8s-master ~]# vim testpod1.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi   #pod的标签
  name: huazi   #pod的名字
spec:
  containers:
    - image: nginx  #pod中第一个容器镜像
      name: web1     #容器名
    - image: busyboxplus  #pod中第二个容器镜像
      name: test     #容器名
      command: ["/bin/sh","-c","sleep 10000"]


[root@k8s-master ~]# kubectl apply -f testpod1.yml
pod/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   2/2     Running   0          10s   10.244.2.22   k8s-node2.org   <none>           <none>

我们在node2节点上手动删除一个容器

[root@k8s-node2 ~]# docker ps
CONTAINER ID   IMAGE                            COMMAND                   CREATED              STATUS              PORTS     NAMES
7763a4447357   busyboxplus                      "/bin/sh -c 'sleep 1…"   About a minute ago   Up About a minute             k8s_test_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0
3f5c3411c80a   nginx                            "/docker-entrypoint.…"   About a minute ago   Up About a minute             k8s_web1_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0


#当我们删除后,它会自动重新建立一个
[root@k8s-node2 ~]# docker rm -f k8s_test_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0


k8s_test_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0
[root@k8s-node2 ~]# docker ps
CONTAINER ID   IMAGE                            COMMAND                   CREATED         STATUS         PORTS     NAMES
6b9af5119ad4   busyboxplus                      "/bin/sh -c 'sleep 1…"   5 seconds ago   Up 4 seconds             k8s_test_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_1
3f5c3411c80a   nginx                            "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes             k8s_web1_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0

但是master上不会发现node2上的容器重新建立过

[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE    IP            NODE            NOMINATED NODE   READINESS GATES
huazi   2/2     Running   2          4m5s   10.244.2.24   k8s-node2.org   <none>           <none>

2.利用控制器管理pod(推荐)

高可用性和可靠性:

  • 自动故障恢复:如果一个pod失败或被删除控制器自动创建新的pod来维持期望的副本数量确保应用始终处于可用状态,减少因单个pod故障导致的服务中断。(这里所说的副本就是pod
  • 健康检查和自愈:可以配置控制器pod进行健康检查(如存活探针就绪探针)。如果pod不健康,控制器会采取适当的行动,如重启pod删除重新创建它,以保证应用的正常运行

可扩展性:

  • 轻松扩缩容:可以通过简单的命令配置更改来增加减少pod数量,以满足不同的工作负载需求。例如,在高流量期间可以快速扩展以处理更多请求,在低流量期间可以缩容节省资源
  • 水平自动扩缩容HPA):可以基于自定义指标(如CPU利用率内存使用情况或应用特定的指标)自动调整pod的数量,实现动态的资源分配成本优化

版本管理和更新:

  • 滚动更新:对于Deployment控制器,可以执行滚动更新来逐步替换旧版本pod新版本,确保应用在更新过程中始终保持可用。可以控制更新的速率和策略,以减少对用户的影响。
  • 回滚:如果更新出现问题,可以轻松回滚上一个稳定版本,保证应用的稳定性可靠性

声明式配置:

  • 简洁的配置方式:使用yamljson格式的声明式配置文件来定义应用的部署需求。这种方式使得配置易于理解、维护和版本控制,同时也方便团队协作。
  • 期望状态管理:只需要定义应用的期望状态(如副本数量、容器镜像等),控制器自动调整实际状态期望状态保持一致。无需手动管理每个pod创建和删除,提高了管理效率

服务发现和负载均衡:

  • 自动注册和发现:Kubernetes中的服务(Service)可以自动发现控制器管理的pod,并将流量路由到它们。这使得应用的服务发现负载均衡变得简单和可靠,无需手动配置负载均衡器。
  • 流量分发:可以根据不同的策略(如轮询、随机等)将请求分发不同pod,提高应用的性能和可用性。

多环境一致性:

  • 一致的部署方式:在不同的环境(如开发、测试、生产)中,可以使用相同的控制器配置部署应用,确保应用在不同环境中的行为一致。这有助于减少部署差异和错误,提高开发和运维效率
#建立控制器并在控制器中自动运行一个pod
[root@k8s-master ~]# kubectl create deployment huazi --image nginx
deployment.apps/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi-79f7fdf69-4wksw   1/1     Running   0          22s   10.244.1.13   k8s-node1.org   <none>           <none>


#为huazi控制器扩容:扩容到3个pod
[root@k8s-master ~]# kubectl scale deployment huazi --replicas 3
deployment.apps/huazi scaled

[root@k8s-master ~]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE    IP            NODE            NOMINATED NODE   READINESS GATES
huazi-79f7fdf69-4wksw   1/1     Running   0          3m4s   10.244.1.13   k8s-node1.org   <none>           <none>
huazi-79f7fdf69-9qtg9   1/1     Running   0          23s    10.244.1.14   k8s-node1.org   <none>           <none>
huazi-79f7fdf69-mkfnq   1/1     Running   0          23s    10.244.2.19   k8s-node2.org   <none>           <none>


#为huazi控制器缩容:缩容到2个pod
[root@k8s-master ~]# kubectl scale deployment huazi --replicas 2
deployment.apps/huazi scaled


[root@k8s-master ~]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES
huazi-79f7fdf69-4wksw   1/1     Running   0          4m58s   10.244.1.13   k8s-node1.org   <none>           <none>
huazi-79f7fdf69-mkfnq   1/1     Running   0          2m17s   10.244.2.19   k8s-node2.org   <none>           <none>

应用版本的更新

#利用控制器建立pod,控制器里面运行2个pod
[root@k8s-master ~]# kubectl create deployment huazi --image myapp:v1 --replicas 2
deployment.apps/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi-646d7864fd-5qbzk   1/1     Running   0          16s   10.244.2.25   k8s-node2.org   <none>           <none>
huazi-646d7864fd-vn7dt   1/1     Running   0          16s   10.244.1.15   k8s-node1.org   <none>           <none>
  • 端口暴露
[root@k8s-master ~]# kubectl expose deployment huazi --port 8080 --target-port 80
service/huazi exposed


[root@k8s-master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
huazi        ClusterIP   10.97.207.164   <none>        8080/TCP   29s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    4d6h
  • 访问服务
[root@k8s-master ~]# curl 10.97.207.164:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
  • 查看历史版本
[root@k8s-master ~]# kubectl rollout history deployment huazi
deployment.apps/huazi
REVISION  CHANGE-CAUSE
1         <none>
  • 更新控制器镜像版本
[root@k8s-master ~]# kubectl set image deployments/huazi myapp=myapp:v2
deployment.apps/huazi image updated


#查看历史版本
[root@k8s-master ~]# kubectl rollout history deployment huazi
deployment.apps/huazi
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
  • 访问内容测试
[root@k8s-master ~]# curl 10.97.207.164:8080
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
  • 版本回滚
[root@k8s-master ~]# kubectl rollout undo deployment huazi --to-revision 1
deployment.apps/huazi rolled back


[root@k8s-master ~]# curl 10.97.207.164:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>


[root@k8s-master ~]# kubectl rollout history deployment huazi
deployment.apps/huazi
REVISION  CHANGE-CAUSE
2         <none>
3         <none>

3.利用yaml文件部署应用

优点

声明式配置:

  • 清晰表达期望状态:以声明式的方式描述应用的部署要求,包括pod数量容器配置网络设置等。这使得配置易于理解和维护,并且可以方便地查看应用的预期状态
  • 可重复性版本控制配置文件可以被版本控制,确保在不同环境中的部署一致性。可以轻松回滚以前的版本或在不同环境重复使用相同的配置
  • 团队协作:便于团队成员之间共享和协作,大家可以对配置文件进行审查和修改,提高部署可靠性稳定性。

灵活性和可扩展性

  • 丰富配置选项:可以通过yaml文件详细地配置各种Kubernetes资源,如DeploymentServiceConfigMapSecret等。可以根据应用地特定需求进行高度定制化
  • 组合和扩展:可以将多个资源地配置组合在一个或多个yaml文件中,实现复杂地应用部署框架。同时,可以轻松地添加新的资源修改现有资源以满足不断变化的需求。

与工具集成

  • CI/CD流程集成:可以将yaml配置文件持续集成和持续部署(CI/CD)工具集成,实现自动化应用部署。例如,可以在代码提交后自动触发部署流程,使用配置文件来部署应用到不同的环境
  • 命令行工具支持:Kubernetes命令行工具kubectlyaml配置文件有很好的支持,可以方便地应用、更新、和删除配置。同时,还可以使用其他工具来验证和分析yaml配置文件,确保其正确性和安全性

3.1yaml配置文件参数

参数名称类型参数说明
apiVersionstring这里是指的是k8s api版本,目前基本上是v1,可以用kubectl api-version命令查询
kindstring这里指的是yaml文件定义的资源类型和角色,比如:Pod
metadataobject元数据对象固定值,就写metadata就行,冒号后没有值
metadata.namestring元数据对象名字自定义,比如Pod的名字
metadata.namespacestring元数据对象命名空间自定义
specobject详细定义对象固定值,就写spec就行,冒号后没有值
spec.containers[]list这里是spec对象容器列表定义,是个列表冒号后没有值
spec.containers[].imagestring镜像名称
spec.containers[].namestring容器名称
spec.containers[].command[]list指定容器运行时启动的命令,若未指定则运行容器打包时指定的命令
spec.containers[].imagePullPolicystring定义镜像拉取策略Always每次都尝试重新拉取镜像ifNotPresent:如果本地有镜像就使用本地镜像Never仅使用本地镜像
spec.containers[].args[]list指定容器运行参数,可以指定多个
spec.containers[].workingDirstring指定容器工作目录
spec.containers[].volumeMounts[]list指定容器内部存储卷配置
spec.containers[].volumeMounts[].namestring指定可以被容器挂载的存储卷名称
spec.containers[].volumeMounts[].mountPathstring可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnlystring设置存储卷路径读写模式true或false,默认为读写模式
spec.containers[].ports[]list指定容器需要用到的端口列表

3.2如何获取资源帮助

[root@k8s-master ~]# kubectl explain pod.spec.containers

yaml文件编写示例

1.运行简单的单个容器pod

  • 用命令获取yaml模板
[root@k8s-master ~]# kubectl run huazi --image myapp:v1 --dry-run=client -o yaml > pod.yml


[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi  #pod标签
  name: huazi   #pod名称
spec:
  containers:
  - image: myapp:v1   #pod镜像
    name: huazi    #容器名称
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   1/1     Running   0          6s    10.244.1.18   k8s-node1.org   <none>           <none>

2.运行多个容器pod

注意:如果多个容器运行在一个pod中,资源共享的同时在使用相同资源时也会干扰比如端口

  • 一个端口干扰示例:
#在一个pod中运行2个nginx
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi   #pod的标签
  name: huazi   #pod的名字
spec:
  containers:
    - image: nginx   #pod的第一个镜像
      name: web1   #容器名
    - image: nginx  #pod中的第二个镜像
      name: web2   #容器名
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created

#我们发现一个pod中运行2个nginx,只能运行一个
[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS             RESTARTS      AGE     IP            NODE            NOMINATED NODE   READINESS GATES
huazi   1/2     CrashLoopBackOff   5 (19s ago)   3m17s   10.244.2.21   k8s-node2.org   <none>           <none>
#查看日志后,发现80端口被占用
[root@k8s-master ~]# kubectl logs pods/huazi web2

在这里插入图片描述

  • 从侧面可以反应出:pod是一个系统pod中的容器是一个应用程序一个系统一个应用程序只能有`一个

在一个pod中开启多个容器时一定要确保容器彼此不能相互干扰

[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi
  name: huazi
spec:
  containers:
  - image: nginx
    name: web1
  - image: busybox
    name: busybox
    command: ["/bin/sh","-c","sleep 10000"]


[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   2/2     Running   0          10s   10.244.1.19   k8s-node1.org   <none>           <none>

3.理解pod间的网络整合

同一个pod中的容器公用一个网络

[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi
  name: huazi
spec:
  containers:
  - image: nginx
    name: web1
  - image: busyboxplus
    name: busyboxplus
    command: ["/bin/sh","-c","sleep 10000"]


[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   2/2     Running   0          57s   10.244.2.28   k8s-node2.org   <none>           <none>

[root@k8s-master ~]# kubectl exec -it huazi -c busyboxplus -- /bin/sh
/ # curl 10.244.2.28
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  • 这里我们发现,busyboxplus是一个busyboxplus容器,但是为什么可以访问到nginx容器呢?原因就是:busyboxplusnginx在一个pod中,共用同一个资源。也从侧面可以反应出:pod是一个系统

4.端口映射

[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi
  name: huazi
spec:
  containers:
    - image: myapp:v1
      name: myapp1
      ports:
        - name: http
          containerPort: 80  #容器中的服务端口
          hostPort: 8080   #宿主机的端口
          protocol: TCP


[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   1/1     Running   0          12s   10.244.1.20   k8s-node1.org   <none>           <none>


[root@k8s-master ~]# curl k8s-node1.org:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

5.如何设定环境变量

[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi
  name: huazi
spec:
  containers:
    - image: busybox
      name: busybox
      command: ["/bin/sh","-c","echo $NAME;sleep 10000"]
      env:
        - name: NAME  #NAME为变量名
          value: "hello world"  #变量值



[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created


[root@k8s-master ~]# kubectl logs pods/huazi busybox
hello world

6.资源限制

资源限制会影响podQos Class资源优先级,资源优先级分为Guaranteed > Burstable > BestEffort

  • Qos服务质量
资源设定优先级类型
资源限定为设定BestEffort
资源限定设定且最大和最小不一致Burstable
资源限定设定且最大和最小一致Guaranteed
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi
  name: huazi
spec:
  containers:
    - image: myapp:v1
      name: myapp
      resources:
        limits:       #pod使用资源的最高限制
          cpu: 500m
          memory: 100M
        requests:     #pod期望使用的资源,不能大于limits
          cpu: 500m
          memory: 100M


[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   1/1     Running   0          8s    10.244.1.21   k8s-node1.org   <none>           <none>


[root@k8s-master ~]# kubectl describe pods huazi
......
......
......
    Limits:
      cpu:     500m
      memory:  100M
    Requests:
      cpu:        500m
      memory:     100M
......
......
......

7.容器启动管理

[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi
  name: huazi
spec:
  restartPolicy: Always  #pod的重启策略
  containers:
    - image: myapp:v1
      name: myapp

[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created


[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   1/1     Running   0          8s    10.244.2.30   k8s-node2.org   <none>           <none>
[root@k8s-node2 ~]# docker ps
CONTAINER ID   IMAGE                            COMMAND                   CREATED          STATUS          PORTS     NAMES
d484c3dc3278   d4a5e0eaa84f                     "nginx -g 'daemon of…"   40 seconds ago   Up 39 seconds             k8s_myapp_huazi_default_3382f3a9-c6b0-4875-a58e-53afe799ab3d_0


[root@k8s-node2 ~]# docker rm -f k8s_myapp_huazi_default_3382f3a9-c6b0-4875-a58e-53af
k8s_myapp_huazi_default_3382f3a9-c6b0-4875-a58e-53afe799ab3d_0

#删了之后,又会重新起一个pod
[root@k8s-node2 ~]# docker ps
CONTAINER ID   IMAGE                            COMMAND                   CREATED              STATUS              PORTS     NAMES
c155437452b9   d4a5e0eaa84f                     "nginx -g 'daemon of…"   4 seconds ago        Up 3 seconds                  k8s_myapp_huazi_default_3382f3a9-c6b0-4875-a58e-53afe799ab3d_1

8.选择运行节点

[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi
  name: huazi
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1.org  #node1
  restartPolicy: Always
  containers:
    - image: myapp:v1
      name: myapp


[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created


#我们发现在node1上运行了
[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   1/1     Running   0          13s   10.244.1.22   k8s-node1.org   <none>           <none>

9.共享宿主机网络

[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi
  name: huazi
spec:
  hostNetwork: true
  containers:
    - image: busybox
      name: busybox
      command: ["/bin/sh","-c","sleep 10000"]


[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created


#我们可以发现eth0
[root@k8s-master ~]# kubectl exec -it pods/huazi -c busybox -- /bin/sh
/ # ifconfig
cni0      Link encap:Ethernet  HWaddr 22:C0:49:80:83:77
          inet addr:10.244.1.1  Bcast:10.244.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c0:49ff:fe80:8377/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:409 errors:0 dropped:0 overruns:0 frame:0
          TX packets:230 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:29496 (28.8 KiB)  TX bytes:21069 (20.5 KiB)

docker0   Link encap:Ethernet  HWaddr 02:42:A8:49:89:52
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:DB:48:D7
          inet addr:172.25.254.10  Bcast:172.25.254.255  Mask:255.255.255.0
          inet6 addr: fe80::7baa:9520:639b:5e48/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:811130 errors:0 dropped:0 overruns:0 frame:0
          TX packets:429677 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:806703703 (769.3 MiB)  TX bytes:47436488 (45.2 MiB)

flannel.1 Link encap:Ethernet  HWaddr 86:D8:BA:15:B9:0F
          inet addr:10.244.1.0  Bcast:0.0.0.0  Mask:255.255.255.255
          inet6 addr: fe80::84d8:baff:fe15:b90f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:87 errors:0 dropped:0 overruns:0 frame:0
          TX packets:63 errors:0 dropped:81 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6371 (6.2 KiB)  TX bytes:6801 (6.6 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:3441 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3441 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:291963 (285.1 KiB)  TX bytes:291963 (285.1 KiB)

pod的生命周期

init容器

在这里插入图片描述

  • pod可以包含多个容器应用运行在这些容器里面,同时pod也可以有一个或多个先于应用容器启动的init容器
  • init容器与普通的容器非常像,除了如下两点:
    • 它们总是运行到完成
    • init容器不支持Readiness,因为它们必须在pod就绪之前运行完成,一个init容器必须运行成功下一个init才能运行
  • 如果podinit容器失败,Kubernetes不断重启该pod,直到init容器成功为止。但是,如果pod对应地restartPolicy值为Never,它不会重新启动

init容器的功能

  • init容器可以包含一些安装过程应用容器不存在实用工具个性化代码
  • init容器可以安全地运行这些工具,避免这些工具导致应用镜像地安全性降低
  • 应用镜像创建者部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像
  • init容器能以不同于Pod应用容器文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问
  • 由于 Init容器必须在应用容器启动之前运行完成,因此 Init容器提供了一种机制阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有应用容器并行启动

init容器示例

[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: huazi
  name: huazi
spec:
  containers:
    - image: myapp:v1
      name: myapp
  initContainers:
    - image: busybox
      name: init-myservice
      command: ["sh","-c","until test -e /testfile;do echo wating for myservice;sleep 2;done"]


[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS     RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
huazi   0/1     Init:0/1   0          15s   10.244.2.31   k8s-node2.org   <none>           <none>


[root@k8s-master ~]# kubectl logs pods/huazi init-myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice


#当创建完文件后,运行成功
[root@k8s-master ~]# kubectl exec pods/huazi -c init-myservice -- /bin/sh -c "touch /testfile"


[root@k8s-master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES
huazi   1/1     Running   0          2m24s   10.244.2.31   k8s-node2.org   <none>           <none>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现std::sort,replace,fill,accumulate,equal等函数

std::sort /// <summary>/// std::sort 是从小到大排列的/// </summary>/// <typeparam name"IteratorClass"></typeparam>/// <typeparam name"ComparingFunctions"></typeparam>/// <param name"itBegin&qu…

PAT甲级-1150 Travelling Salesman Problem

题目 题目大意 旅行商问题是NP-hard问题&#xff0c;即没有多项式时间内的解法&#xff0c;但是可以验证答案是否正确。给定一个无向图&#xff0c;判断简单环&#xff0c;复杂环和非环。对应“TS simple cycle”、“TS cycle”、“Not a TS cycle”。还要求出环的最小路径权值…

力扣11-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…

DAY28||39.组合总数 |40.组合总和Ⅱ |131.分割回文串

39.组合总数 题目&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以…

Java基本数据类型转换

一、自动类型转换 1.基本介绍 当Java程序在进行赋值或者运算时&#xff0c;精度小的类型自动转换为精度大的数据类型&#xff0c;这个就是自动类型转换数据类型按精度&#xff08;容量&#xff09;大小进行排序为&#xff1a; ![在这里插入图片描述](https://i-blog.csdnimg.…

数据中心物理安全的历史和演变

在当今的数字时代&#xff0c;数据中心托管已成为我们互联世界的支柱。这些设施在存储、管理和处理我们日常生活所需的大量信息方面发挥着至关重要的作用。从社交媒体平台和电子商务网站到流媒体服务和云计算&#xff0c;数据中心为我们依赖的数字服务提供支持。 随着企业越来…

K8s-资源管理

一、资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;所谓的部署服务&#xff0c;其实就是在kubernetes集群中…

【图文并茂】【软件无线电】如何用收音机接收图片,如何将图片编码到不同频点上,捕获在频谱上跳动的MIKU

如何将图片编码到不同频点上&#xff0c;捕获在频谱上跳动的MIKU 这篇文章和数字信号处理有关,或者说跟SDR软件无线电有关,只是考虑这样一个问题,如何将一张图片,编码放到不同的频点上,使得接收方能够通过SDR模块,捕获这样的信号,然后通过绘制频谱,来得到我们编码的那张图片。 …

LVS-DR+Keepalived 高可用群集部署

LVS-DRKeepalived 高可用群集部署 Keepalived 的工作原理LVSKeepalived 高可用群集部署配置负载调度器&#xff08;主、备相同&#xff09;关闭防火墙和核心防护及准备IPVS模块配置keeplived&#xff08;主、备DR 服务器上都要设置&#xff09;启动 ipvsadm 服务调整 proc 响应…

快速区分 GPT-3.5 与 GPT-4

问&#xff1a;鲁迅为什么暴打周树人&#xff1f; GPT3.5回答 各种稀奇古怪的理由 GPT4回答 正确区分鲁迅和周树人是同一个人 国内GPT入口 https://ai-to.cn/url/?ulihaimao

电商商品数据采集||高并发||多语言请求实例演示|京东|淘宝商品详情数据SKU价格

以京东商品数据采集为例 京东商品详情接口数据采集是指通过调用京东提供的商品详情API接口&#xff0c;获取商品的详细信息。以下是一个简单的步骤来实现这个功能&#xff1a; 1. 注册京东开发者账号 首先&#xff0c;你需要注册一个京东开发者账号&#xff0c;并创建一个应…

【原创】Android Studio 中安装大模型辅助编码插件:通义灵码

在 Android Studio 中内置了 Ginimi 预览版&#xff0c;但需要“加速器”才可使用。 在国内有平替的软件同样可以使用&#xff0c;比如 阿里的通义灵码&#xff0c;智谱的CodeGeeX等&#xff0c;从功能和使用上来说都是大同小异。 这里我们以通义灵码为例来讲解其安装和使用 通…

CSS彩虹按钮设计demo

demo css: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>彩虹</title><style>*{margi…

Umi中的微前端

umi/max 内置了 Qiankun 微前端插件&#xff0c;它可以一键启用 Qiankun 微前端开发模式&#xff0c;帮助您轻松地在 Umi 项目中集成 Qiankun 微应用&#xff0c;构建出一个生产可用的微前端架构系统。 什么是微前端 微前端是一种多个团队通过独立发布功能的方式来共同构建现代…

三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解

Spring Boot集成Spring Security之securityFilterChain过滤器链详解 一、默认过滤器1、默认配置系统启动日志2、默认配置的过滤器及顺序如下3、本文只介绍和登录相关的过滤器 二、SecurityContextPersistenceFilter1、实现功能2、处理请求类型3、是否会终止过滤器链4、实现步骤…

JZ2440开发板——异常与中断

以下内容源于韦东山课程的学习与整理&#xff0c;如有侵权请告知删除。 一、中断概念的引入与处理流程 1.1 中断概念的引入 这里有一个很形象的场景比喻&#xff1a;假设一位母亲在大厅里看书&#xff0c;婴儿在房间里睡觉&#xff0c;这位母亲怎样才能知道这个孩子睡醒了&a…

前端的全栈混合之路Meteor篇:容器化开发环境下的meteor工程架构解析

本文主要介绍容器化meteor工程的目录架构解析&#xff0c;之前的文章中浅浅提到过一些&#xff1a;前端的全栈混合之路Meteor篇&#xff1a;开发环境的搭建 -全局安装或使用docker镜像-CSDN博客https://blog.csdn.net/m0_38015699/article/details/142730928?spm1001.2014.300…

【LeetCode HOT 100】详细题解之回溯篇

【LeetCode HOT 100】详细题解之回溯篇 回溯法的理论基础回溯法解决的问题理解回溯法回溯法模板 46 全排列思路代码 78 子集思路代码 17 电话号码的字母组合思路代码 39 组合总和思路代码 22 括号生成思路代码 79 单词搜索思路代码 131 分割回文串思路代码 51 N皇后思路代码 回…

教程:宏基因组数据分析教程

Orchestrating Microbiome Analysis Orchestrating Microbiome Analysis是一套包含宏基因组各种数据分析的教程&#xff0c;非常安利大家学习。 16S-analysis 16S-analysis是一本用于扩增子16s等微生物数据分析的教程&#xff0c;很适合新手入门学习。 Introduction to micro…

Android targetSdkVersion 升级为34 问题处理

原因是发布到GooglePlay遭到拒绝&#xff0c;需要最低API level为34。之前为31&#xff0c;感觉还挺高的&#xff0c;但是GooglePlay需要的更高。 记录下处理问题&#xff1a; 1.升级gradle版本为8.0.2 之前是&#xff1a; classpath com.android.tools.build:gradle:7.1.0-…