https://jimmysong.io/kubernetes-handbook/concepts/pod-overview.html
1. Pod操作
1.0 pod资源定义
yaml
# 必选,api版本号
apiVersion: v1
# 必选,类型为pod
kind: pod
# 必选,定义元数据
metadata:
# 必选,pod名称
name: string
# pod所属的命名空间,默认在default的namespace
namespace: string
# 自定义标签
lables:
# 自定义标签名字
- name: string
# 自定义注释列表
annotations:
- name: string
# pod中容器的详细定义(期望)
spec:
# 通过nodeName调度到node1节点
nodeName: node1
# nodeSelector节点选择器
nodeSelector:
# 指定调度到标签为bussiness=game的节点
bussiness: game
# 必选,pod中容器列表
containers:
# 必选,容器名称
- name: string
# 必选,容器的镜像名称
image: string
# 获取镜像的策略,Alawys表示下载镜像,IfNotPresent表示优先使用本地镜像,否则下载镜像,Never表示仅使用本地镜像
imagePullPolicy: [Always | Never | IfNotPresent]
# 容器的启动命令列表,如不指定,使用打包时使用的启动命令
command: [string]
# 容器的启动命令参数列表
args: [string]
# 容器的工作目录
workingDir: string
# 挂载到容器内部的存储卷位置
volumeMounts:
# 引用pod定义的共享存储卷的名称,需用volumes[]部分定义的卷名
- name: string
# 存储卷在容器内mount的绝对路径,应少于512字符
mountPath: string
# 是否为只读模式
readOnly: boolean
# 需要暴露的端口号列表
Ports:
# 端口号名称
- name: string
# 容器需要监听的端口号
containerPort: int
# 容器所在宿主机需要监听的端口号,默认与Container相同
hostPort: int
# 端口协议,支持TCP和UDP,默认TCP
protocol: string
# 容器运行前需设置的环境变量列表
env:
# 环境变量名称
- name: string
# 环境变量的值
value: string
# 资源限制和请求的设置
resources:
# 资源限制的设置
limits:
# cpu的限制,单位为core数,将用于docker run --cpu-shares参数
cpu: string
# 内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
memory: string
# 资源请求的限制
requests:
# cpu请求,容器启动的初始可用数量
cpu: string
# 内存请求,容器启动的初始可用数量
memory: string
# 对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
livenessProbe:
# 对Pod容器内检查方式设置为exec方式
exec:
# exec方式需要制定的命令或脚本
command:
- cat
- /tmp/healthy
# 对Pod内个容器健康检查方法设置为HttpGet,需要制定path、port
httpGet:
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
# 对Pod内个容器健康检查方式设置为tcpSocket方式
tcpSocket:
port: number
# 容器启动完成后首次探测的时间,单位为秒,pod启动延迟5秒后探测
initialDelaySeconds: 0
# 对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
timeoutSeconds: 0
# 对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
periodSeconds: 0
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
# Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Never表示不再重启该Pod
restartPolicy: [Always | Never | OnFailure]
# 设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
nodeSelector: obeject
# pull镜像时使用的secret名称,以key:secretkey格式指定
imagePullSecrets:
- name: string
# 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
hostNetwork: false
# 在该pod上定义共享存储卷列表
volumes:
# 共享存储卷名称 (volumes类型有很多种)
- name: string
# 类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录,为空值
emptyDir: {}
# 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
hostPath: string
# Pod所在宿主机的目录,将被用于同期中mount的目录
path: string
# 类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
secret:
scretname: string
items:
- key: string
path: string
# 类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
configMap:
name: string
items:
- key: string
path: string
# 必选,api版本号
apiVersion: v1
# 必选,类型为pod
kind: pod
# 必选,定义元数据
metadata:
# 必选,pod名称
name: string
# pod所属的命名空间,默认在default的namespace
namespace: string
# 自定义标签
lables:
# 自定义标签名字
- name: string
# 自定义注释列表
annotations:
- name: string
# pod中容器的详细定义(期望)
spec:
# 通过nodeName调度到node1节点
nodeName: node1
# nodeSelector节点选择器
nodeSelector:
# 指定调度到标签为bussiness=game的节点
bussiness: game
# 必选,pod中容器列表
containers:
# 必选,容器名称
- name: string
# 必选,容器的镜像名称
image: string
# 获取镜像的策略,Alawys表示下载镜像,IfNotPresent表示优先使用本地镜像,否则下载镜像,Never表示仅使用本地镜像
imagePullPolicy: [Always | Never | IfNotPresent]
# 容器的启动命令列表,如不指定,使用打包时使用的启动命令
command: [string]
# 容器的启动命令参数列表
args: [string]
# 容器的工作目录
workingDir: string
# 挂载到容器内部的存储卷位置
volumeMounts:
# 引用pod定义的共享存储卷的名称,需用volumes[]部分定义的卷名
- name: string
# 存储卷在容器内mount的绝对路径,应少于512字符
mountPath: string
# 是否为只读模式
readOnly: boolean
# 需要暴露的端口号列表
Ports:
# 端口号名称
- name: string
# 容器需要监听的端口号
containerPort: int
# 容器所在宿主机需要监听的端口号,默认与Container相同
hostPort: int
# 端口协议,支持TCP和UDP,默认TCP
protocol: string
# 容器运行前需设置的环境变量列表
env:
# 环境变量名称
- name: string
# 环境变量的值
value: string
# 资源限制和请求的设置
resources:
# 资源限制的设置
limits:
# cpu的限制,单位为core数,将用于docker run --cpu-shares参数
cpu: string
# 内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
memory: string
# 资源请求的限制
requests:
# cpu请求,容器启动的初始可用数量
cpu: string
# 内存请求,容器启动的初始可用数量
memory: string
# 对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
livenessProbe:
# 对Pod容器内检查方式设置为exec方式
exec:
# exec方式需要制定的命令或脚本
command:
- cat
- /tmp/healthy
# 对Pod内个容器健康检查方法设置为HttpGet,需要制定path、port
httpGet:
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
# 对Pod内个容器健康检查方式设置为tcpSocket方式
tcpSocket:
port: number
# 容器启动完成后首次探测的时间,单位为秒,pod启动延迟5秒后探测
initialDelaySeconds: 0
# 对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
timeoutSeconds: 0
# 对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
periodSeconds: 0
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
# Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Never表示不再重启该Pod
restartPolicy: [Always | Never | OnFailure]
# 设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
nodeSelector: obeject
# pull镜像时使用的secret名称,以key:secretkey格式指定
imagePullSecrets:
- name: string
# 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
hostNetwork: false
# 在该pod上定义共享存储卷列表
volumes:
# 共享存储卷名称 (volumes类型有很多种)
- name: string
# 类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录,为空值
emptyDir: {}
# 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
hostPath: string
# Pod所在宿主机的目录,将被用于同期中mount的目录
path: string
# 类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
secret:
scretname: string
items:
- key: string
path: string
# 类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
configMap:
name: string
items:
- key: string
path: string
1.1 查看
- 查看帮助文档
bash
kubectl explain namespace
kubectl explain service.kind
kubectl explain service.metadata
kubectl explain pod.spec.containers
kubectl explain namespace
kubectl explain service.kind
kubectl explain service.metadata
kubectl explain pod.spec.containers
1. 查看pod运行节点
-o wide ,可以查看ip和运行节点
shell
[root@kube-master ~]# kubectl get pod -n kube-system -o wide |grep master
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
calico-node-hbkgs 1/1 Running 1 (35m ago) 3h48m 10.103.236.201 k8s-master01 <none> <none>
etcd-k8s-master01 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
kube-apiserver-k8s-master01 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
kube-controller-manager-k8s-master01 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
kube-proxy-8z6lf 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
kube-scheduler-k8s-master01 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
[root@kube-master ~]# kubectl get pod -n kube-system -o wide |grep master
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
calico-node-hbkgs 1/1 Running 1 (35m ago) 3h48m 10.103.236.201 k8s-master01 <none> <none>
etcd-k8s-master01 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
kube-apiserver-k8s-master01 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
kube-controller-manager-k8s-master01 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
kube-proxy-8z6lf 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
kube-scheduler-k8s-master01 1/1 Running 1 (35m ago) 5h34m 10.103.236.201 k8s-master01 <none> <none>
2. 查看pod详细信息
shell
#pod以宿主机的ip网段启动的原因,在clico中配置了, hostNetwork: true
[root@kube-master ~]# kubectl get pod calico-typha-67c6dc57d6-5627c -oyaml -n kube-system
#pod以宿主机的ip网段启动的原因,在clico中配置了, hostNetwork: true
[root@kube-master ~]# kubectl get pod calico-typha-67c6dc57d6-5627c -oyaml -n kube-system
bash
kubectl get pods -o wide -n kube-public
# 查看标签
kubectl get node -n kube-public --show-labels
# 查看详细信息
kubectl describe pod 查看容器名
# 以yaml形式查看
kubectl get pod 查看容器名 -o yaml
# 查看容器日志
kubectl logs -f 容器名
# 查看哪些pod在使用此标签
kubectl get pod -l app=my-nginx2 -n kube-public
kubectl get endpoints --show-labels
kubectl get pods -o wide -n kube-public
# 查看标签
kubectl get node -n kube-public --show-labels
# 查看详细信息
kubectl describe pod 查看容器名
# 以yaml形式查看
kubectl get pod 查看容器名 -o yaml
# 查看容器日志
kubectl logs -f 容器名
# 查看哪些pod在使用此标签
kubectl get pod -l app=my-nginx2 -n kube-public
kubectl get endpoints --show-labels
1.2 交互Pod
shell
[root@kube-master ~]# kubectl exec -it pod_name -- /bin/bash
root@nginx-6799fc88d8-49dd6:/#
[root@kube-master ~]# kubectl exec -it pod_name -- /bin/bash
root@nginx-6799fc88d8-49dd6:/#
1.3 查看Pod阶段
shell
kubectl describe pod <pod_name>
kubectl describe pod <pod_name>
1.4 删除pod
bash
kubectl delete pod pod-name
kubectl delete pod pod-name
1.5 修改pod
bash
kubectl edit pod 查看容器名
kubectl edit pod 查看容器名
2. Deployment操作
2.1 创建
shell
[root@kube-master ~]# kubectl create deployment deployapp --image=nginx --replicas=3
deployment.apps/deployapp created
[root@kube-master ~]# kubectl create deployment deployapp --image=nginx --replicas=3
deployment.apps/deployapp created
2.2 查看
shell
[root@kube-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deployapp-7749464894-grrds 1/1 Running 0 3m1s
deployapp-7749464894-jb2xx 1/1 Running 0 3m1s
deployapp-7749464894-nhq4w 1/1 Running 0 3m1s
#查看pod的ip
[root@kube-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployapp-7749464894-grrds 1/1 Running 0 3m8s 172.17.74.70 kube-node03 <none> <none>
deployapp-7749464894-jb2xx 1/1 Running 0 3m8s 172.30.0.137 kube-node01 <none> <none>
deployapp-7749464894-nhq4w 1/1 Running 0 3m8s 172.23.127.68 kube-node02 <none> <none>
[root@kube-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deployapp-7749464894-grrds 1/1 Running 0 3m1s
deployapp-7749464894-jb2xx 1/1 Running 0 3m1s
deployapp-7749464894-nhq4w 1/1 Running 0 3m1s
#查看pod的ip
[root@kube-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployapp-7749464894-grrds 1/1 Running 0 3m8s 172.17.74.70 kube-node03 <none> <none>
deployapp-7749464894-jb2xx 1/1 Running 0 3m8s 172.30.0.137 kube-node01 <none> <none>
deployapp-7749464894-nhq4w 1/1 Running 0 3m8s 172.23.127.68 kube-node02 <none> <none>
2.3 扩展Pod副本
shell
#扩展,从3到5
kubectl scale deployment deployapp --replicas=5
#查看
[root@kube-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deployapp-7749464894-dkp72 1/1 Running 0 87s
deployapp-7749464894-grrds 1/1 Running 0 6m22s
deployapp-7749464894-jb2xx 1/1 Running 0 6m22s
deployapp-7749464894-nhq4w 1/1 Running 0 6m22s
deployapp-7749464894-wdbw9 1/1 Running 0 87s
#扩展,从3到5
kubectl scale deployment deployapp --replicas=5
#查看
[root@kube-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deployapp-7749464894-dkp72 1/1 Running 0 87s
deployapp-7749464894-grrds 1/1 Running 0 6m22s
deployapp-7749464894-jb2xx 1/1 Running 0 6m22s
deployapp-7749464894-nhq4w 1/1 Running 0 6m22s
deployapp-7749464894-wdbw9 1/1 Running 0 87s
2.4 缩减Pod副本
shell
kubectl scale deployment deployapp --replicas=3
kubectl scale deployment deployapp --replicas=3
2.5 发布应用
通过Service将应用发布出来,而后集群中的应用就可以通过ServiceIP或域名来访问该复制均衡
shell
--port: 集群内访问service的端口
--target-port: pod容器提供的端口
kubectl expose deployment deployapp --port=8888 --target-port=80
#查看service
[root@kube-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
deployapp ClusterIP 192.168.132.134 <none> 8888/TCP 111s
kubernetes ClusterIP 192.168.0.1 <none> 443/TCP 29h
nginx NodePort 192.168.253.94 <none> 8080:32498/TCP 6h51m
--port: 集群内访问service的端口
--target-port: pod容器提供的端口
kubectl expose deployment deployapp --port=8888 --target-port=80
#查看service
[root@kube-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
deployapp ClusterIP 192.168.132.134 <none> 8888/TCP 111s
kubernetes ClusterIP 192.168.0.1 <none> 443/TCP 29h
nginx NodePort 192.168.253.94 <none> 8080:32498/TCP 6h51m
2.6 创建流程
1.kubectl发送部署请求到API Server
2.API Server通知Controller Manager创建一个deployment资源
3.Scheduler执行调度任务,将三个副本Pod分别发到node节点
4.node节点上的kubectl在各自的节点上创建并运行Pod
5.API Server通知ControllerManger,调用ServiceController创建一个Service资源
6.kube-proxy Watch到Service资源创建,而后在本地节点创建对应负载均衡规则
7.CoreDNS Watch到Service资源创建,为其创建DNS解析记录,可以在内部通过dns进行访问
注解,
1.应用的配置和当前状态信息保存在etcd中,执行kubectl get pod时API Server会从etcd中读取这些数据
2.网络插件calico会为每个Pod都分配IP,可以实现跨节点通信,而无需NAT地址转换
3. Pod Logs
3.1 崩溃前日志
- 单容器
shell
kubectl logs pod-name --previous
kubectl logs pod-name --previous
- 多容器
shell
kubectl logs pod-name --previous -c container-name
kubectl logs pod-name --previous -c container-name
4. 优雅关闭Pod
yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15
ports:
- containerPort: 80
lifecycle:
preStop:
exec:
command: [
# Gracefully shutdown nginx
"sleep 5 && /usr/sbin/nginx -s quit",
]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15
ports:
- containerPort: 80
lifecycle:
preStop:
exec:
command: [
# Gracefully shutdown nginx
"sleep 5 && /usr/sbin/nginx -s quit",
]
5. Pod查看pid
bash
kubectl describe pod <podName> -n <namespace>
或者是登录对应节点 通过如下命令查询
#节点是dockerd运行时
1. docker ps | grep <podName>
2. docker inspect <容器id> | grep -i pid
3. 或者使用这个命令:docker inspect <容器id> --format '{{.State.Pid}}'
#节点是containerd运行时
1. crictl pods | grep <pod名>,取第1列为pod_id
2. crictl ps | grep <pod_id>,取第1列为容器id
3. crictl inspect <容器id> | grep -i pid ,取第1行为容器pid
kubectl describe pod <podName> -n <namespace>
或者是登录对应节点 通过如下命令查询
#节点是dockerd运行时
1. docker ps | grep <podName>
2. docker inspect <容器id> | grep -i pid
3. 或者使用这个命令:docker inspect <容器id> --format '{{.State.Pid}}'
#节点是containerd运行时
1. crictl pods | grep <pod名>,取第1列为pod_id
2. crictl ps | grep <pod_id>,取第1列为容器id
3. crictl inspect <容器id> | grep -i pid ,取第1行为容器pid