一、deployment
1、为什么需要这个呢?
-
之前创建的单个pod,如果删除了就不会再次创建了,就直接没了,就是不是控制器创建pod
-
但是deployment的创建的pod,如果被删除了,可以再次创建pod,这样就保证了高可用了(避免一个pod坏掉了)
2、deployment副本
-
deployment通过副本数量来创建pod
-
是通过标签来进行管理pod
-
**查看k8s中的api资源
bash
[root@k-master deploy]# kubectl api-resources
3、deployment创建
1、kubectl create
- kubectl create deploy名字 --image --replicas
bash
[root@k-master deploy]# kubectl create deployment web1 --image nginx --replicas 3 --dry-run=client -o yaml > d1.yaml
[root@k-master deploy]# vim d1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web1
name: web1
spec:
replicas: 3
selector: # 管理的pod
matchLabels:
app: web1 # 关联这个web1标签的pod
strategy: {}
template: # pod的模版配置
metadata: # pod的元数据配置
creationTimestamp: null
labels:
app: web1 # pod的标签
spec: # pod的容器配置
containers:
- image: nginx
name: nginx
resources: {}
status: {}
# selector选择的就是app=web1的pod
[root@k-master deploy]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web1 1/3 3 1 33s nginx nginx app=web1
# READY 中 前一个数字表示有几个pod准备好了,后面一个数字表示一共有几个pod
# pod标签都是app=web1
[root@k-master deploy]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
web1-74b86ff946-6vv5g 1/1 Running 0 2m app=web1,pod-template-hash=74b86ff946
web1-74b86ff946-p924k 1/1 Running 0 2m app=web1,pod-template-hash=74b86ff946
web1-74b86ff946-q9rm8 1/1 Running 0 2m app=web1,pod-template-hash=74b86ff946
- 删除3个pod,都会被重新创建出来
bash
[root@k-master deploy]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web1-74b86ff946-bw2d2 1/1 Running 0 116s
web1-74b86ff946-p924k 1/1 Running 0 5m35s
web1-74b86ff946-q9rm8 1/1 Running 0 5m35s
[root@k-master deploy]# kubectl delete pod web1-74b86ff946-{bw2d2,p924k,q9rm8}
pod "web1-74b86ff946-bw2d2" deleted
pod "web1-74b86ff946-p924k" deleted
pod "web1-74b86ff946-q9rm8" deleted
[root@k-master deploy]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web1-74b86ff946-7kwqg 1/1 Running 0 5s
web1-74b86ff946-b9pbf 1/1 Running 0 5s
web1-74b86ff946-hlwlk 1/1 Running 0 5s
4、修改副本数
1、在线修改
bash
[root@k-master deploy]# kubectl edit deployments.apps web1
deployment.apps/web1 edited
[root@k-master deploy]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web1-74b86ff946-b9pbf 1/1 Running 0 106s
web1-74b86ff946-hlwlk 1/1 Running 0 106s
# 将replicas修改成2,就会减少一个pod
2、命令行修改
bash
[root@k-master deploy]# kubectl scale deployment --replicas 3 web1
deployment.apps/web1 scaled
[root@k-master deploy]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web1-74b86ff946-b9pbf 1/1 Running 0 3m35s
web1-74b86ff946-hlwlk 1/1 Running 0 3m35s
web1-74b86ff946-xwh6m 1/1 Running 0 8s
3、修改yaml文件
bash
[root@k-master deploy]# kubectl apply -f d1.yaml
deployment.apps/web1 configured
[root@k-master deploy]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web1-74b86ff946-b9pbf 1/1 Running 0 4m16s
web1-74b86ff946-hlwlk 1/1 Running 0 4m16s
5、HPA(弹性伸缩)
1、什么是hpa
-
业务高峰之前,自动的常见更多的pod
-
业务低峰时,自动的释放pod资源
-
创建一个hpa,自动的检测cpu,内存这些指标的话,就自动的调节
-
需要安装这个metrics这个软件,自动检测的
bash
[root@k-master deploy]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k-master 105m 5% 1315Mi 34%
k-node1 48m 2% 875Mi 23%
k-node2 53m 2% 740Mi 19%
[root@k-master ~]# kubectl top pod
NAME CPU(cores) MEMORY(bytes)
web1-74b86ff946-b9pbf 0m 2Mi
web1-74b86ff946-hlwlk 0m 2Mi
2、hpa实验
- 首先创建deployment,然后创建hpa监控deployment这样的话,就能检测到了,这样就能弹性伸缩了
1、命令行创建hpa
bash
# 针对的是deploy,最小数量是1,最大数量是4
[root@k-master deploy]# kubectl autoscale deployment web1 --min 1 --max 4
horizontalpodautoscaler.autoscaling/web1 autoscaled
2、常见的问题
bash
[root@k-master deploy]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 <unknown>/80% 1 4 2 109s
# 为什么一直保持unkonwn呢,因为这deployment创建的时候,没有限制cpu和内存的资源,因此的话就hpa就呈现一个unknown的状态了
[root@k-master deploy]# kubectl describe hpa web1
Name: web1
Namespace: default
Labels: <none>
Annotations: autoscaling.alpha.kubernetes.io/conditions:
[{"type":"AbleToScale","status":"True","lastTransitionTime":"2025-08-01T12:22:53Z","reason":"SucceededGetScale","message":"the HPA control...
CreationTimestamp: Fri, 01 Aug 2025 20:22:38 +0800
Reference: Deployment/web1
Target CPU utilization: 80%
Current CPU utilization: <unknown>%
Min replicas: 1
Max replicas: 4
Deployment pods: 2 current / 0 desired
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedGetResourceMetric 61s (x2 over 91s) horizontal-pod-autoscaler failed to get cpu utilization: missing request for cpu in container nginx of Pod web1-74b86ff946-hlwlk
Warning FailedComputeMetricsReplicas 61s (x2 over 91s) horizontal-pod-autoscaler invalid metrics (1 invalid out of 1), first error is: failed to get cpu resource metric value: failed to get cpu utilization: missing request for cpu in container nginx of Pod web1-74b86ff946-hlwlk
Warning FailedGetResourceMetric 1s (x6 over 106s) horizontal-pod-autoscaler failed to get cpu utilization: missing request for cpu in container nginx of Pod web1-74b86ff946-b9pbf
Warning FailedComputeMetricsReplicas 1s (x6 over 106s) horizontal-pod-autoscaler invalid metrics (1 invalid out of 1), first error is: failed to get cpu resource metric value: failed to get cpu utilization: missing request for cpu in container nginx of Pod web1-74b86ff946-b9pbf
[root@k-master deploy]#
# 获取cpu初始化失败了
4、解决方法
bash
[root@k-master deploy]# cat d1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web1
name: web1
spec:
replicas: 2
selector:
matchLabels:
app: web1
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web1
spec:
containers:
- image: nginx
name: nginx
resources: # 对pod做了资源限制
requests:
cpu: 300m # 最多cpu只能用300m
status: {}
[root@k-master deploy]# kubectl apply -f d1.yaml
deployment.apps/web1 created
[root@k-master deploy]# kubectl scale deployment --replicas 1 web1
deployment.apps/web1 scaled
# 创建hpa,cpu利用百分比为80%
[root@k-master deploy]# kubectl autoscale deployment web1 --min 1 --max 3 --cpu-percent 80
horizontalpodautoscaler.autoscaling/web1 autoscaled
[root@k-master deploy]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 0%/80% 1 3 1 16s
# 当cpu的利用率超过了80%就会触发扩容
# 300*80%就会被触发,也就是超过240就会被处罚
# 低于的话就会触发缩容
5、模拟超过了这个阈值
bash
# 进入pod里面去,测试
root@web1-6bcbc9cc97-scrt2:~# cat /dev/zero > /dev/null &
[1] 42
root@web1-6bcbc9cc97-scrt2:~# cat /dev/zero > /dev/null &
[2] 43
[root@k-master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 635%/80% 1 3 1 12m
[root@k-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web1-6bcbc9cc97-gr8xd 1/1 Running 0 9s
web1-6bcbc9cc97-scrt2 1/1 Running 0 14m
web1-6bcbc9cc97-tnqdw 0/1 ContainerCreating 0 9s
-
外部测试
-
创建一个svc,可以通过物理主机访问容器
bash
[root@k-master deploy]# kubectl expose deployment web1 --port 80 --target-port 80 --type=NodePort
service/web1 exposed
[root@k-master deploy]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
web1 NodePort 10.110.89.182 <none> 80:31550/TCP 2s
# svc有一个虚拟端口,集群内部访问的端口,其他pod可以通过这个来进行访问通信
[root@k-master deploy]# kubectl describe svc web1
Name: web1
Namespace: default
Labels: app=web1
Annotations: <none>
Selector: app=web1
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.110.89.182
IPs: 10.110.89.182
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 31550/TCP
Endpoints: 10.244.82.146:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
-
创建svc的访问流程
-
外部用户请求访问主机+端口
-
service接收流量,通过kube-proxy将请求转发到后端pod(具有标签的)
-
pod处理请求,流量到达容器的80端口
-
-
下载一个httpd软件包,里面有一个ab压力测试工具
bash
[root@k-master deploy]# ab -t 600 -n 100000 -c 1000 http://192.168.50.100:31550/index.html
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.50.100 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests # 完成了9w次的请求
[root@k-master ~]# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 0%/80% 1 5 1 34m
web1 Deployment/web1 110%/80% 1 5 1 35m
# 自动创建pod
[root@k-master ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 8m9s
web1-6bcbc9cc97-nhchd 1/1 Running 0 18m
web1-6bcbc9cc97-74sjn 0/1 Pending 0 0s
web1-6bcbc9cc97-74sjn 0/1 Pending 0 0s
web1-6bcbc9cc97-74sjn 0/1 ContainerCreating 0 0s
web1-6bcbc9cc97-74sjn 0/1 ContainerCreating 0 1s
web1-6bcbc9cc97-74sjn 1/1 Running 0 3s
# 压力减小后,过一段时间会自动的缩减
3、yaml创建hpa实验
6、镜像升级与回滚
1、在线修改
bash
[root@k-master deploy]# kubectl edit deployments.apps web1
deployment.apps/web1 edited
spec:
containers:
- image: nginx:1.9 # 修改镜像数据即可
imagePullPolicy: Always
[root@k-master deploy]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web1 1/1 1 1 45m nginx nginx:1.9 app=web1
2、通过yaml文件修改
bash
[root@k-master deploy]# kubectl apply -f d1.yaml
deployment.apps/web1 configured
[root@k-master deploy]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web1 2/2 2 2 46m nginx nginx app=web1
3、通过命令行修改
bash
[root@k-master deploy]# kubectl set image deploy web1 nginx=nginx:1.9
deployment.apps/web1 image updated
[root@k-master deploy]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web1 1/1 1 1 47m nginx nginx:1.9 app=web1
4、回滚
- kubectl rollout命令
bash
status 显示当前升级的状态
history 显示升级的历史记录
pause 暂停版本升级
resume 继续已经暂停的版本升级过程
restart 重启版本升级过程
undo 回滚到上一级版本 (--to-revison 回滚到指定版本)
bash
# 设置镜像的时候需要打个标记
[root@k-master deploy]# kubectl set image deploy web1 nginx=nginx:latest --record=true
Flag --record has been deprecated, --record will be removed in the future
[root@k-master deploy]# kubectl rollout history deployment web1
deployment.apps/web1
REVISION CHANGE-CAUSE
3 <none>
4 <none>
5 kubectl set image deploy web1 nginx=nginx:latest --record=true
# 对之前进行撤销操作
# 就变成了1.9了
[root@k-master deploy]# kubectl rollout undo deployment web1
deployment.apps/web1 rolled back
[root@k-master deploy]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web1 1/1 1 1 51m nginx nginx:1.9 app=web1
# 更加精确的撤销,指定版本的话
[root@k-master deploy]# kubectl rollout undo deployment web1 --to-revision=5
deployment.apps/web1 rolled back
[root@k-master deploy]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web1 1/1 1 1 52m nginx nginx:latest app=web1
7、滚动升级
-
maxsurge 一次升级多少个
-
maxunavailable 一次性删除几个
-
默认是先删除25%个,然后再创建25%个
bash
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: web1
strategy: # 这个字段控制
rollingUpdate:
maxSurge: 25% # 默认是25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: web1
8、金丝雀发布
-
在对deployment更新过程中,暂停或继续更新的操作
-
比如有一批新的pod创建后,立即暂停更新的操作,此时,有以少数部分是新版的应用,主题是旧版本的应用,然后测试一下新的版本应用,看是否能够如期的方式运行,如果可以的话,就需要完成pod的滚动更新,否则立即回滚
二、其他控制器
1、daemonset
- 每个节点上面都必须创建一个pod,有且只有一个