一、前置准备¶
本文主要介绍一下最小可部署计算单元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¶
- 轻量级:Pod 是 Kubernetes 集群中最小的可部署单元,可以轻松地部署、调度和管理。它们可以根据需要创建、销毁或重启,而无需影响集群中的其他部分。
- 资源共享:Pod 中的容器共享相同的网络和存储资源。这使得它们可以相互通信并访问共享的文件系统。例如,多个容器可以共享同一份配置文件,而不必在每个容器中复制。
- 网络隔离:Pod 提供了一个虚拟网络环境,可以为容器提供独立的 IP 地址和网络命名空间。这使得容器可以相互隔离,并且可以防止容器之间的网络干扰。
- 服务发现:Pod 可以被标记和注释,以便 Kubernetes 可以根据标签和注释选择它们。这使得容器可以轻松地与其他容器通信,并允许 Kubernetes 自动发现和管理服务之间的关系。
- 水平扩展:通过使用 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 立即执行清理操作。
注意事项:马上删除时不等待确认正在运行的资源已被终止。这些资源可能会无限期地继续在集群上运行。