K8S学习之操作Deployment常用命令

本文详细介绍了Kubernetes中的Deployment,包括其作为Pod和ReplicaSet更新的声明式方式、控制器模型的工作原理、滚动更新的实现、常用命令以及如何进行升级、回滚、扩缩容和暴露服务。同时,还提供了实战操作步骤和相关命令,帮助读者深入理解和掌握Deployment的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • 内容介绍

    Deployment为Pod和Replica Set提供声明式更新

    注意:Deployment是通过replicaset来管理pod的,您不该手动管理由 Deployment 创建的 Replica Set,否则您就篡越了 Deployment controller 的职责

  • 作用

    1. 定义一组Pod期望数量,Controller会维持Pod数量与期望数量一致

    2. 配置Pod的发布方式,controller会按照给定的策略更新Pod,保证更新过程中不可用Pod维持在限定数量范围内;

    3. 如果发布有问题支持回滚

原理

控制器模型

  • 内容介绍

    在Kubernetes架构中,有一个叫做kube-controller-manager的组件。这个组件,是一系列控制器的集合。其中每一个控制器,都以独有的方式负责某种编排功能。而Deployment正是这些控制器中的一种。它们都遵循Kubernetes中一个通用的编排模式,即:控制循环

    
    
        for {
            实际状态 := 获取集群中对象X的实际状态
            期望状态 := 获取集群中对象X的期望状态
            if 实际状态 == 期望状态 {
                什么都不做
            }else{
                执行编排动作,将实际状态调整为期望状态
            }
        }
    
    

    在具体实现中,实际状态往往来自于Kubernetes集群本身。如:

    1. Kubelet通过心跳汇报的容器状态和节点状态;
    2. 监控系统中保存的应用监控数据;
    3. 控制器主动收集的它感兴趣的信息,这些都是常见的实际状态的来源;

    期望状态一般来自用户提交的YAML文件,这些信息都保存在Etcd中

  • Deployment控制器实现

    1. Deployment Controller从Etcd中获取到所有携带 “app:nginx” 标签的Pod,然后统计它们的数量,这就是实际状态;

    2. Deployment对象的replicas的值就是期望状态;

    3. Deployment Controller将两个状态做比较,然后根据比较结果,确定是创建Pod,还是删除已有Pod

滚动更新

  • 内容介绍

    Deployment滚动更新的实现,依赖的是Kubernetes中的ReplicaSet,因为Deployment控制器实际操纵的,就是Replicas对象,而不是Pod对象

    Deployment、pod和service关系

    Pod被ReplicaSet管理,ReplicaSet控制pod的数量;ReplicaSet被Deployment管理,Deployment控制pod应用的升级、回滚,当然也能控制pod的数量。Service提供一个统一固定入口,负责将前端请求转发给Pod

  • ReplicaSet

    ReplicaSet负责通过“控制器模式”,保证系统中Pod的个数永远等于指定的个数。这也正是Deployment只允许容器的restartPolicy=Always的主要原因:只有容器能保证自己始终是running状态的前提下,ReplicaSet调整Pod的个数才有意义。

  • Deployment

    Deployment同样通过控制器模式,操作ReplicaSet的个数和属性,进而实现“水平扩展/收缩”和“滚动更新”两个编排动作,对于“水平扩展/收缩”的实现,Deployment Controller只需要修改replicas的值即可。用户执行这个操作的指令如下:

    
        kubectl scale deployment nginx-deployment --replicas=4
    
    
    

常用命令

启动minikube



    minikube start


定义yaml文件

  • 文件内容

    
    
        apiVersion: apps/v1
        kind: Deployment
        metadata:
        name: nginx-deployment
        labels:
            app: nginx
        spec:
        replicas: 3
        selector:
            matchLabels:
            app: nginx
        template:
            metadata:
            labels:
                app: nginx
            spec:
            containers:
            - name: nginx
                image: nginx:1.12.2
                ports:
                - containerPort: 80
    
     # 在一个yaml文件中通过 --- 分割多个资源对象
    
  • 注意事项

    您必须在部署中指定适当的选择器和 Pod 模板标签(在本例中为app: nginx)。

    不要将标签(labels)或选择器(selectors)与其他控制器(包括其他Deployments 和 StatefulSet)重叠。Kubernetes 不会阻止您重叠,如果多个控制器具有重叠的选择器,这些控制器可能会发生冲突并出现意外行为。

    在一个yaml文件中可以通过 — 分割多个资源对象

