nba新闻最新消息滚动,seo实战培训王乃用,自己做个网站多少钱,wordpress电脑图片尺寸『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解
Pod 结构 每个 Pod 中都可以包含一个或者多个容器,这些容器可以分为两类
用户程序所在的容器,数量可多可少Pause 容器,这是每个 Pod 都会有的一个根容器,它的作用有两个 可…
nginx:用 1.17.1 版本的 nginx 镜像创建,(nginx 是一个轻量级 web 容器)
busybox:用 1.30 版本的 busybox 镜像创建,(busybox 是一个小巧的 linux 命令集合)
# 创建Pod[root@k8s-master01 pod]# kubectl apply -f pod-base.yaml
pod/pod-base created# 查看 Pod 状况# READY 1/2:表示当前 Pod 中有 2 个容器,其中 1 个准备就绪,1 个未就绪# RESTARTS:重启次数,因为有 1 个容器故障了,Pod 一直在重启试图恢复它[root@k8s-master01 pod]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pod-base 1/2 Running 4 95s# 可以通过describe查看内部的详情# 此时已经运行起来了一个基本的 Pod,虽然它暂时有问题[root@k8s-master01 pod]# kubectl describe pod pod-base -n dev
Pod 镜像拉取(imagePullPolicy)
创建 pod-imagepullpolicy.yaml 文件,内容如下
apiVersion: v1
kind: Pod
metadata:name: pod-imagepullpolicynamespace: dev
spec:containers:-name: nginximage: nginx:1.17.1imagePullPolicy: Never # 用于设置镜像拉取策略-name: busyboximage: busybox:1.30
apiVersion: v1
kind: Pod
metadata:name: pod-resourcesnamespace: dev
spec:containers:-name: nginximage: nginx:1.17.1resources:# 资源配额limits:# 限制资源(上限)cpu:"2"# CPU限制,单位是core数memory:"10Gi"# 内存限制requests:# 请求资源(下限)cpu:"1"# CPU限制,单位是core数memory:"10Mi"# 内存限制
在这对 cpu 和 memory 的单位做一个说明
cpu:core数,可以为整数或小数
memory:内存大小,可以使用 Gi、Mi、G、M 等形式
# 运行Pod[root@k8s-master01 ~]# kubectl create -f pod-resources.yaml
pod/pod-resources created# 查看发现pod运行正常[root@k8s-master01 ~]# kubectl get pod pod-resources -n dev
NAME READY STATUS RESTARTS AGE
pod-resources 1/1 Running 0 39s # 接下来,停止Pod[root@k8s-master01 ~]# kubectl delete -f pod-resources.yaml
pod "pod-resources" deleted# 编辑pod,修改resources.requests.memory的值为10Gi[root@k8s-master01 ~]# vim pod-resources.yaml# 再次启动pod[root@k8s-master01 ~]# kubectl create -f pod-resources.yaml
pod/pod-resources created# 查看Pod状态,发现Pod启动失败[root@k8s-master01 ~]# kubectl get pod pod-resources -n dev -o wide
NAME READY STATUS RESTARTS AGE
pod-resources 0/1 Pending 0 20s # 查看pod详情会发现,如下提示[root@k8s-master01 ~]# kubectl describe pod pod-resources -n dev......
Warning FailedScheduling 35s default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 Insufficient memory.(内存不足)
Pod 生命周期
一般将 pod 对象从创建至终的这段时间范围称为 pod 的生命周期,它主要包含下面的过程
pod 创建过程
运行初始化容器(init container)过程
运行主容器(main container)
容器启动后钩子(post start)、容器终止前钩子(pre stop)
容器的存活性探测(liveness probe)、就绪性探测(readiness probe)
在整个生命周期中,Pod 会出现 5 种状态(相位)
挂起(Pending):apiserver 已经创建了 pod 资源对象,但它尚未被调度完成或者仍处于下载镜像的过程中
apiVersion: v1
kind: Pod
metadata:name: pod-liveness-execnamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1ports: - name: nginx-portcontainerPort: 80livenessProbe:exec:command: ["/bin/cat","/tmp/hello.txt"]# 执行一个查看文件的命令
创建 pod,观察效果
# 创建Pod[root@k8s-master01 ~]# kubectl create -f pod-liveness-exec.yaml
pod/pod-liveness-exec created# 查看Pod详情[root@k8s-master01 ~]# kubectl describe pods pod-liveness-exec -n dev......Normal Created 20s (x2 over 50s) kubelet, node1 Created container nginxNormal Started 20s (x2 over 50s) kubelet, node1 Started container nginxNormal Killing 20s kubelet, node1 Container nginx failed liveness probe, will be restartedWarning Unhealthy 0s (x5 over 40s) kubelet, node1 Liveness probe failed: cat: can't open '/tmp/hello11.txt': No such file or directory# 观察上面的信息就会发现nginx容器启动之后就进行了健康检查# 检查失败之后,容器被kill掉,然后尝试进行重启(这是重启策略的作用,后面讲解)# 稍等一会之后,再观察pod信息,就可以看到RESTARTS不再是0,而是一直增长[root@k8s-master01 ~]# kubectl get pods pod-liveness-exec -n dev
NAME READY STATUS RESTARTS AGE
pod-liveness-exec 0/1 CrashLoopBackOff 2 3m19s# 当然接下来,可以修改成一个存在的文件,比如/tmp/hello.txt,再试,结果就正常了......
测试 TCPSocket 探测
创建 pod-liveness-tcpsocket.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-liveness-tcpsocketnamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1ports: - name: nginx-portcontainerPort: 80livenessProbe:tcpSocket:port: 8080# 尝试访问8080端口
创建 pod,观察效果
# 创建Pod[root@k8s-master01 ~]# kubectl create -f pod-liveness-tcpsocket.yaml
pod/pod-liveness-tcpsocket created# 查看Pod详情[root@k8s-master01 ~]# kubectl describe pods pod-liveness-tcpsocket -n dev......Normal Scheduled 31s default-scheduler Successfully assigned dev/pod-liveness-tcpsocket to node2Normal Pulled <invalid> kubelet, node2 Container image "nginx:1.17.1" already present on machineNormal Created <invalid> kubelet, node2 Created container nginxNormal Started <invalid> kubelet, node2 Started container nginxWarning Unhealthy <invalid>(x2 over <invalid>) kubelet, node2 Liveness probe failed: dial tcp 10.244.2.44:8080: connect: connection refused# 观察上面的信息,发现尝试访问8080端口,但是失败了# 稍等一会之后,再观察pod信息,就可以看到RESTARTS不再是0,而是一直增长[root@k8s-master01 ~]# kubectl get pods pod-liveness-tcpsocket -n dev
NAME READY STATUS RESTARTS AGE
pod-liveness-tcpsocket 0/1 CrashLoopBackOff 2 3m19s# 当然接下来,可以修改成一个可以访问的端口,比如80,再试,结果就正常了......
测试 HTTPGet 探测
创建 pod-liveness-httpget.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-liveness-httpgetnamespace: dev
spec:containers:-name: nginximage: nginx:1.17.1ports:-name: nginx-portcontainerPort:80livenessProbe:httpGet:# 其实就是访问http://127.0.0.1:80/hello scheme: HTTP #支持的协议,http或者httpsport:80#端口号path: /hello #URI地址
创建 pod,观察效果
# 创建Pod[root@k8s-master01 ~]# kubectl create -f pod-liveness-httpget.yaml
pod/pod-liveness-httpget created# 查看Pod详情[root@k8s-master01 ~]# kubectl describe pod pod-liveness-httpget -n dev.......Normal Pulled 6s (x3 over 64s) kubelet, node1 Container image "nginx:1.17.1" already present on machineNormal Created 6s (x3 over 64s) kubelet, node1 Created container nginxNormal Started 6s (x3 over 63s) kubelet, node1 Started container nginxWarning Unhealthy 6s (x6 over 56s) kubelet, node1 Liveness probe failed: HTTP probe failed with statuscode: 404Normal Killing 6s (x2 over 36s) kubelet, node1 Container nginx failed liveness probe, will be restarted# 观察上面信息,尝试访问路径,但是未找到,出现404错误# 稍等一会之后,再观察pod信息,就可以看到RESTARTS不再是0,而是一直增长[root@k8s-master01 ~]# kubectl get pod pod-liveness-httpget -n dev
NAME READY STATUS RESTARTS AGE
pod-liveness-httpget 1/1 Running 5 3m17s# 当然接下来,可以修改成一个可以访问的路径path,比如/,再试,结果就正常了......
apiVersion: v1
kind: Pod
metadata:name: pod-liveness-httpgetnamespace: dev
spec:containers:-name: nginximage: nginx:1.17.1ports:-name: nginx-portcontainerPort:80livenessProbe:httpGet:scheme: HTTPport:80path: /initialDelaySeconds:30# 容器启动后30s开始探测timeoutSeconds:5# 探测超时时间为5s
重启策略
一旦容器探测出现了问题,kubernetes 就会对容器所在的 Pod 进行重启,其实这是由 pod 的重启策略决定的,pod 的重启策略有 3 种:
Always:容器失效时,自动重启该容器,这也是默认值
OnFailure: 容器终止运行且退出码不为 0 时重启
Never: 不论状态为何,都不重启该容器
重启策略适用于 pod 对象中的所有容器,首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由 kubelet 延迟一段时间后进行,且反复的重启操作的延迟时长以此为 10s、20s、40s、80s、160s 和 300s,300s 是最大延迟时长
创建 pod-restartpolicy.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-restartpolicynamespace: dev
spec:containers:-name: nginximage: nginx:1.17.1ports:-name: nginx-portcontainerPort:80livenessProbe:httpGet:scheme: HTTPport:80path: /hellorestartPolicy: Never # 设置重启策略为 Never
运行 Pod 测试
# 创建Pod[root@k8s-master01 ~]# kubectl create -f pod-restartpolicy.yaml
pod/pod-restartpolicy created# 查看Pod详情,发现nginx容器失败[root@k8s-master01 ~]# kubectl describe pods pod-restartpolicy -n dev......Warning Unhealthy 15s (x3 over 35s) kubelet, node1 Liveness probe failed: HTTP probe failed with statuscode: 404Normal Killing 15s kubelet, node1 Container nginx failed liveness probe# 多等一会,再观察pod的重启次数,发现一直是0,并未重启。会发现状态是 Completed[root@k8s-master01 ~]# kubectl get pods pod-restartpolicy -n dev
NAME READY STATUS RESTARTS AGE
pod-restartpolicy 0/1 Completed 0 35s
Pod 调度
在默认情况下,一个 Pod 在哪个 Node 节点上运行,是由 Scheduler 组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些 Pod 到达某些节点上。因此 kubernetes 提供了四大类调度方式: