image: harbor.magedu.local/magedu/tomcat-app1:v1

#command: [“/apps/tomcat/bin/run_tomcat.sh”]

#imagePullPolicy: IfNotPresent

imagePullPolicy: Always

ports:

  • containerPort: 8080

protocol: TCP

name: http

env:

  • name: “password”

value: “123456”

  • name: “age”

value: “18”

resources:

limits:

cpu: 1

memory: “512Mi”

requests:

#使用率50%

cpu: 500m

memory: “512Mi”

restartPolicy: Always

在这里插入图片描述

5. 存活(liveness)和就绪(readiness)探针的使用场景


如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活探针;kubelet 将根据 Pod 的restartPolicy 自动执行正确的操作。

如果你希望容器在探测失败时被杀死并重新启动,那么请指定一个存活探针,并指定restartPolicy 为 Always 或 OnFailure。

如果要仅在探测成功时才开始向 Pod 发送流量,请指定就绪探针。在这种情况下,就绪探针可能与存活探针相同,但是 spec 中的就绪探针的存在意味着 Pod 将在没有接收到任何流量的情况下启动,并且只有在探针探测成功后才开始接收流量。

6. 探针配置检测


[root@k8s-master lifecycle]# pwd

/root/k8s_practice/lifecycle

[root@k8s-master lifecycle]# cat readinessProbe-httpget.yaml

apiVersion: v1

kind: Pod

metadata:

name: readiness-httpdget-pod

namespace: default

labels:

test: readiness-httpdget

spec:

containers:

  • name: readiness-httpget

image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17

imagePullPolicy: IfNotPresent

readinessProbe:

httpGet:

path: /index1.html

port: 80

initialDelaySeconds: 5 #容器启动完成后,kubelet在执行第一次探测前应该等待 5 秒。默认是 0 秒,最小值是 0。

periodSeconds: 3 #指定 kubelet 每隔 3 秒执行一次存活探测。默认是 10 秒。最小值是 1

探针示例

=======================================================================

1. HttpGetAction


对指定的端口和路径上的容器的IP地址执行 HTTPGet 请求。如果响应的状态码大于等于 200 且小于400,则诊断被认为是成功的

就绪检测

例子:

在这里插入图片描述

httpGet 探测方式有如下可选的控制字段:

scheme: 用于连接 host 的协议,默认为 HTTP。

host:要连接的主机名,默认为 Pod IP,可以在 http request head 中设置 host 头部。

port:容器上要访问端口号或名称。

path:http 服务器上的访问 URI。

httpHeaders:自定义 HTTP 请求 headers,HTTP 允许重复 headers。

在这里插入图片描述

例子:

就绪检测 nginx 的 index1.html 存在否,存在的话,就绪检测通过

apiVersion: v1

kind: Pod

metadata:

name: readiness-httpget-pod

namespace: default

spec:

containers:

  • name: readiness-httpget-container

image: wangyanglinux/myapp:v1

imagePullPolicy: IfNotPresent

readinessProbe: # 就绪检测

httpGet: # httpGet 检测方案

port: 80 # 端口 80

path: /index.html # 请求文件

initialDelaySeconds: 1 # 初始化检测的延时,容器启动 1 之后再开始检测

periodSeconds: 3 # 重试的检测时间

发现一直卡在哪儿----没有index.html文件

