首页 > 其他分享 >3-2、pod containers

3-2、pod containers

时间:2022-11-14 23:57:50浏览次数:33  
标签:容器 name nginx command pod containers

pod containers

# kubectl explain pod.spec.containers
KIND:     Pod
VERSION:  v1
RESOURCE: containers <[]Object>   # 数组,代表可以有多个容器
FIELDS:
   name  <string>     # 容器名称
   image <string>     # 容器需要的镜像地址
   imagePullPolicy  <string> # 镜像拉取策略 
   command  <[]string> # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
   args     <[]string> # 容器的启动命令需要的参数列表
   env      <[]Object> # 容器环境变量的配置
   ports    <[]Object>     # 容器需要暴露的端口号列表
   resources <Object>      # 资源限制和资源请求的设置


2 基本配置name、image
创建 pod-base.yaml 文件
apiVersion: v1
kind: Pod
metadata:
  name: pod-base
  namespace: default  # 命名空间
  labels:
    user: nginx-test
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    imagePullPolicy: Never # 用于设置镜像拉取策略

  - name: busybox
    image: busybox:1.30

# kubectl apply -f pod-base.yaml
pod/pod-base created

# 查看 pod
# READY 1/2 : 表示当前 Pod 中有2个容器,其中 1 个准备就绪,1 个未就绪
# RESTARTS  : 重启次数,因为有 1 个容器故障了,Pod 一直在重启试图恢复它

imagePullPolicy:用于设置镜像拉取策略,k8s 支持配置三种拉取策略

Always:总是从远程仓库拉取镜像
ifNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像
Never:只使用本地镜像,从不去远程仓库拉取,本地没有就报错
默认值说明:

如果镜像 tag 为具体版本号,默认策略是:ifNotPresent
如果镜像 tag 为:latest,默认策略是 Always,因为不知道本地的是不是最新的镜像


3 启动命令command
apiVersion: v1
kind: Pod
metadata:
  name: pod-base
  namespace: default  # 命名空间
  labels:
    user: nginx-test
spec:
  containers:
  - name: nginx
    image: nginx:1.14
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done;"]  # command 命令
command,用于在 pod 中的容器初始化完毕之后运行一个命令

"/bin/sh","-c", 使用sh执行命令
touch /tmp/hello.txt; 创建一个/tmp/hello.txt 文件
while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done; 每隔3秒向文件中写入当前时间,在容器里面

除了 command 参数外,还有一个 args 参数

通过上面发现 command 已经可以完成启动命令和传递参数的功能,为什么这里还要提供一个 args 选项,用于传递参数呢?这其实跟 docker 有点关系,kubernetes 中的 command、args 两项其实是实现覆盖 Dockerfile 中 ENTRYPOINT 的功能。

如果 command 和 args 均没有写,那么用 Dockerfile 的配置。
如果 command 写了,但 args 没有写,那么 Dockerfile 默认的配置会被忽略,执行输入的 command
如果 command 没写,但 args 写了,那么 Dockerfile 中配置的 ENTRYPOINT 的命令会被执行,使用当前 args 的参数
如果 command 和 args 都写了,那么 Dockerfile 的配置被忽略,执行 command 并追加上 args 参数

4 环境变量env
env,环境变量,用于给 pod 中的容器设置环境变量
apiVersion: v1
kind: Pod
metadata:
  name: pod-env
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","while true;do /bin/echo $(date +%T);sleep 60; done;"]
    env: # 设置环境变量列表,设置了两个 username=admin 和 password=123456
    - name: "username"
      value: "admin"
    - name: "password"
      value: "123456"
登录容器后,可查看:
echo $username
或env |grep username

5 端口设置ports
# kubectl explain pod.spec.containers.ports
KIND:     Pod
VERSION:  v1
RESOURCE: ports <[]Object>
FIELDS:
   name         <string>  # 端口名称,如果指定,必须保证name在pod中是唯一的        
   containerPort<integer> # 容器要监听的端口(0<x<65536),一个 pod 里有多个容器
   hostPort     <integer> # 容器要在主机上公开的端口,也就是 worker 的机器,如果设置,主机上只能运行容器的一个副本(一般省略) 
   hostIP       <string>  # 要将外部端口绑定到的主机 IP,也就是 worker 的机器(一般省略)
   protocol     <string>  # 端口协议。必须是UDP、TCP或SCTP。默认为“TCP”。

port测试案例,创建 pod-ports.yaml:
apiVersion: v1
kind: Pod
metadata:
  name: pod-base
  namespace: default
  labels:
    user: nginx-test
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    ports: # 设置容器暴露的端口列表
    - name: nginx-port
      containerPort: 80
      protocol: TCP
但这样外网还是访问不了的,如果外网要访问,就要用service 了


7 资源配额 resources
也就是Pod在进行调度的时候,可以对调度的资源进行限制,例如限制Pod调度时使用的资源是2C4G,那么在调度对应的node节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度。
容器中的程序要运行,肯定是要占用一定资源的,比如 cpu 和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量资源,导致其它容器无法运行。针对这种情况,kubernetes 提供了对内存和 cpu 的资源进行配额的机制,这种机制主要通过 resources 选项实现,他有两个子选项:

limits:用于限制运行时容器的最大占用资源,当容器占用资源超过 limits 时会被终止,并进行重启
requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动
可以通过上面两个选项设置资源的上下限。

resources测试案例,创建 pod-resources.yaml:
apiVersion: v1
kind: Pod
metadata:
  name: pod-resources
  namespace: zouzou
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    resources: # 资源配额
      limits:  # 限制资源(上限)
        cpu: "2" # CPU限制,单位是core数
        memory: "10Gi" # 内存限制
      requests: # 请求资源(下限)
        cpu: "1"  # CPU限制,单位是core数
        memory: "10Mi"  # 内存限制
在这对 cpu 和 memory 的单位做一个说明:

cpu:core 数,可以为整数或小数,如0.1,100m
memory: 内存大小,可以使用 Gi、Mi、G、M 等形式

 

标签:容器,name,nginx,command,pod,containers
From: https://www.cnblogs.com/skyzy/p/16890990.html

相关文章

  • 3-3、Pod控制住-pod yml配置解释
    podyml配置参数解释apiVersion:v1#必选,版本号,例如v1kind:Pod#必选,Podmetadata:#必选,元数据name:string#必选,Pod名称,命名需要规范n......
  • 3-5、Pod控制器-Daemonset
    DaemonSetDaemonSet确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSe......
  • 3-4、Pod控制器-ReplicaSet
    Pod控制器:ReplicationController(简称RC,已经淘汰)ReplicaSetDeploymentDaemonSetJobCronjobStatefulSet自主式POD:deletepod后不会被重新拉起的,不是由pod控制器控......
  • 3-5、Pod控制器-StatefulSet
    StatefulSet有状态的集合,管理所有有状态的服务,比如MySQL、MongoDB集群等。StatefulSet:是一种给Pod提供唯一标志的控制器,它可以保证部署和扩展的顺序。Pod一致性:包含......
  • 1-4 pod生命周期
    1pod生命周期pod的创建过程用户通过kubectl或其他api客户端提交podspec给apiserverapiserver尝试着将pod对象的相关信息存入etcd中,待写入操作执行完成,apiserver即......
  • Pod详解之Pod生命周期
    Pod生命周期我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:-pod创建过程-运行初始化容器(initcontainer)过程-运行主容器(mainc......
  • 第五章 k8s Pod水平自动缩放
    官网​​https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/​​原理基本原理:HPA通过监控分析控制器控制的所有Pod的负载变化情况来确......
  • k8s之Pod详解(一)
    Pod介绍Pod结构每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:-用户程序所在的容器,数量可多可少-Pause容器,这是每个Pod都会有的一个根容器,它的作用有......
  • 第二章 Pod驱逐策略、更新策略、服务回滚
    Pod驱逐策略节点压力驱逐是由各kubelet进程主动终止pod,以回收节点上的内存、磁盘空间等资源的过程,kubelet监控当前node节点的CPU、内存、磁盘空间和文件系统的inde等资源,当......
  • 【docker】Java应用 容器内存管理 -XX:+UseContainerSupport
    早期时候,容器内运行Java应用程序时,Jvm无法感知容器环境存在,所以对容器资源的限制比如内存或者cpu等都无法生效。原因是容器的资源管理使用了操作系统cgroup机制,但是Jvm无法......