k8sdeployment

一、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,有且只有一个