[root@k8s-master01 ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

readiness-httpget-pod 0/1 Running 0 12s

查看日志信息,显示 HTTP 请求状态码为 404

[root@k8s-master01 ~]# kubectl describe pod readiness-httpget-pod

Type Reason Age From Message


Warning Unhealthy 75s (x22 over 2m18s) kubelet, localhost.localdomain Readiness probe failed: HTTP probe failed with statuscode: 404

手动进入容器,添加 index1.html 之后,就为Running

存活检测

每隔一段时间(3s),检测 nginx 中的 index1.html 能否被访问,如果不能访问,就重启容器

apiVersion: v1

kind: Pod

metadata:

name: liveness-httpget-pod

namespace: default

spec:

containers:

  • name: liveness-httpget-container

image: wangyanglinux/myapp:v1

imagePullPolicy: IfNotPresent

ports:

  • name: http

containerPort: 80

livenessProbe:

httpGet:

port: http # http 和 80 等价

path: /index1.html

initialDelaySeconds: 1

periodSeconds: 3

timeoutSeconds: 10 # 最大超时时间

cat nginx.yaml

#apiVersion: extensions/v1beta1

apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-deployment

spec:

replicas: 1

selector:

matchLabels: #rs or deployment

app: ng-deploy-80

#matchExpressions:

- {key: app, operator: In, values: [ng-deploy-80,ng-rs-81]}

template:

metadata:

labels:

app: ng-deploy-80

spec:

containers:

  • name: ng-deploy-80

image: nginx:1.17.5

ports:

  • containerPort: 80

#readinessProbe:

livenessProbe:

httpGet:

#path: /monitor/monitor.html

path: /index.html

port: 80

initialDelaySeconds: 5

periodSeconds: 3

timeoutSeconds: 5

successThreshold: 1

failureThreshold: 3


apiVersion: v1

kind: Service

metadata:

name: ng-deploy-80

spec:

ports:

  • name: http

port: 81

targetPort: 80

nodePort: 30012

protocol: TCP

type: NodePort

selector:

app: ng-deploy-80

在这里插入图片描述

2. ExecAction


在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功

存活检测

pod 创建,容器初始化完成后,创建文件后休眠 60 秒后删除该文件,存活检测在容器创建后延时 1s 进行检测,重试时间间隔 3s

apiVersion: v1

kind: Pod

metadata:

name: liveness-exec-pod

namespace: default

spec:

containers:

  • name: liveness-exec-container

image: busybox

imagePullPolicy: IfNotPresent

创建一个文件,休眠 60s,然后把该文件删除

command: [“/bin/sh”,“-c”,“touch /temp/live ; sleep 60 ; rm -rf /temp/live; sleep 3600”]

livenessProbe: # 存活检测

exec:

检测该文件是还存在, 如果存在,返回值为 0

command: [“test”,“-e”,“/temp/live”]

initialDelaySeconds: 1 # 容器启动后延时 1s 再开始检测

periodSeconds: 3 # 每隔 3s 检测一次

容器启动时会创建 /temp/live 文件,60s 之后删除该文件。当 livenessProbe 发现文件不存在,就会重启容器,重启后的容器 60秒之后又会删除 /temp/live 文件,所以容器不断被重启

在这里插入图片描述

docker pull redis

cat redis.yaml

#apiVersion: extensions/v1beta1

apiVersion: apps/v1

kind: Deployment

metadata:

name: redis-deployment

spec:

replicas: 1

selector:

matchLabels: #rs or deployment

app: redis-deploy-6379

#matchExpressions:

- {key: app, operator: In, values: [redis-deploy-6379,ng-rs-81]}

template:

metadata:

labels:

app: redis-deploy-6379

spec:

containers:

  • name: redis-deploy-6379

image: redis

ports:

  • containerPort: 6379

livenessProbe:

#readinessProbe:

exec:

command:

#- /apps/redis/bin/redis-cli

#进入,并推出redis

  • /usr/local/bin/redis-cli

  • quit

initialDelaySeconds: 5

periodSeconds: 3

timeoutSeconds: 5

successThreshold: 1

failureThreshold: 3


apiVersion: v1

kind: Service

metadata:

name: redis-deploy-6379

spec:

ports:

  • name: http

port: 6379

targetPort: 6379

nodePort: 40016

protocol: TCP

type: NodePort

selector:

app: redis-deploy-6379

如果端口检测连续超过指定的三次都没有通过,则Pod状态如下

在这里插入图片描述

3. TCPSocketAction


对指定容器端口的IP地址进行 TCP 检查。如端口打开,则诊断被认为是成功的。

存活检测

创建一个 pod,镜像文件是 nginx,存活检测镜像容器中的 nginx(80),使用 tcp 连接,端口指定8080,当探测结果失败时(不可访问),重启容器

apiVersion: v1

kind: Pod

metadata:

name: liveness-tcp-pod

namespace: default

spec:

containers:

  • name: liveness-tcp-container

image: wangyanglinux/myapp:v1

imagePullPolicy: IfNotPresent

livenessProbe:

initialDelaySeconds: 1

timeoutSeconds: 5

periodSeconds: 3

tcpSocket:

port: 8080 # nginx 是 80 端口

cat nginx.yaml

#apiVersion: extensions/v1beta1

apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-deployment

spec:

replicas: 1

selector:

matchLabels: #rs or deployment

app: ng-deploy-80

#matchExpressions:

- {key: app, operator: In, values: [ng-deploy-80,ng-rs-81]}

template:

metadata:

labels:

app: ng-deploy-80

spec:

containers:

  • name: ng-deploy-80

image: nginx:1.17.5

ports:

  • containerPort: 80

livenessProbe:

#readinessProbe:

tcpSocket:

port: 80

#port: 8080

initialDelaySeconds: 5

periodSeconds: 3

timeoutSeconds: 5

successThreshold: 1

failureThreshold: 3


apiVersion: v1

kind: Service

metadata:

name: ng-deploy-80

spec:

ports:

  • name: http

port: 81

targetPort: 80

nodePort: 40012

protocol: TCP

type: NodePort s

elector:

app: ng-deploy-80

三. 手动调整pod数量

===============================================================================

在高峰期间需要扩容,低峰缩容(节省成本)

kubectl scale 对运行在k8s 环境中的pod 数量进行扩容(增加)或缩容(减小)。

  1. 改yaml文件改replicas数量

  2. 在dashboard改deployment的pdo值

  3. 通过kubectl scale命令

kubectl scale deployment linux39-tomcat-app1-deployment --replicas=3 -n linux

  1. 通过kubectl edit

kubectl edit deployment linux39-tomcat-app1-deployment -n linux

永久配置:改ymal文件

当前pod数量:

kubectl get deployment -n linux

查看命令使用帮助

kubectl --help | grep scale

kubectl scale --help

执行扩容/缩容

kubectl scale deployment/linux-tomcat-app1-deployment --replicas=2 -n linux

验证手动扩容结果

kubectl get deployment -n linux

四. HPA自动伸缩pod数量

==================================================================================

kubectl autoscale 自动控制在k8s集群中运行的pod数量(水平自动伸缩),需要提前设置pod范围及触发条件

k8s从1.1版本开始增加了名称为HPA(Horizontal Pod Autoscaler)的控制器,用于实现基于pod中资源(CPU/Memory)利用率进行对pod的自动扩缩容功能的实现,早期的版本只能基于Heapster组件实现对CPU利用率做为触发条件,

但是在k8s 1.11版本开始使用Metrices Server完成数据采集,然后将采集到的数据通过API(Aggregated API,汇总API),例如metrics.k8s.io,custom.metrics.k8s.ioexternal.metrics.k8s.io,然后再把数据提供给HPA控制器进行查询,以实现基于某个资源利用率对pod进行扩缩容的目的。

控制管理器默认每隔15s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源

使用情况

支持以下三种metrics类型:

->预定义metrics(比如Pod的CPU)以利用率的方式计算

->自定义的Pod metrics,以原始值(raw value)的方式计算

->自定义的object metrics

支持两种metrics查询方式:

->Heapster

->自定义的REST API

支持多metrics

在这里插入图片描述

1. 准备metrics-server:


使用metrics-server作为HPA数据源

https://github.com/kubernetes-incubator/metrics-server

clone代码:

git clone https://github.com/kubernetes-incubator/metrics-server.git

cd metrics-server/

准备image:

测试系统自带的指标数据:

curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/nodes

curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/pods

测试指标数据:

kubectl top

kubectl top nodes

报错如下

Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)