创建deployment



    # 基于yaml创建deployment资源
    kubectl apply -f nginx.yml
    kubectl create -f deployment.yaml

    # 基于命令创建 deployment(通过 kuectl run 命令来创建一个 deployment)
    ## nginx-deploy 创建 deployment 的名字
    ## --image : 指定使用的镜像
    ## --port=80 :容器暴露的端口,该端口只能在 K8S 集群中访问
    ## --dry-run=true : 检测语法是否错误,不会正在创建
    kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --dry-run=true
    kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 



    # 创建并验证
    kubectl create -f deployment_nginx.yml
    kubectl get deployment
    kubectl get rs
    kubectl get pods

创建Deployment结果验证

查看deployment


    # 查看deployment资源
    ## 查看名为 nginx-deployment 的 deployment 的状态(由粗 -> 细)
    kubectl get deployment

    kubectl get deployment -o wide

    kubectl describe deployment nginx-deployment


查看deployment状态

升级deployment

    
    # 更新名称为nginx-deployment的deloyment的镜像版本
    kubectl set image deployment nginx-deployment nginx=nginx:1.13
    kubectl get deployment
    kubectl get deployment -o wide
    kubectl get pods

deployment镜像版本升级验证

查看历史deployment


    kubectl rollout history deployment nginx-deployment
    kubectl rollout status deployment nginx-deployment

回滚deployment

    
    # 通过--to-revision指定回滚到特定的修订如:--to-revision=2
    kubectl rollout undo deployment nginx-deployment

扩缩容deployment


    # 扩容
    kubectl scale deployment nginx-deployment --replicas=5
    
    # 如果是缩容,把对应的副本数设置的比当前的副本数小即可
    # 另外,还可以针对当前的副本数目做条件限制,比如当前副本数是5则进行缩容至副本数目为3
    kubectl scale --current-replicas=5 --replicas=3 deployment nginx-deployment

    # 基于CPU的使用率创建3-10个pod
    kubectl autoscale deployment nginx-deployment --min=3 --max=10 --cpu_percent=80


暴露deployment

  • 内容介绍

    其实就是把端口暴露在minikube

  • 操作命令

    
        kubectl get node
        kubectl get node -o wide
        kubectl expose deployment nginx-deployment --type=NodePort
    
        # 然后通过kubectl get services -o wide来查看被随机映射的端口
        ## 查看node节点暴露的端口30960 
        kubectl get svc
    
        #进入minikube查看ip地址192.168.99.100
        minikube ssh
    
    

    暴露depoloyment端口
    minikube暴露端口验证

    浏览器输入192.168.99.100:30960验证响应结果

删除deployment

    
    # 删除deployment资源(基于yaml)
    kubectl delete -f nginx.yml
    

参数解释


    Name deployment 名

    Namespace 命名空间

    CreationTimestamp 创建时间

    Labels 标签

    Annotations 注释

    Selector 调度规则

    Replicas 副本

    StrategyType 策略类型

    MinReadySeconds 最小准备时间

    RollingUpdateStrategy 滚动更新策略

    Pod Template pod模板

    Conditions 条件

    OldReplicaSets 旧的副本数

    NewReplicaSets 新的副本数

    Events: Deployment的执行日志


参考链接

  • Deployments

    https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

  • k8s之Deployment详解

    https://blog.csdn.net/lixinkuan328/article/details/103993274

  • K8s常用命令合集

    https://zhuanlan.zhihu.com/p/88994751

  • Kubernetes资源对象Pod、ReplicaSet、Deployment、Service之间的关系

    https://blog.csdn.net/u010606397/article/details/90752262

