FIELD: restartPolicy

DESCRIPTION:

Restart policy for all containers within the pod. One of Always, OnFailure,

Never. Default to Always. More info:

https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy

//修改为Never

[root@master ~]# cat test.yml

apiVersion: v1

kind: Pod

metadata:

name: web

spec:

containers:

  • name: nginx

image: nginx

imagePullPolicy: IfNotPresent

  • name: test

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

restartPolicy: Never #默认的话不用修改,改为never后停止容器不会重启

[root@master ~]# kubectl apply -f test.yml

pod/web created

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

web 2/2 Running 0 12s

[root@master ~]# kubectl get pod -o wide -w #-w实时监控,在node2上面用docker命令关上其中一个,发现不会重启

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

web 2/2 Running 0 23s 10.244.1.78 node1

web 1/2 NotReady 0 46s 10.244.1.78 node1

//修改为Always

[root@master ~]# cat test.yml

apiVersion: v1

kind: Pod

metadata:

name: web

spec:

containers:

  • name: nginx

image: nginx

imagePullPolicy: IfNotPresent

  • name: test

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

restartPolicy: Always

//删除原来的test.yml ,重启启动一个新的pod

[root@master ~]# kubectl delete -f test.yml

pod “web” deleted

[root@master ~]# kubectl apply -f test.yml

pod/web created

//启动好后,在node1上停止test

[root@master ~]# kubectl get pods -o wide -w

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

web 2/2 Running 0 6s 10.244.1.79 node1

web 1/2 NotReady 0 46s 10.244.1.79 node1

web 2/2 Running 1 47s 10.244.1.79 node1

web 1/2 NotReady 1 92s 10.244.1.79 node1

web 1/2 CrashLoopBackOff 1 102s 10.244.1.79 node1

web 2/2 Running 2 103s 10.244.1.79 node1

等待一定的时间后重启,而后自动起一台新的

//OnFailure

[root@master ~]# cat test.yml

apiVersion: v1

kind: Pod

metadata:

name: web

spec:

containers:

  • name: nginx

image: nginx

imagePullPolicy: IfNotPresent

  • name: test

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

restartPolicy: OnFailure

//删除原来的test.yml ,重启启动一个新的pod

[root@master ~]# kubectl delete -f test.yml

pod “web” deleted

[root@master ~]# kubectl apply -f test.yml

pod/web created

//启动好后,在node1上停止test

[root@node1 ~]# docker ps | grep test

6ed4e11715d8 ffe9d497c324 “bin/sh -c ‘sleep 45’” 3 seconds ago Up 3 seconds k8s_test_web_default_cc265ebd-4dae-49e7-8235-d1ba1102b4af_0

[root@node1 ~]# docker kill 6ed4e11715d8

6ed4e11715d8

//又起来了

[root@node1 ~]# docker ps | grep test

bf042b813e7c ffe9d497c324 “bin/sh -c ‘sleep 45’” 14 seconds ago Up 13 seconds k8s_test_web_default_cc265ebd-4dae-49e7-8235-d1ba1102b4af_1

[root@master ~]# kubectl get pods -o wide -w

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

web 2/2 Running 0 1s 10.244.1.80 node1

web 1/2 Error 0 34s 10.244.1.80 node1

//异常退出(手动杀掉)

web 2/2 Running 1 35s 10.244.1.80 node1

//正常退出(60秒)

web 1/2 NotReady 1 80s 10.244.1.80 node1

web 1/2 NotReady 1 2m26s 10.244.1.80 node1

健康检查


  • livenessProbe(存活检查)︰如果检查失败,将杀死容器,根据Pod的restartPolicy来操作

  • readinessProbe(就绪检查)︰如果检查失败,Kubernetes会把Pod从service endpoints中剔除

支持的检查方式:

  • httpGet:发送HTTP请求,返回200-400范围状态码为成功

  • exec: 执行hell命令返回状态码是0为成功

  • tcpSocket:发起TCP Socket建立成功

与重启策略相结合使用

重启策略+健康检查(应用自修复)

在这里插入图片描述

//端口探测

[root@master ~]# cat test.yml


apiVersion: v1

kind: Pod

metadata:

name: web

spec:

containers:

  • name: nginx

image: nginx

imagePullPolicy: IfNotPresent

ports:

  • containerPort: 80

hostPort: 80

livenessProbe:

tcpSocket:

port: 80

initialDelaySeconds: 20 #启动容器后多少秒健康检查

periodSeconds: 10 #以后间隔多少秒检查一次

readinessProbe:

httpGet:

port: 80

initialDelaySeconds: 20

periodSeconds: 10

[root@master ~]# kubectl apply -f test.yml

pod/web created

//查看pod,发现在进行初始化

[root@master ~]# kubectl get pod