解决方案

#google镜像仓库

docker pull k8s.gcr.io/metrics-server-amd64:v0.3.5

#阿里云镜像仓库

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.5

或者

docker tag k8s.gcr.io/metrics-server-amd64:v0.3.5 harbor.magedu.net/baseimages/metrics- server-amd64:v0.3.5

docker push harbor.qcqu.net/baseimages/metrics-server-amd64:v0.3.5

修改yaml文件:

pwd

/root/metrics-server

cat deploy/1.8+/metrics-server-deployment.yaml


apiVersion: v1

kind: ServiceAccount

metadata:

name: metrics-server

namespace: kube-system


apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: metrics-server

namespace: kube-system

labels:

k8s-app: metrics-server

spec:

selector:

matchLabels: k8s-app:

metrics-server

template:

metadata:

name: metrics-server

labels:

k8s-app: metrics-server

spec:

serviceAccountName: metrics-server

volumes:

mount in tmp so we can safely use from-scratch images and/or read-only containers

  • name: tmp-dir

emptyDir: {} containers:

  • name: metrics-server

image: harbor.magedu.net/baseimages/metrics-server-amd64:v0.3.3 #本地harbor

imagePullPolicy: Always

volumeMounts:

  • name: tmp-dir

mountPath: /tmp

创建metrics-server服务

