Kubernetes(k8s)的Pod资源清单spec.containers属性详细讲解

1. 概述

通过命令kubectl explain pod.spec.containers查询,将重要结果整理如下:

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

2. Pod的基本配置

新建pod-containers.yaml,内容如下:

[root@k8s-master ~]# cat pod-containers.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-containers
  namespace: dev
  labels:
    user: bulut
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
[root@k8s-master ~]# 

3. 镜像拉取策略

imagePullPolicy:用于设置镜像拉取的策略,有三种拉取策略:

  • Always:总是从远程仓库拉取镜像到本地
  • IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像到本地
  • Never:只使用本地镜像,本地没有就报错

默认值说明:

  • 如果镜像tag为latest,默认策略是Always
  • 如果镜像tag为具体的版本号,默认策略是IfNotPresent

新建pod-containers.yaml,内容如下:

[root@k8s-master ~]# cat pod-containers.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-containers
  namespace: dev
  labels:
    user: bulut
spec:
  containers:
    - name: nginx-container 
      image: nginx:latest
      imagePullPolicy: Always
[root@k8s-master ~]# 

4. 启动命令

busybox不是一个程序,是一个工具类的集合。其容器启动后,由于没有前台的程序一直运行,会自动关闭。所以需要我们通过command参数传递命令让它一直运行

新建pod-containers.yaml,内容如下。然后进行pod创建

[root@k8s-master ~]# cat pod-containers.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-containers
  namespace: dev
  labels:
    user: bulut
spec:
  containers:
    - name: busybox-container
      image: busybox
      command: ["/bin/sh", "-c", "while true;do echo $(date +%T) >> /tmp/time.txt;sleep 10;done;"]
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl apply -f pod-containers.yaml 
pod/pod-containers created
[root@k8s-master ~]#

进入pod中的容器,查看结果

[root@k8s-master ~]# kubectl exec pod-containers -c busybox-container -it -n dev -- /bin/sh 
/ # cat /tmp/time.txt 
15:19:16
15:19:26
15:19:36
/ # 

Kubernetes中的command和args两个参数覆盖Dockerfile中的ENTRYPOINT说明:

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

5. 环境变量

新建pod-containers.yaml,内容如下。然后进行pod创建

[root@k8s-master ~]# cat pod-containers.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-containers
  namespace: dev
  labels:
    user: bulut
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
      env:
        - name: myKey
          value: myValue
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl apply -f pod-containers.yaml 
pod/pod-containers created
[root@k8s-master ~]#

进入pod中的容器,查看结果

[root@k8s-master ~]# kubectl exec pod-containers -c nginx-container -it -n dev -- /bin/sh 
# echo $myKey
myValue
#

6. 端口设置

通过kubectl explain pod.spec.containers.ports命令查看ports的子属性,整理如下:

ports: 
  - name: <string>             # 端口名称,如果指定,必须保证name在pod中是唯一的
    containerPort: <integer>   # 容器要监听的端口(0 < 端口范围 < 65536)
    hostPort: <integer>        # 容器要在主机上绑定的端口,如果设置,主机上只能运行容器的一个副本(一般省略)
    hostIP: <string>           # 要将外部端口绑定到的主机IP(一般省略)
    protocol: <string>         # 端口协议。必须是UDP、TCP或SCTP。默认为“TCP”

新建pod-containers.yaml,内容如下。然后进行pod创建

[root@k8s-master ~]# cat pod-containers.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-containers
  namespace: dev
  labels:
    user: bulut
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
      ports:
      - name: nginx-port
        containerPort: 80
        protocol: TCP
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl apply -f pod-containers.yaml 
pod/pod-containers created
[root@k8s-master ~]#

访问nginx服务

[root@k8s-master ~]# kubectl get pod -n dev -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod-containers   1/1     Running   0          70s   10.244.169.147   k8s-node2   <none>           <none>
[root@k8s-master ~]# 
[root@k8s-master ~]# curl 10.244.169.147:80
<!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>
[root@k8s-master ~]#

7. 资源配额

容器中的程序运行会占用一定的资源,比如CPU和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量的资源,导致其他的容器无法运行

kubernetes提供了对内存和CPU的资源进行配额的机制,这种机制主要通过resources属性实现,它有两个子属性:

  • limits:用于限制容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启
  • requests:用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动

其中cpu指定的是core数,可以为整数或小数。memory指定的是内存大小,可以使用Gi、Mi、G、M等格式

新建pod-containers.yaml,内容如下:

[root@k8s-master ~]# cat pod-containers.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-containers
  namespace: dev
  labels:
    user: bulut
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
      resources:
        limits:
          cpu: "2"
          memory: "10Gi"
        requests:
          cpu: "1"
          memory: "10Mi"
[root@k8s-master ~]# 
### 构建任务失败解决方案 当遇到 `Execution failed for task ':app:shrinkReleaseRes'` 错误时,这通常意味着资源压缩过程中出现了问题。此错误可能由多种原因引起,包括但不限于配置不正确、依赖冲突或特定于项目的其他因素。 #### 可能的原因分析 1. **ProGuard 或 R8 配置不当** ProGuard 和 R8 是用于优化和混淆代码以及减少 APK 大小的工具。如果这些工具的配置存在问题,可能会导致资源无法正常处理[^1]。 2. **重复资源** 如果项目中有多个模块定义了相同的资源名称,可能导致冲突并引发该错误。检查是否存在重名的 drawable、string 等资源文件[^2]。 3. **第三方库兼容性** 某些第三方库可能与当前使用的 Gradle 插件版本或其他库存在兼容性问题,从而影响到资源打包过程中的行为[^3]。 4. **Gradle 缓存问题** 有时旧缓存数据会干扰新编译的结果,尝试清理本地仓库和重新同步项目可以帮助排除此类潜在障碍[^4]。 #### 推荐的操作方法 为了有效解决问题,建议按照以下步骤逐一排查: ```bash # 清理项目构建目录 ./gradlew clean # 删除 .gradle 文件夹下的所有内容以清除缓存 rm -rf ~/.gradle/caches/ ``` 调整 `build.gradle` 中的相关设置也是一个重要环节: ```groovy android { ... buildTypes { release { minifyEnabled true // 是否启用代码缩减 shrinkResources true // 是否开启资源压缩 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 尝试禁用 shrinkResources 来测试是否为资源压缩引起的错误 // shrinkResources false } } } ``` 此外,在 `proguard-rules.pro` 文件内添加必要的保留规则,防止关键类被意外移除: ```text -keep class com.example.yourpackage.** { *; } # 替换为你自己的包路径 -dontwarn androidx.**,com.google.** # 忽略警告信息 ``` 最后,确保所使用的 Android Studio 版本是最新的稳定版,并且已经应用了所有的补丁更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值