pod 是什么
运行中的一组容器,Pod是kubernetes中应用的最小单位.
1.0 pod
1.1创建pod
root@master kubernets]# kubectl run nginx --image=nginx
pod/nginx created
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 2m9s
1.2删除pod
[root@master kubernets]# kubectl delete pod nginx
pod "nginx" deleted
1.3使用命令行创建pod
[root@master kubernets]# cat mynginx.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
# namespace: default 指定命名空间
spec:
containers:
- image: nginx
name: mynginx
[root@master kubernets]# kubectl apply -f mynginx.yaml #使用json文件创建
pod/mynginx created
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx 1/1 Running 0 2m12s
==删除pod==
[root@master kubernets]# kubectl delete -f mynginx.yaml
pod "mynginx" deleted
==同一个pod部署多个容器==
[root@master kubernets]# cat myapp.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: myapp
name: myapp
spec:
containers:
- image: nginx
name: nginx
- image: tomcat:8.5.68
name: tomcat
[root@master kubernets]# kubectl apply -f myapp.yaml
pod/myapp created
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 2/2 Running 0 23s
==查看容器内部ip==
[root@master kubernets]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp 2/2 Running 0 101s 192.168.104.6 node2 <none> <none>
==查看pod创建详细信息==
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 2/2 Running 0 2m33s
[root@master kubernets]# kubectl describe pod myapp
Name: myapp
Namespace: default
Priority: 0
Node: node2/192.168.100.128
Start Time: Wed, 27 Apr 2022 16:06:00 +0800
Labels: run=myapp
Annotations: cni.projectcalico.org/containerID: ebb80fd81a197d6a304710c78bf133b93c1f4acb1d1d55786a3ba3613cd12cf5
cni.projectcalico.org/podIP: 192.168.104.6/32
cni.projectcalico.org/podIPs: 192.168.104.6/32
Status: Running
IP: 192.168.104.6
IPs:
IP: 192.168.104.6
Containers:
nginx:
Container ID: docker://c4ca41d2a94dc641c27f9f064a831e95bfbdf92d121ba4aae6c6bc4c745ea26f
Image: nginx
Image ID: docker-pullable://nginx@sha256:859ab6768a6f26a79bc42b231664111317d095a4f04e4b6fe79ce37b3d199097
Port: <none>
Host Port: <none>
State: Running
Started: Wed, 27 Apr 2022 16:06:21 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-g4kn9 (ro)
tomcat:
Container ID: docker://feb9e8a9dc3eeb28a53a9e4fd880adfb86ce8d67e7771f2ef24683a8dd92ab39
Image: tomcat:8.5.68
Image ID: docker-pullable://tomcat@sha256:a266dd222864de2fe72e0464e6d91c406a687c861bb72a07218e6d7c89fe1d3e
Port: <none>
Host Port: <none>
State: Running
Started: Wed, 27 Apr 2022 16:06:22 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-g4kn9 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-g4kn9:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-g4kn9
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m33s default-scheduler Successfully assigned default/myapp to node2
Normal Pulling 3m32s kubelet Pulling image "nginx"
Normal Pulled 3m12s kubelet Successfully pulled image "nginx" in 19.909840362s
Normal Created 3m12s kubelet Created container nginx
Normal Started 3m12s kubelet Started container nginx
Normal Pulled 3m11s kubelet Container image "tomcat:8.5.68" already present on machine
Normal Created 3m11s kubelet Created container tomcat
Normal Started 3m11s kubelet Started container tomcat
命令小结
==查看pod==
kubectl get pod
# 加-A 查看所有命名空间pod
==查看pod创建详细信息==
kubectl describe pod myapp
#默认查看default命名空间pod 如果需要查看其他命名空间加-n
==创建pod==
kubectl apply -f myapp.yaml
==删除pod==
kubectl delete -f myapp.yaml
==查看pod内部ip==
kubectl get pod -owide
#不同命名空间需要加-n指定
==查看pod日志==
ubectl logs myapp nginx --tail 50 -f
#不同命名空间需要-n指定
2.0 Deployment
控制Pod,使Pod拥有多副本,自愈,扩缩容等能力
2.1自愈能力
先使用命令创建一个
[root@master kubernets]# kubectl create deployment mytomcat --image=tomcat:8.5.68
deployment.apps/mytomcat created
==create 创建一个 deployment==
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mytomcat-6f5f895f4f-p2mgl 1/1 Running 0 48s
==当我们删除它==
==他会将原来的pod删除,又会重新拉起一台这就是他的自愈能力==
[root@master kubernets]# kubectl delete pod mytomcat-6f5f895f4f-p2mgl
pod "mytomcat-6f5f895f4f-p2mgl" deleted
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mytomcat-6f5f895f4f-9drhd 1/1 Running 0 7s
==删除==
[root@master kubernets]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
mytomcat 1/1 1 1 5m41s
[root@master kubernets]# kubectl delete deploy mytomcat
deployment.apps "mytomcat" deleted
2.2多副本
命令行创建
[root@master kubernets]# kubectl create deployment my-dep --image=nginx --replicas=3
deployment.apps/my-dep created
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-5b7868d854-25lcq 1/1 Running 0 64s
my-dep-5b7868d854-8v8mq 1/1 Running 0 64s
my-dep-5b7868d854-vb55x 1/1 Running 0 64s
==查看 deployment==
[root@master kubernets]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
my-dep 3/3 3 3 2m20s
==再去查看pod发现已经在删除==
root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-5b7868d854-25lcq 0/1 Terminating 0 3m47s
my-dep-5b7868d854-8v8mq 0/1 Terminating 0 3m47s
my-dep-5b7868d854-vb55x 0/1 Terminating 0 3m47s
使用yaml创建
[root@master kubernets]# cat myapp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-dep
name: my-dep
spec:
replicas: 3
selector:
matchLabels:
app: my-dep
template:
metadata:
labels:
app: my-dep
spec:
containers:
- image: nginx
name: nginx
[root@master kubernets]# kubectl apply -f myapp.yaml
deployment.apps/my-dep created
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-5b7868d854-kcmpm 1/1 Running 0 2m
my-dep-5b7868d854-mlwgf 1/1 Running 0 2m
my-dep-5b7868d854-pwbdn 1/1 Running 0 2m
2.2.1 扩缩容
[root@master kubernets]# kubectl scale --replicas=5 deployment/my-dep
deployment.apps/my-dep scaled
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-5b7868d854-kcmpm 1/1 Running 0 4m31s
my-dep-5b7868d854-l8wgq 0/1 ContainerCreating 0 6s
my-dep-5b7868d854-mlwgf 1/1 Running 0 4m31s
my-dep-5b7868d854-pwbdn 1/1 Running 0 4m31s
my-dep-5b7868d854-xrwgw 0/1 ContainerCreating 0 6s
[root@master kubernets]# kubectl scale --replicas=3 deployment/my-dep
deployment.apps/my-dep scaled
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-5b7868d854-kcmpm 1/1 Running 0 17m
my-dep-5b7868d854-mlwgf 1/1 Running 0 17m
my-dep-5b7868d854-pwbdn 1/1 Running 0 17m
命令小结
kubectl scale --replicas=3 deployment/my-dep
==可直接修改--replicas=数量 进行扩缩容==
kubectl edit deployment my-dep
==也可以进入他的xml编辑replicas后面的数量进行修改==
==修改 replicas==
2.3 滚动更新
[root@master kubernets]# kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
deployment.apps/my-dep image updated
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-5b7868d854-kcmpm 1/1 Running 0 22m
my-dep-5b7868d854-mlwgf 1/1 Running 0 22m
my-dep-5b7868d854-pwbdn 1/1 Running 0 22m
my-dep-6b48cbf4f9-sd6cl 0/1 ContainerCreating 0 6s
==他会先拉起一个新版本的pod容器,在将老版本的删除掉,进行滚动更新==
==--record 记录这次更新==
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-6b48cbf4f9-c56dj 1/1 Running 0 5m34s
my-dep-6b48cbf4f9-nbqzv 1/1 Running 0 4m8s
my-dep-6b48cbf4f9-sd6cl 1/1 Running 0 13m
2.4 版本回退
[root@master kubernets]# kubectl edit deployment/my-dep
#查看imge 镜像已经是1.16.1
==查看历史版本==
[root@master kubernets]# kubectl rollout history deployment/my-dep
deployment.apps/my-dep
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record=true
==查看某个历史详情==
==可以看到具体使用的某个镜像==
root@master kubernets]# kubectl rollout history deployment/my-dep --revision=2
deployment.apps/my-dep with revision #2
Pod Template:
Labels: app=my-dep
pod-template-hash=6b48cbf4f9
Annotations: kubernetes.io/change-cause: kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record=true
Containers:
nginx:
Image: nginx:1.16.1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
==回滚(回到上次)==
[root@master kubernets]# kubectl rollout undo deployment/my-dep
deployment.apps/my-dep rolled back
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-5b7868d854-59bf7 1/1 Running 0 40s
my-dep-5b7868d854-d9wpf 1/1 Running 0 88s
my-dep-5b7868d854-pktqr 1/1 Running 0 66s
==回滚(回到指定版本)==
[root@master kubernets]# kubectl rollout undo deployment/my-dep --to-revision=2
deployment.apps/my-dep rolled back
[root@master kubernets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-5b7868d854-59bf7 1/1 Running 0 93s
my-dep-5b7868d854-d9wpf 1/1 Running 0 2m21s
my-dep-5b7868d854-pktqr 1/1 Running 0 119s
my-dep-6b48cbf4f9-ndpvn 0/1 ContainerCreating 0 7s
命令小结
==历史记录==
kubectl rollout history deployment/my-dep
==查看某个历史详情==
kubectl rollout history deployment/my-dep --revision=2
==回滚(回到上次)==
kubectl rollout undo deployment/my-dep
==回滚(回到指定版本)==
kubectl rollout undo deployment/my-dep --to-revision=2
==滚动更新==
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
3.0 yaml详解
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,资源类型,例如 Pod
metadata: #必选,元数据
name: string #必选,Pod名称
annotations: #选做,描述信息
nginx: nginx
namespace: string #Pod所属的命名空间,默认为"default"
labels: #自定义标签列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: 80 #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存请求,容器启动的初始可用数量
lifecycle: #生命周期钩子
postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略
nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
更多:
除了Deployment,k8s还有 StatefulSet 、DaemonSet 、Job 等 类型资源。我们都称为 工作负载。
有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署
官方详解