🏷️个人主页牵着猫散步的鼠鼠 

🏷️系列专栏Kubernetes渐进式学习-专栏

🏷️个人学习笔记,若有缺误,欢迎评论区指正 

1.前言

我们在前面的文章讲解了Kubernetes的核心概念和服务部署,接下来我们进入实战篇,从Pod入手学习K8S的使用

2.删除前置文章创建的服务

我们在之前文章测试集群是否可以正常服务时,创建了一个Nginx服务作为测试demo,为了防止该服务影响我们后续的学习,我们可以执行如下命令删除。

查询deploy

 kubectl get deploy

 

删除Nginx deploy

kubectl delete deploy nginx

在 Kubernetes 中,Deployment 和 Service 是两个独立的资源,它们分别负责不同的功能。我们这里还只是删除了负责管理 Pod 的控制器,但是 Service 以及通过 Service 暴露的应用程序仍然存在。我们继续删除对应的Service

kubectl delete service nginx

3 Pod资源是什么

在 Kubernetes(K8S)中,Pod 是可以创建和管理的最小部署单元。一个 Pod 代表了集群中运行的一个进程。Pod 通常包含一个或多个容器,这些容器共享网络命名空间、IP 地址和端口空间,能够像在同一个物理机上一样进行通信。Pod 中的容器还可以共享存储卷,使得容器间可以访问相同的数据。

4.Pod配置文件详解 

4.1. 配置资源清单

当我们需要创建一个Pod时,K8S需要知道如何构建一个Pod,这个Pod中有哪些容器等信息,这些信息都需要通过配置文件来传递,所以我们首先来学习Pod配置文件的编写

配置文件详解文档可以见官网配置最佳实践 | Kubernetes

我总结了一些常用的配置资源清单:

参数名类型字段说明
apiVersionStringK8S APl 的版本,可以用 kubectl api versions 命令查询
kindStringyam 文件定义的资源类型和角色
metadataObject元数据对象,下面是它的属性
metadata.nameString元数据对象的名字,比如 pod 的名字
metadata.namespaceString元数据对象的命名空间
SpecObject详细定义对象
spec.containers[]list定义 Spec 对象的容器列表
spec.containers[].nameString为列表中的某个容器定义名称
spec.containers[].imageString为列表中的某个容器定义需要的镜像名称
spec.containers[].imagePullPolicystring定义镜像拉取策略,有 Always、Never、IfNotPresent 三个值可选 - Always(默认):意思是每次都尝试重新拉取镜像 - Never:表示仅适用本地镜像 - IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。
spec.containers[].command[]list指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。
spec.containers[].args[]list指定容器启动命令参数,因为是数组可以指定多个。
spec.containers[].workingDirstring指定容器的工作目录
spec.containers[].volumeMounts[]list指定容器内部的存储卷配置
spec.containers[].volumeMounts[].namestring指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPathstring指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnlystring设置存储卷路径的读写模式,ture 或者 false,默认是读写模式
spec.containers[].ports[]list指定容器需要用到的端口列表
spec.containers[].ports[].namestring指定端口的名称
spec.containers[].ports[].containerPortstring指定容器需要监听的端口号
spec.containers[].ports[].hostPortstring指定容器所在主机需要监听的端口号,默认跟上面 containerPort 相同,注意设置了 hostPort 同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers[].ports[].protocolstring指定端口协议,支持 TCP 和 UDP,默认值为 TCP
spec.containers[].env[]list指定容器运行前需设置的环境变量列表
spec.containers[].env[].namestring指定环境变量名称
spec.containers[].env[].valuestring指定环境变量值
spec.containers[].resourcesObject指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers[].resources.limitsObject指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpustring指定 CPU 的限制,单位为 Core 数,将用于 docker run –cpu-shares 参数
spec.containers[].resources.limits.memorystring指定 mem 内存的限制,单位为 MIB、GiB
spec.containers[].resources.requestsObject指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpustringCPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memorystring内存请求,单位为MIB、GiB,容器启动的初始化可用数量
spec.restartPolicystring定义 pod 的重启策略,可选值为 Always、OnFailure、Never,默认值为 Always。 - Always:pod 一旦终止运行,则无论容器是如何终止的,kubelet 服务都将重启它。 - OnFailure:只有 pod 以非零退出码终止时,kubelet 才会重启该容器。如果容器正常结束(退出码为0),则 kubectl 将不会重启它。 - Never:Pod 终止后,kubelet 将退出码报告给 master,不会重启该 pod
spec.nodeSelectorObject定义 Node 的 label 过滤标签,以 key:value 格式指定
spec.imagePullSecretsObject定义 pull 镜像时使用 secret 名称,以 name:secretkey 格式指定
spec.hostNetworkBoolean定义是否使用主机网络模式,默认值为 false。设置 true 表示使用宿主机网络,不使用 docker 网桥,同时设置了 true将无法在同一台宿主机上启动第二个副本

