写写k8s中的deployments

一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。

你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。

说明:

不要管理 Deployment 所拥有的 ReplicaSet 。 如果存在下面未覆盖的使用场景,请考虑在 Kubernetes 仓库中提出 Issue。

用例

以下是 Deployments 的典型用例:

  • 创建 Deployment 以将 ReplicaSet 上线。ReplicaSet 在后台创建 Pod。 检查 ReplicaSet 的上线状态,查看其是否成功。
  • 通过更新 Deployment 的 PodTemplateSpec,声明 Pod 的新状态 。 新的 ReplicaSet 会被创建,Deployment 以受控速率将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet。 每个新的 ReplicaSet 都会更新 Deployment 的修订版本。
  • 如果 Deployment 的当前状态不稳定,回滚到较早的 Deployment 版本。 每次回滚都会更新 Deployment 的修订版本。
  • 扩大 Deployment 规模以承担更多负载。
  • 暂停 Deployment 的上线 以应用对 PodTemplateSpec 所作的多项修改, 然后恢复其执行以启动新的上线版本。
  • 使用 Deployment 状态来判定上线过程是否出现停滞。
    清理较旧的不再需要的 ReplicaSet 。

下面是一个 Deployment 示例。其中创建了一个 ReplicaSet,负责启动三个 nginx Pod:

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.14.2
        ports:
        - containerPort: 80

  • 通过运行以下命令创建 Deployment
    kubectl apply -f test1.yaml
  • 运行 kubectl get deployments 检查 Deployment 是否已创建
  • 要查看 Deployment 上线状态,运行 kubectl rollout status deployment/nginx-deployment
  • 要查看每个 Pod 自动生成的标签,运行 kubectl get pods --show-labels

说明:
你必须在 Deployment 中指定适当的选择算符和 Pod 模板标签(在本例中为 app: nginx)。 标签或者选择算符不要与其他控制器(包括其他 Deployment 和 StatefulSet)重叠。 Kubernetes 不会阻止你这样做,但是如果多个控制器具有重叠的选择算符, 它们可能会发生冲突执行难以预料的操作。

更新 Deployment

说明:
仅当 Deployment Pod 模板(即 .spec.template)发生改变时,例如模板的标签或容器镜像被更新, 才会触发 Deployment 上线。其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作。

按照以下步骤更新 Deployment:

  • 先来更新 nginx Pod 以使用 nginx:1.16.1 镜像,而不是 nginx:1.14.2 镜像。
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1
  • 要查看上线状态,运行
kubectl rollout status deployment/nginx-deployment
  • 翻转(多 Deployment 动态更新)
    Deployment 控制器每次注意到新的 Deployment 时,都会创建一个 ReplicaSet 以启动所需的 Pod。 如果更新了 Deployment,则控制标签匹配 .spec.selector 但模板不匹配 .spec.template 的 Pod 的现有 ReplicaSet 被缩容。 最终,新的 ReplicaSet 缩放为 .spec.replicas 个副本, 所有旧 ReplicaSets 缩放为 0 个副本。

当 Deployment 正在上线时被更新,Deployment 会针对更新创建一个新的 ReplicaSet 并开始对其扩容,之前正在被扩容的 ReplicaSet 会被翻转,添加到旧 ReplicaSets 列表 并开始缩容。

例如,假定你在创建一个 Deployment 以生成 nginx:1.14.2 的 5 个副本,但接下来 更新 Deployment 以创建 5 个 nginx:1.16.1 的副本,而此时只有 3 个 nginx:1.14.2 副本已创建。在这种情况下,Deployment 会立即开始杀死 3 个 nginx:1.14.2 Pod, 并开始创建 nginx:1.16.1 Pod。它不会等待 nginx:1.14.2 的 5 个副本都创建完成后才开始执行变更动作。

回滚 Deployment

有时,你可能想要回滚 Deployment;例如,当 Deployment 不稳定时(例如进入反复崩溃状态)。 默认情况下,Deployment 的所有上线记录都保留在系统中,以便可以随时回滚 (你可以通过修改修订历史记录限制来更改这一约束)。

  • 说明:
    Deployment 被触发上线时,系统就会创建 Deployment 的新的修订版本。 这意味着仅当 Deployment 的 Pod 模板(.spec.template)发生更改时,才会创建新修订版本 – 例如,模板的标签或容器镜像发生变化。 其他更新,如 Deployment 的扩缩容操作不会创建 Deployment 修订版本。 这是为了方便同时执行手动缩放或自动缩放。 换言之,当你回滚到较早的修订版本时,只有 Deployment 的 Pod 模板部分会被回滚。
  • 检查 Deployment 上线历史
    • 检查 Deployment 修订历史:
 kubectl rollout history deployment/nginx-deployment
  • 要查看修订历史的详细信息
 kubectl rollout history deployment/nginx-deployment --revision=2
  • 回滚到之前的修订版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2