<think>嗯,用户想了解Kubernetesk8s)的常用命令,我需要整理一个清晰的结构来帮助他。首先,我应该回忆一下k8s的基础命令,比如集群管理、资源查看这些部分。然后考虑用户可能的场景,比如他可能是一个刚入门的管理员或者开发者,需要部署应用、调试问题,所以命令需要覆盖这些方面。 接下来,我需要分门别类地组织这些命令。通常,k8s的命令可以分为集群管理、资源操作、调试与日志、配置管理、扩展与自动伸缩、网络相关、存储管理这几个大类。每个类别下再列出常用命令和示例。 要注意用户提到的格式要求,行内数学表达式用$...$,但这里可能不太涉及数学公式,不过要确保所有的代码或命令行参数正确,比如用反引号包裹。同时,中文回答,结构清晰,分步骤说明。 可能还需要提醒用户注意权限问题,比如有些命令需要特定权限,或者不同命名空间的影响。此外,补充一些常用技巧,比如别名设置,这样能提升用户的使用效率。 另外,用户可能不仅需要命令列表,还需要一些解释,比如每个命令的作用和参数的意义。例如,kubectl get pods 是查看Pod,而-n指定命名空间。这样用户更容易理解何时使用这些命令。 最后,检查是否有遗漏的常用命令,比如滚动更新、回滚、端口转发这些操作,都是日常管理中会用到的。确保覆盖全面,同时不过于冗长,保持简洁明了。</think>以下为Kubernetesk8s常用命令的整理,按照功能分类说明: --- ### 一、集群管理 1. **查看集群信息** ```bash kubectl cluster-info ``` 2. **查看节点状态** ```bash kubectl get nodes ``` 3. **查看集群版本** ```bash kubectl version ``` --- ### 二、资源操作 1. **查看资源** ```bash kubectl get <资源类型> # 例如:kubectl get pods kubectl get pods -n <命名空间> # 指定命名空间 kubectl get deployments --all-namespaces # 查看所有命名空间的Deployment ``` 2. **描述资源详情** ```bash kubectl describe <资源类型>/<名称> # 例如:kubectl describe pod/nginx ``` 3. **创建/更新资源** ```bash kubectl apply -f <yaml文件> # 通过YAML文件创建或更新资源 ``` 4. **删除资源** ```bash kubectl delete <资源类型>/<名称> # 例如:kubectl delete deployment/nginx kubectl delete -f <yaml文件> # 通过YAML文件删除资源 ``` --- ### 三、调试与日志 1. **查看Pod日志** ```bash kubectl logs <pod名称> -n <命名空间> kubectl logs -f <pod名称> # 实时跟踪日志 ``` 2. **进入Pod执行命令** ```bash kubectl exec -it <pod名称> -- /bin/sh # 进入Pod的Shell环境 ``` 3. **端口转发** ```bash kubectl port-forward <pod名称> <本地端口>:<Pod端口> # 例如:kubectl port-forward nginx 8080:80 ``` --- ### 四、配置管理 1. **查看当前配置** ```bash kubectl config view ``` 2. **切换上下文(集群/用户)** ```bash kubectl config use-context <上下文名称> ``` --- ### 五、扩展与自动伸缩 1. **手动扩展Deployment副本数** ```bash kubectl scale deployment/<名称> --replicas=3 ``` 2. **自动扩缩容(HPA)** ```bash kubectl autoscale deployment/<名称> --min=2 --max=5 --cpu-percent=80 ``` --- ### 六、网络相关 1. **查看Service** ```bash kubectl get services ``` 2. **暴露Service** ```bash kubectl expose deployment/<名称> --type=NodePort --port=80 ``` --- ### 七、存储管理 1. **查看PersistentVolume(PV)** ```bash kubectl get pv ``` 2. **查看PersistentVolumeClaim(PVC)** ```bash kubectl get pvc ``` --- ### 常用技巧 1. **别名简化命令** ```bash alias k="kubectl" # 后续可用 k get pods 代替 kubectl get pods ``` 2. **查看资源简写** ```bash kubectl api-resources # 列出所有资源的缩写(如po=pods, svc=services) ``` 3. **格式化输出** ```bash kubectl get pods -o wide # 显示详细信息 kubectl get pods -o json # JSON格式输出 kubectl get pods -o yaml # YAML格式输出 ``` --- ### 注意事项 1. **命名空间**:默认操作`default`命名空间,使用`-n`指定其他命名空间 2. **权限问题**:部分命令需要`ClusterRole`权限 3. **上下文切换**:多集群环境下需注意当前操作的集群 建议通过`kubectl --help`查看子命令帮助文档,例如`kubectl get --help`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值