4.2. 编写Nginx pod配置文件

我们这里就为Nginx写一个简单的配置文件并创建pod

创建Pod配置目录,并创建nginx-demo.yaml文件

mkdir /k8s/pods -p
cd /k8s/pods
vim nginx-demo.yml

 在nginx-demo.yaml文件中编写如下内容

apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-demo # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    env: # 环境变量
    - name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    resources:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
4.2.1 配置文件详解 

指定使用的Kubernetes API版本,这里使用的是v1版本。 

apiVersion: v1 # api 文档版本

指定要创建的资源对象的类型是Pod,也可以配置为像Deployment、StatefulSet这一类的对象 

kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象

 元数据部分,指定该Pod的名称为nginx-demo。

metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-demo # Pod 的名称  

为Pod设置了两个标签(label),分别是type=app和test=1.0.0。标签可用于后续对Pod实施其他操作时进行过滤和选择。

  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号

 指定该Pod将在default命名空间中创建。如果不设置这个配置,会默认在default命名空间中创建

  namespace: 'default' # 命名空间的配置

 spec部分描述了期望Pod实际运行的具体情况。他描述了对象的期望状态,即我们希望对象在集群中的行为和状态。

我们这里定义了在该Pod中只有一个容器,名称为nginx,使用的镜像是nginx:1.7.9。

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像

imagePullPolicy设置镜像拉取策略为IfNotPresent,意味着如果本地有nginx:1.7.9镜像就使用本地的,没有则从远程拉取。

imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的

command容器的启动命令,启动nginx时增加-g 'daemon off;'参数。

    command: # 指定容器启动时执行的命令
    - nginx 
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'

 workingDir设置容器的工作目录为/usr/share/nginx/html。

    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录  

ports中可以声明端口信息和环境变量,这里我们声明容器要暴露的端口为80,使用TCP协议,端口名称为http。

    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的

为容器设置一个名为JVM_OPTS的环境变量,值为-Xms128m -Xmx128m。

    - env: # 环境变量
      name: JVM_OPTS # 环境变量名称  
      value: '-Xms128m -Xmx128m' # 环境变量的值

 resources配置项可以设置容器的资源请求(requests)和限制(limits)。requests定义了最少需要分配多少资源给容器,limits定义了容器能使用的资源上限。

    resources:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆

restartPolicy可以设置容器的重启策略,这里我们设置为失败策略,只有失败的情况才会重启

  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

4.3. 指定配置文件启动pod 

kubectl create -f nginx-demo.yaml

 

查看我们创建的pod资源

kubectl get pod 

可以看到我们的nginx pod资源就创建了,状态为容器创建中,需要等待一段时间 

 

 

5.总结

在本文中,我们探讨了 Kubernetes(K8S)中Pod的概念,并从 Pod 入手,学习如何在 K8S 集群中部署和管理服务。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