一、前置准备

本文主要介绍一下最小可部署计算单元Pod。

下面使用k代替kubectl配置如下:

$ alias k=kubectl
$ complete -o default -F __start_kubectl k

若想永久生效,将其添加到 ~/.bashrc 文件中:

$ echo "alias k=kubectl" >> ~/.bashrc
$ echo "complete -o default -F __start_kubectl k" >> ~/.bashrc

二、什么是Pod

在 Kubernetes 中,Pod 代表的是集群上处于运行状态的一组 容器 的集合。

三、为什么要引入Pod

  1. 轻量级:Pod 是 Kubernetes 集群中最小的可部署单元,可以轻松地部署、调度和管理。它们可以根据需要创建、销毁或重启,而无需影响集群中的其他部分。
  2. 资源共享:Pod 中的容器共享相同的网络和存储资源。这使得它们可以相互通信并访问共享的文件系统。例如,多个容器可以共享同一份配置文件,而不必在每个容器中复制。
  3. 网络隔离:Pod 提供了一个虚拟网络环境,可以为容器提供独立的 IP 地址和网络命名空间。这使得容器可以相互隔离,并且可以防止容器之间的网络干扰。
  4. 服务发现:Pod 可以被标记和注释,以便 Kubernetes 可以根据标签和注释选择它们。这使得容器可以轻松地与其他容器通信,并允许 Kubernetes 自动发现和管理服务之间的关系。
  5. 水平扩展:通过使用 Pod 副本集,可以轻松地创建多个相同配置的 Pod,并在需要时自动扩展它们。这使得应用程序可以根据负载自动调整其资源使用率,并提高可扩展性和可用性。

四、如何定义和创建Pod

方法一:使用yaml文件进行创建-推荐

1.编写yml文件

$ vim nginx.yml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    ports:
    - containerPort: 80

上面yaml文件解析如下:

  • API版本号
apiVersion: v1
  • 类型
kind: Pod
  • 元数据及Pod名称
metadata:
  name: nginx
  • 定义 Pod 的详细信息
spec:
  containers: #容器列表
  - name: nginx  #必选,符合RFC1035规范的容器名称
    image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 #容器所用的镜像的地址
    ports:
    - containerPort: 80 #容器端口号

拓展:

(1)查看API版本号

$ k api-resources | grep pod
pods                              po           v1                                     true         Pod
podtemplates                                   v1                                     true         PodTemplate
horizontalpodautoscalers          hpa          autoscaling/v2                         true         HorizontalPodAutoscaler
pods                                           metrics.k8s.io/v1beta1                 true         PodMetrics
poddisruptionbudgets              pdb          policy/v1                              true         PodDisruptionBudget
podsecuritypolicies               psp          policy/v1beta1                         false        PodSecurityPolicy

(2)查看 Pod 对象的详细信息和字段定义

$ k explain pod

2.创建Pod

$ kubectl create -f nginx.yaml

注意:上面命令执行时必须保证在nginx.yaml文件所在目录里执行!!!

3.查看 Pod 状态

#简单查看
$ kubectl get -f nginx.yml
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          81s

#详细查看
$ kubectl get -f nginx.yml -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          9m14s   172.17.125.4   k8s-node01   <none>           <none>

方法二:使用命令进行直接创建

1.直接通过命令创建

$ k run nginx --image=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2

2.查看 Pod 状态

#简单查看
$ k get po nginx
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          94s

#详细查看
$ k get po nginx -owide
NAME    READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          2m22s   172.25.244.196   k8s-master01   <none>           <none>

五、如何修改启动命令和删除Pod

1.修改已运行的Pod

(1)编写新的yml文件

$ vim nginx01.yml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    ports:
    - containerPort: 80
    command: ["sleep","10"]

上面yaml文件解析如下:

  • API版本号
apiVersion: v1
  • 类型
kind: Pod
  • 元数据及Pod名称
metadata:
  name: nginx
  • 定义 Pod 的详细信息
spec:
  containers: #容器列表
  - name: nginx  #必选,符合RFC1035规范的容器名称
    image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 #容器所用的镜像的地址
    ports:
    - containerPort: 80 #容器端口号
  • 睡眠10s
command: ["sleep","10"]

(2)更新Pod

$ k delete -f nginx.yml ; k create -f nginx01.yml

(3)查看 Pod 状态

$ k get po nginx
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          10s

2.删除Pod

(1)普通删除Pod

#方法一
$ k delete -f nginx.yml

#方法二
$ k delete po nginx

(2)强制删除Pod

$ k delete po nginx --grace-period=0 --force

默认情况下,所有的删除操作都会附有 30 秒钟的宽限期限。 kubectl delete 命令支持 --grace-period=<seconds> 选项,允许你重载默认值, 设定自己希望的期限值。

将宽限期限强制设置为 0 意味着立即从 API 服务器删除 Pod。 如果 Pod 仍然运行于某节点上,强制删除操作会触发 kubelet 立即执行清理操作。

注意事项:马上删除时不等待确认正在运行的资源已被终止。这些资源可能会无限期地继续在集群上运行。