(五)k8s--(pod)Pod 的状态,init-pod,restartPolicy,limit限制 ,调度过程, 探针 ,调整Pod数量(HPA控制器)
这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!!《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!数updated 当前完成更新的副本数total 总计副本数available 当前可用的副本数unavailable 不可用副本数3. yaml文件中定义扩缩容配置(HPA)
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 将在没有接收到任何流量的情况下启动,并且只有在探针探测成功后才开始接收流量。
[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
=======================================================================
对指定的端口和路径上的容器的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
在容器内执行指定命令。如果命令退出时返回码为 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状态如下
对指定容器端口的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
===============================================================================
在高峰期间需要扩容,低峰缩容(节省成本)
kubectl scale
对运行在k8s 环境中的pod 数量进行扩容(增加)或缩容(减小)。
-
改yaml文件改replicas数量
-
在dashboard改deployment的pdo值
-
通过kubectl scale命令
kubectl scale deployment linux39-tomcat-app1-deployment --replicas=3 -n linux
- 通过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
==================================================================================
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
使用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
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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档
祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!
感谢大家的支持!!
《一线大厂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获取)
最后
这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档
祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!
感谢大家的支持!!
[外链图片转存中…(img-mwTbOuNF-1712544559590)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
更多推荐
所有评论(0)