NAME READY(就绪状态) STATUS(存活状态) RESTARTS AGE

web 0/1 Running 0 18s

//等待一定时间后会进入运行

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

web 1/1 Running 0 34s

如果失败init容器默认会在State中显示CrashLoopBackOff (重启/异常)

在Reason会显示Error

State 代表状态

Reason 原因

Terminated 终止

Completed 完成

环境变量


变量值几种定义方式:

  • 自定义变量值

  • 变量值从Pod属性获取

  • 变量值从Secrt,ConfigMap

在这里插入图片描述

[root@master ~]# kubectl explain pod.spec.containers.env.valueFrom

KIND: Pod

VERSION: v1

RESOURCE: valueFrom

DESCRIPTION:

Source for the environment variable’s value. Cannot be used if value is not

empty.

EnvVarSource represents a source for the value of an EnvVar.

FIELDS:

configMapKeyRef

Selects a key of a ConfigMap.

fieldRef

Selects a field of the pod: supports metadata.name, metadata.namespace,

metadata.labels['<KEY>'], metadata.annotations['<KEY>'], spec.nodeName,

spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.

resourceFieldRef

Selects a resource of the container: only resources limits and requests

(limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu,

requests.memory and requests.ephemeral-storage) are currently supported.

secretKeyRef

Selects a key of a secret in the pod’s namespace

第一种


apiVersion: v1

kind: Pod

metadata:

name: test

spec:

containers:

  • name: bi

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

env:

  • name: HN

value: tom

[root@master ~]# kubectl apply -f test.yml

pod/test created

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

test 1/1 Running 0 21s

[root@master ~]# kubectl exec -it test – /bin/sh

/ # echo $HN

tom

第二种

[root@master ~]# cat test.yml


apiVersion: v1

kind: Pod

metadata:

name: test

spec:

containers:

  • name: bi

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

env:

  • name: HN

valueFrom:

fieldRef:

fieldPath: metadata.name

[root@master ~]# kubectl delete -f test.yml

pod “test” deleted

[root@master ~]# kubectl apply -f test.yml

pod/test created

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

test 1/1 Running 0 21s

[root@master ~]# kubectl exec -it test – /bin/sh

/ # echo $HN

test

第三种

[root@master ~]# cat test.yml


apiVersion: v1

kind: Pod

metadata:

name: test

spec:

containers:

  • name: bi

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

env:

  • name: HN

valueFrom:

fieldRef:

fieldPath: spec.nodeName

[root@master ~]# kubectl delete -f test.yml

pod “test” deleted

[root@master ~]# kubectl apply -f test.yml

pod/test created

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

test 1/1 Running 0 17s

[root@master ~]# kubectl exec -it test – /bin/sh

/ # echo $HN

node1

第四种

[root@master ~]# cat test.yml


apiVersion: v1

kind: Pod

metadata:

name: test

spec:

containers:

  • name: bi

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

env:

  • name: HN

valueFrom:

fieldRef:

fieldPath: status.podIP

[root@master ~]# kubectl delete -f test.yml

pod “test” deleted

[root@master ~]# kubectl apply -f test.yml

pod/test created

[root@master ~]# kubectl exec -it test – /bin/sh

/ # echo $HN

10.244.1.84

/ # exit

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

test 1/1 Running 1 50s 10.244.1.84 node1

init Container(初始化容器)


初始化容器

  • Init Container:用于初始化工作,执行完就结束(一次性任务)

  • 支持大部分应用容器配置,但不支持健康检查

  • 优先应用容器执行

应用场景:

  • 环境检查:例如确保应用容器依赖的服务启动后再启动应用容器

  • 初始化配置:例如给应用容器准备配置文件

在这里插入图片描述

示例

这里部署一个web网站,网站程序没有打到镜像中,而是希望从代码仓库中动态拉取放到应用容器中

在这里插入代码片[root@master ~]# cat test.yml


apiVersion: v1

kind: Pod

metadata:

name: web

namespace: default

spec:

initContainers:

  • name: download

image: busybox

imagePullPolicy: IfNotPresent

volumeMounts:

  • name: data

mountPath: /tmp

containers:

  • name: nginx

image: nginx

imagePullPolicy: IfNotPresent

ports:

  • containerPort: 80

hostPort: 80

volumeMounts:

  • name: data

mountPath: /usr/share/nginx/html

volumes:

  • name: data

hostPath:

path: /var/www/html

//不管在哪个节点我都创建

[root@node1 ~]# mkdir /var/www/html/ -p

[root@node1 ~]# cd /var/www/html/

[root@node1 html]# echo “1314444” > index.html

[root@node1 html]# cat index.html

1314444

[root@node2 ~]# mkdir /var/www/html/ -p

[root@node2 ~]# cd /var/www/html/