缩放 Deployment

  • 你可以使用如下指令缩放 Deployment:
kubectl scale deployment/nginx-deployment --replicas=10

假设集群启用了Pod 的水平自动缩放, 你可以为 Deployment 设置自动缩放器,并基于现有 Pod 的 CPU 利用率选择要运行的 Pod 个数下限和上限。

kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes(简称K8s)是一个开源的容器编排平台,它可以自动化地部署、扩展和管理容器化的应用程序。K8s使用了一些先进的技术,如容器、微服务、自动化容器编排、负载均衡、自动化伸缩、存储编排、配置管理等。K8s可以帮助您更快、更可靠地构建、发布和管理容器化应用程序。本教程将介绍Kubernetes的基础知识和操作指南,包括K8s集群的安装、部署、管理、维护和优化等方面。 第1章:Kubernetes概述 1.1 什么是KubernetesKubernetes是一个开源的容器编排平台,它可以自动化地部署、扩展和管理容器化的应用程序。Kubernetes可以帮助您更快、更可靠地构建、发布和管理容器化应用程序。Kubernetes是由Google公司开发的,目前已经成为了云原生应用程序开发的标准。 1.2 Kubernetes的优势 Kubernetes具有以下优势: 1. 自动化容器编排:Kubernetes可以自动化地部署、扩展和管理容器化的应用程序,从而提高了应用程序的可靠性和可用性。 2. 负载均衡:Kubernetes可以实现负载均衡,使得应用程序可以更好地处理高流量的请求。 3. 自动化伸缩:Kubernetes可以自动化地根据应用程序的负载进行伸缩,从而提高了应用程序的性能和可用性。 4. 存储编排:Kubernetes可以对存储进行编排,从而使得应用程序可以更好地利用存储资源。 5. 配置管理:Kubernetes可以对应用程序的配置进行管理,从而实现应用程序的快速部署和更新。 6. 可移植性:Kubernetes可以在不同的云平台和数据心之间实现应用程序的快速迁移。 1.3 Kubernetes的核心组件 Kubernetes有以下核心组件: 1. kube-apiserver:提供Kubernetes API的服务。 2. etcd:提供Kubernetes的数据存储服务。 3. kube-scheduler:负责调度容器到合适的节点上运行。 4. kube-controller-manager:负责管理Kubernetes集群的控制器。 5. kubelet:负责在节点上运行容器,并和kube-apiserver通信。 6. kube-proxy:负责在集群实现服务发现和负载均衡。 7. coredns:提供Kubernetes集群的DNS服务。 第2章:Kubernetes的安装 2.1 Kubernetes的安装环境 在安装Kubernetes之前,您需要准备以下环境: 1. 一台或多台运行Linux操作系统的机器。 2. Docker容器引擎。 3. kubeadm工具。 4. kubelet和kubectl命令行工具。 2.2 Kubernetes的安装步骤 以下是Kubernetes的安装步骤: 步骤1:安装Docker 在安装Kubernetes之前,您需要先安装Docker。 您可以使用以下命令安装Docker: sudo apt-get update sudo apt-get install -y docker.io 步骤2:安装kubeadm、kubelet和kubectl 您可以使用以下命令安装kubeadm、kubelet和kubectl: sudo apt-get update sudo apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl 步骤3:初始化Kubernetes Master 您可以使用以下命令初始化Kubernetes Master: sudo kubeadm init --pod-network-cidr=10.244.0.0/16 步骤4:配置Kubernetes网络 您可以使用以下命令配置Kubernetes网络: kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml 步骤5:加入Kubernetes节点 您可以使用以下命令将节点加入Kubernetes集群: sudo kubeadm join <MASTER_IP>:<MASTER_PORT> --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH> 第3章:Kubernetes的部署 3.1 Kubernetes的部署方式 Kubernetes可以通过以下几种方式部署: 1. 手动部署:您可以手动编写YAML文件来部署Kubernetes应用程序。 2. Helm部署:Helm是一个开源的Kubernetes包管理器,它可以帮助您更简单、更方便地部署Kubernetes应用程序。 3. Operator部署:Operator是一种Kubernetes扩展机制,它可以帮助您更自动化、更可靠地部署Kubernetes应用程序。 3.2 手动部署Kubernetes应用程序 以下是手动部署Kubernetes应用程序的步骤: 步骤1:创建Deployment 您可以使用以下命令创建Deployment: kubectl create deployment <DEPLOYMENT_NAME> --image=<IMAGE_NAME> 步骤2:创建Service 您可以使用以下命令创建Service: kubectl expose deployment <DEPLOYMENT_NAME> --port=<PORT> --target-port=<TARGET_PORT> --type=<SERVICE_TYPE> 步骤3:创建Ingress 如果您需要在Kubernetes实现HTTP或HTTPS服务,您可以使用以下命令创建Ingress: kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.39.2/deploy/static/provider/cloud/deploy.yaml 步骤4:验证应用程序 您可以使用以下命令验证应用程序: kubectl get pods kubectl get services kubectl get ingress 3.3 Helm部署Kubernetes应用程序 以下是使用Helm部署Kubernetes应用程序的步骤: 步骤1:安装Helm 您可以使用以下命令安装Helm: curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash 步骤2:添加Helm存储库 您可以使用以下命令添加Helm存储库: helm repo add stable https://charts.helm.sh/stable 步骤3:安装Chart 您可以使用以下命令安装Chart: helm install <RELEASE_NAME> stable/<CHART_NAME> 步骤4:验证应用程序 您可以使用以下命令验证应用程序: kubectl get pods kubectl get services 3.4 Operator部署Kubernetes应用程序 以下是使用Operator部署Kubernetes应用程序的步骤: 步骤1:安装Operator SDK 您可以使用以下命令安装Operator SDK: curl https://sdk.operatorframework.io/sh/latest | sh 步骤2:创建Operator 您可以使用以下命令创建Operator: operator-sdk init --domain=<YOUR_DOMAIN> --repo=<YOUR_REPOSITORY> operator-sdk create api --group=<YOUR_GROUP> --version=<YOUR_VERSION> --kind=<YOUR_KIND> 步骤3:部署Operator 您可以使用以下命令部署Operator: kubectl create -f deploy/operator.yaml 步骤4:验证应用程序 您可以使用以下命令验证应用程序: kubectl get pods kubectl get services 第4章:Kubernetes的管理 4.1 Kubernetes的管理方式 Kubernetes可以通过以下几种方式进行管理: 1. 命令行管理:您可以使用kubectl命令行工具来管理Kubernetes集群。 2. Kubernetes Dashboard:Kubernetes Dashboard是一个Web界面,它可以帮助您更方便地管理Kubernetes集群。 3. Prometheus和Grafana:Prometheus和Grafana是一组开源的监控工具,它们可以帮助您更好地监控Kubernetes集群。 4. Istio:Istio是一个开源的服务网格,它可以帮助您更好地管理Kubernetes应用程序。 4.2 命令行管理Kubernetes集群 以下是使用命令行管理Kubernetes集群的常用命令: 1. 查看节点:kubectl get nodes 2. 查看Pods:kubectl get pods 3. 查看Services:kubectl get services 4. 查看Deployments:kubectl get deployments 5. 查看Ingress:kubectl get ingress 6. 查看ConfigMaps:kubectl get configmaps 7. 查看Secrets:kubectl get secrets 8. 查看Events:kubectl get events 4.3 Kubernetes Dashboard管理Kubernetes集群 以下是使用Kubernetes Dashboard管理Kubernetes集群的步骤: 步骤1:安装Kubernetes Dashboard 您可以使用以下命令安装Kubernetes Dashboard: kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml 步骤2:创建管理员用户 您可以使用以下命令创建管理员用户: kubectl create serviceaccount dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin 步骤3:访问Kubernetes Dashboard 您可以使用以下命令访问Kubernetes Dashboard: kubectl proxy 然后,您可以在浏览器访问以下URL: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 步骤4:登录Kubernetes Dashboard 在访问Kubernetes Dashboard时,您需要使用刚才创建的管理员用户进行登录。 4.4 Prometheus和Grafana监控Kubernetes集群 以下是使用Prometheus和Grafana监控Kubernetes集群的步骤: 步骤1:安装Prometheus Operator 您可以使用以下命令安装Prometheus Operator: kubectl create -f https://raw.githubusercontent.com/coreos/prometheus-operator/v0.39.0/bundle.yaml 步骤2:安装Grafana 您可以使用以下命令安装Grafana: kubectl create -f https://raw.githubusercontent.com/grafana/grafana/master/deploy/kubernetes/grafana.yaml 步骤3:配置Prometheus和Grafana 您可以使用以下命令配置Prometheus和Grafana: kubectl apply -f https://raw.githubusercontent.com/coreos/kube-prometheus/master/manifests/setup/prometheus-operator-0servicemonitorCustomResourceDefinition.yaml kubectl apply -f https://raw.githubusercontent.com/coreos/kube-prometheus/master/manifests/setup/prometheus-operator-0prometheusrulesCustomResourceDefinition.yaml kubectl apply -f https://raw.githubusercontent.com/coreos/kube-prometheus/master/manifests/setup/prometheus-operator-0prometheusrules.yaml kubectl apply -f https://raw.githubusercontent.com/coreos/kube-prometheus/master/manifests/setup/prometheus-operator-0prometheusrulefilesCustomResourceDefinition.yaml 步骤4:验证Prometheus和Grafana 您可以使用以下命令验证Prometheus和Grafana: kubectl get pods -n monitoring kubectl get services -n monitoring 步骤5:访问Grafana 在访问Grafana时,您需要使用以下命令获取Grafana的密码: kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo 然后,您可以在浏览器访问以下URL: http://localhost:3000/ 步骤6:配置Grafana面板 您可以在Grafana配置面板,从而更好地监控Kubernetes集群。 4.5 Istio管理Kubernetes应用程序 以下是使用Istio管理Kubernetes应用程序的步骤: 步骤1:安装Istio 您可以使用以下命令安装Istio: curl -L https://istio.io/downloadIstio | sh - cd istio-1.10.2 export PATH=$PWD/bin:$PATH istioctl install --set profile=demo 步骤2:部署应用程序 您可以使用以下命令部署应用程序: kubectl apply -f <YOUR_APPLICATION_FILE> 步骤3:配置Istio 您可以使用以下命令配置Istio: kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.10/samples/bookinfo/platform/kube/bookinfo.yaml kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.10/samples/bookinfo/networking/bookinfo-gateway.yaml 步骤4:验证应用程序 您可以使用以下命令验证应用程序: istioctl analyze kubectl get pods kubectl get services kubectl get ingress 第5章:Kubernetes的维护 5.1 Kubernetes的维护方式 Kubernetes可以通过以下几种方式进行维护: 1. 升级Kubernetes:您可以通过升级Kubernetes来获得更好的性能和更多的功能。 2. 备份和恢复Kubernetes:您可以通过备份和恢复Kubernetes来保证Kubernetes集群的可靠性和可用性。 3. 扩容和缩容Kubernetes:您可以通过扩容和缩容Kubernetes来实现更好的性能和更好的负载均衡。 5.2 升级Kubernetes 以下是升级Kubernetes的步骤: 步骤1:备份Kubernetes 在升级Kubernetes之前,您需要先备份Kubernetes。 步骤2:升级Kubernetes Master 您可以使用以下命令升级Kubernetes Master: sudo apt-get update sudo apt-get install -y kubeadm=<VERSION> kubelet=<VERSION> kubectl=<VERSION> sudo kubeadm upgrade plan sudo kubeadm upgrade apply <VERSION> 步骤3:升级Kubernetes节点 您可以使用以下命令升级Kubernetes节点: sudo apt-get update sudo apt-get install -y kubelet=<VERSION> kubectl=<VERSION> sudo systemctl daemon-reload sudo systemctl restart kubelet 5.3 备份和恢复Kubernetes 以下是备份和恢复Kubernetes的步骤: 步骤1:备份etcd数据 您可以使用以下命令备份etcd数据: sudo ETCDCTL_API=3 etcdctl snapshot save /var/lib/etcd/snapshot.db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key 步骤2:恢复etcd数据 您可以使用以下命令恢复etcd数据: sudo systemctl stop kube-apiserver sudo systemctl stop kube-controller-manager sudo systemctl stop kube-scheduler sudo systemctl stop etcd sudo mv /var/lib/etcd /var/lib/etcd.backup sudo ETCDCTL_API=3 etcdctl snapshot restore /var/lib/etcd/snapshot.db \ --data-dir=/var/lib/etcd \ --initial-cluster=<ETCD_INITIAL_CLUSTER> \ --initial-cluster-token=<ETCD_INITIAL_CLUSTER_TOKEN> \ --initial-advertise-peer-urls=https://<ETCD_INITIAL_ADVERTISE_PEER_URLS>:2380 \ --name=<ETCD_NAME> \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --cacert=/etc/kubernetes/pki/etcd/ca.crt sudo systemctl start etcd sudo systemctl start kube-scheduler sudo systemctl start kube-controller-manager sudo systemctl start kube-apiserver 步骤3:备份Kubernetes配置 您可以使用以下命令备份Kubernetes配置: sudo tar cvzf /path/to/backup/kubernetes-backup.tar.gz /etc/kubernetes 步骤4:恢复Kubernetes配置 您可以使用以下命令恢复Kubernetes配置: sudo systemctl stop kubelet sudo rm -rf /etc/kubernetes/* sudo tar xvzf /path/to/backup/kubernetes-backup.tar.gz -C / sudo systemctl start kubelet 5.4 扩容和缩容Kubernetes 以下是扩容和缩容Kubernetes的步骤: 步骤

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值