kubectl apply -f deploy/1.8+/

验证metrics-server pod

在这里插入图片描述

修改controller-manager启动参数

kubectl top nodes

验证metrics-server 是否采集到pod数据:

kubectl top pods -n linux

修改controller-manager启动参数

kube-controller-manager --help | grep horizontal-pod-autoscaler-sync-period

定义pod数量水平伸缩的间隔周期,默认15秒

–horizontal-pod-autoscaler-sync-period duration

vim /etc/systemd/system/kube-controller-manager.service

[Unit]

Description=Kubernetes Controller Manager

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]

ExecStart=/usr/bin/kube-controller-manager \

–address=127.0.0.1 \

–master=http://127.0.0.1:8080 \

–allocate-node-cidrs=true \

–service-cluster-ip-range=10.20.0.0/16 \

–cluster-cidr=172.31.0.0/16 \

–cluster-name=kubernetes \

–cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \

–cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \

–service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \

–root-ca-file=/etc/kubernetes/ssl/ca.pem \

–horizontal-pod-autoscaler-use-rest-clients=true \ --leader-elect=true \

–horizontal-pod-autoscaler-use-rest-clients=true \ #是否使用其他客户端数据

–horizontal-pod-autoscaler-sync-period=10s \ #可选项目,定义数据采集周期间隔时间

–v=2 Restart=on-failure RestartSec=5

[Install]

WantedBy=multi-user.target

重启controller-manager

在这里插入图片描述

2. 通过命令配置扩缩容


kubectl autoscale deployment/linux36-nginx-deployment --min=2 --max=10 --cpu-percent=80 -n linux

验证信息:

kubectl describe deployment/linux36-nginx-deployment -n linux

desired 最终期望处于READY状态的副本数

updated 当前完成更新的副本数

total 总计副本数

available 当前可用的副本数

unavailable 不可用副本数

在这里插入图片描述

3. yaml文件中定义扩缩容配置(HPA)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

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

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

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

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

img

最后

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

image.png

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

updated 当前完成更新的副本数

total 总计副本数

available 当前可用的副本数

unavailable 不可用副本数

在这里插入图片描述

3. yaml文件中定义扩缩容配置(HPA)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

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

[外链图片转存中…(img-sE5f9rGV-1712544559590)]

[外链图片转存中…(img-dOOwEHLv-1712544559590)]

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

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

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

img

最后

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

[外链图片转存中…(img-mwTbOuNF-1712544559590)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

Logo

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

更多推荐