[root@node2 html]# echo “hello world” > index.html

[root@node2 html]# cat index.html

hello world

[root@master ~]# kubectl apply -f test.yml

pod/web created

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

web 1/1 Running 0 8s

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

web 1/1 Running 0 45s 10.244.1.85 node1

[root@master ~]# curl 10.244.1.85

1314444

//详细信息

[root@master ~]# kubectl describe pod web

Name: web

Namespace: default

Priority: 0

Node: node1/192.168.129.135

Start Time: Wed, 22 Dec 2021 22:27:06 +0800

Labels:

Annotations:

Status: Running

IP: 10.244.1.86

IPs:

IP: 10.244.1.86

Init Containers:

download:

Container ID: docker://ec747a2654371d818661cc8e1da08d465d15e8d8d13c3a8d6a47f1ca21106d94

Image: busybox

Image ID: docker-pullable://busybox@sha256:b5cfd4befc119a590ca1a81d6bb0fa1fb19f1fbebd0397f25fae164abe1e8a6a

Port:

Host Port:

State: Terminated

Reason: Completed

Exit Code: 0

Started: Wed, 22 Dec 2021 22:27:07 +0800

Finished: Wed, 22 Dec 2021 22:27:07 +0800

Ready: True

Restart Count: 0

Environment:

Mounts:

/tmp from data (rw)

/var/run/secrets/kubernetes.io/serviceaccount from default-token-ck7n4 (ro)

Containers:

nginx:

Container ID: docker://6dd618f9591a8d27623d1394d07def8498e25741af293ff5ef101db3516206e1

Image: nginx

Image ID: docker-pullable://nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603

Port: 80/TCP

Host Port: 80/TCP

State: Running

Started: Wed, 22 Dec 2021 22:27:08 +0800

Ready: True

Restart Count: 0

Environment:

Mounts:

/usr/share/nginx/html from data (rw)

/var/run/secrets/kubernetes.io/serviceaccount from default-token-ck7n4 (ro)

Conditions:

Type Status

Initialized True

Ready True

ContainersReady True

PodScheduled True

Volumes:

data:

Type: HostPath (bare host directory volume)

Path: /var/www/html

HostPathType:

default-token-ck7n4:

Type: Secret (a volume populated by a Secret)

SecretName: default-token-ck7n4

Optional: false

QoS Class: BestEffort

Node-Selectors:

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 6m35s default-scheduler Successfully assigned default/web to node1

Normal Pulled 6m34s kubelet Container image “busybox” already present on machine

Normal Created 6m34s kubelet Created container download

Normal Started 6m34s kubelet Started container download

Normal Pulled 6m33s kubelet Container image “nginx” already present on machine

Normal Created 6m33s kubelet Created container nginx

Normal Started 6m33s kubelet Started container nginx

总结:Pod中会有这几种类型的容器

  • Infrastructure Container:基础容器

维护整个Pod网络空间

  • lnitContainers:初始化容器

先于业务容器开始执行

  • Containers:业务容器

并行启动

先简单的做出两个运行httpd程序的pod


[root@master httpd]# vim Dockerfile

FROM busybox

RUN mkdir /data && \

echo “test page on jjyy” > /data/index.html

ENTRYPOINT [“/bin/httpd”,“-f”,“-h”,“/data”]

[root@master ~]# docker build -t 1314444/httpd:v0.1 httpd

[root@master ~]# vim httpd/Dockerfile

FROM busybox

RUN mkdir /data && \

echo “test page on 666” > /data/index.html

ENTRYPOINT [“/bin/httpd”,“-f”,“-h”,“/data”]

[root@master ~]# docker build -t 1314444/httpd:v0.2 httpd

web


[root@master ~]# cat manifest/web.yml


apiVersion: apps/v1

kind: Deployment

metadata:

name: web1

namespace: default

spec:

replicas: 1

selector:

matchLabels:

app: web1

template:

metadata:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后我们该如何学习?

1、看视频进行系统学习

这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

2、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

Spring源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Mybatis 3源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Redis学习笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Spring Boot核心技术-笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ttps://img-community.csdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

最后我们该如何学习?

1、看视频进行系统学习

这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:

[外链图片转存中…(img-PxIHbeCP-1713337478770)]

2、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

Spring源码深度解析:

[外链图片转存中…(img-YFBia036-1713337478771)]

Mybatis 3源码深度解析:

[外链图片转存中…(img-p4Ez7UC8-1713337478771)]

Redis学习笔记:

[外链图片转存中…(img-FeJFQLxW-1713337478771)]

Spring Boot核心技术-笔记:

[外链图片转存中…(img-BMO0FxSi-1713337478771)]

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

[外链图片转存中…(img-daFx4Mjs-1713337478772)]

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