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
我总结了一些常用的配置资源清单:
参数名 | 类型 | 字段说明 |
apiVersion | String | K8S APl 的版本,可以用 kubectl api versions 命令查询 |
kind | String | yam 文件定义的资源类型和角色 |
metadata | Object | 元数据对象,下面是它的属性 |
metadata.name | String | 元数据对象的名字,比如 pod 的名字 |
metadata.namespace | String | 元数据对象的命名空间 |
Spec | Object | 详细定义对象 |
spec.containers[] | list | 定义 Spec 对象的容器列表 |
spec.containers[].name | String | 为列表中的某个容器定义名称 |
spec.containers[].image | String | 为列表中的某个容器定义需要的镜像名称 |
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' # 命名空间的配置
我们这里定义了在该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 # 描述该端口是基于哪种协议通信的
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 集群中部署和管理服务。