{"id":2710,"date":"2023-02-25T20:00:00","date_gmt":"2023-02-25T12:00:00","guid":{"rendered":"https:\/\/jovepater.com\/?p=2710"},"modified":"2023-03-13T00:26:28","modified_gmt":"2023-03-12T16:26:28","slug":"for-k8s-beginner-ep-8-kubernetes-deployment","status":"publish","type":"post","link":"https:\/\/jovepater.com\/article\/for-k8s-beginner-ep-8-kubernetes-deployment\/","title":{"rendered":"For K8S Beginner EP 8\uff1a\u90e8\u7f72Kubernetes Deployment\uff0c\u4e26\u4f7f\u7528\u7248\u672c\u7ba1\u7406\u8207\u56de\u6efe\u6a5f\u5236"},"content":{"rendered":"\n

Kubernetes Deployment\u7684\u7528\u9014<\/strong><\/h2>\n\n\n\n

Kubernetes\u9664\u4e86\u900f\u904eReplicaSet\u63d0\u4f9b\u9ad8\u53ef\u7528\u6027\u53ca\u63d0\u5347\u670d\u52d9\u5bb9\u91cf\u5916\uff0c\u82e5\u8981\u7ba1\u7406ReplicaSet\u3001\u65b0\u820a\u7248\u672c\u7684ReplicaSet\u8981Roll Back\u6216\u66f4\u65b0\uff0c\u5c31\u9700\u8981\u7528\u5230Kubernetes Deployment\u6a5f\u5236\u3002<\/p>\n\n\n\n

Kubernetes Deployment\u5b98\u65b9\u8aaa\u660e\uff1aLink<\/a><\/p>\n\n\n\n

\u672c\u7bc7\u5c07\u90e8\u7f72\u4e00\u500bDeployment\uff0c\u65b0\u820a\u7248\u672c(\u820a\uff1av1\u3001\u65b0\uff1av2)\u4f7f\u7528\u4e0d\u540c\u7684Image\uff0c\u820a\u7248\u672c(v1)\u4f7f\u7528nginx\uff0c\u65b0\u7248\u672c(v2)\u4f7f\u7528httpd (Apache HTTP Server)\u3002<\/p>\n\n\n

\n
\"Kubernetes<\/figure><\/div>\n\n\n

\u90e8\u7f72Deployment<\/strong><\/h2>\n\n\n\n

\u6b65\u9a5f1\uff1a<\/strong>Deployment\u7684YAML\u5167\u5bb9\u8207ReplicaSet\u57fa\u672c\u4e0a\u53ea\u6709kind\u4e0d\u540c\uff0c\u9700\u6307\u5b9akind\u70baDeployment<\/strong>\u3002<\/p>\n\n\n\n

apiVersion: apps\/v1          # \u540c\u6a23\u662f\u6307\u5b9aapi\u7248\u672c\u70baapps\/v1\nkind: Deployment             # \u6307\u5b9akind\u70baDeployment<\/code><\/pre>\n\n\n\n

\u6b65\u9a5f2\uff1a<\/strong>\u56e0\u70ba\u662f\u76f8\u540c\u7684\u5167\u5bb9\uff0c\u53ea\u6709\u540d\u7a31\u7a0d\u5fae\u8abf\u6574\uff0c\u6240\u4ee5\u9019\u908a\u76f4\u63a5\u63d0\u4f9bYAML\u5167\u5bb9(\u6a94\u540d\u70badeployment.yaml)\uff1a<\/p>\n\n\n

\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: nginx-server-replicaset\n  labels:\n    app: frontend\n    env: production\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  replicas: 2\n  template:\n    metadata:\n      name: nginx-server\n      labels:\n        app: frontend\n    spec:\n      containers:\n        - name: nginx-server\n          image: nginx\n<\/pre><\/div>\n\n\n

\u6b65\u9a5f3\uff1a<\/strong>\u4f7f\u7528kubectl create\u4f86\u90e8\u7f72Deployment\uff1a<\/p>\n\n\n\n

$ kubectl create -f deployment.yaml<\/code><\/pre>\n\n\n
\n
\"kubectl<\/figure><\/div>\n\n\n

\u67e5\u770bKubernetes Deployment<\/strong><\/h2>\n\n\n\n

\u6b65\u9a5f1\uff1a<\/strong>\u4f7f\u7528kubectl get all\uff1a<\/p>\n\n\n

\n# \u9019\u500bDeployment\u7684ReplicaSet\u4e0b\u6709\u5169\u500bPod\nNAME                                           READY   STATUS    RESTARTS   AGE\npod\/nginx-server-deployment-6c6f9cff4f-nz4b4   1\/1     Running   0          2m43s\npod\/nginx-server-deployment-6c6f9cff4f-s2xv8   1\/1     Running   0          2m43s\n\nNAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE\nservice\/kubernetes   ClusterIP   10.96.0.1    <none>        443\/TCP   6d9h\n\n# \u53ef\u4ee5\u770b\u5230\u90e8\u7f72\u4e86\u4e00\u500bDeployment\nNAME                                      READY   UP-TO-DATE   AVAILABLE   AGE\ndeployment.apps\/nginx-server-deployment   2\/2     2            2           2m43s\n\n# \u9084\u6709\u4e00\u500bReplicaSet\nNAME                                                 DESIRED   CURRENT   READY   AGE\nreplicaset.apps\/nginx-server-deployment-6c6f9cff4f   2         2         2       2m43s\n<\/pre><\/div>\n\n\n

\u6b65\u9a5f2\uff1a<\/strong>\u4f7f\u7528kubectl describe\u770b\u4e00\u4e0bDeployment\uff1a<\/p>\n\n\n

\nName:                   nginx-server-deployment\nNamespace:              default\nCreationTimestamp:      Sat, 28 Jan 2023 23:32:26 +0800\nLabels:                 app=frontend\n                        env=production\n# \u986f\u793a\u7248\u672c\u70barevision: 1\uff0c\u5f8c\u9762\u6578\u5b57\u6703\u96a8\u66f4\u65b0\u7684\u6b21\u6578\u7d2f\u52a0\nAnnotations:            deployment.kubernetes.io\/revision: 1\nSelector:               app=frontend\nReplicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable\nStrategyType:           RollingUpdate\nMinReadySeconds:        0\nRollingUpdateStrategy:  25% max unavailable, 25% max surge\nPod Template:\n  Labels:  app=frontend\n  Containers:\n   nginx-server:\n    # \u4f7f\u7528nginx\u9019\u500bimage\n    Image:        nginx\n    Port:         <none>\n    Host Port:    <none>\n    Environment:  <none>\n    Mounts:       <none>\n  Volumes:        <none>\nConditions:\n  Type           Status  Reason\n  ----           ------  ------\n  Available      True    MinimumReplicasAvailable\n  Progressing    True    NewReplicaSetAvailable\nOldReplicaSets:  <none>\nNewReplicaSet:   nginx-server-deployment-67b95b8b9c (2\/2 replicas created)\nEvents:\n  Type    Reason             Age   From                   Message\n  ----    ------             ----  ----                   -------\n  Normal  ScalingReplicaSet  20s   deployment-controller  Scaled up replica set nginx-server-deployment-67b95b8b9c to 2\n<\/pre><\/div>\n\n\n

\u66f4\u65b0\u7248\u672c\uff1a\u6539image\u70bahttpd<\/strong><\/h2>\n\n\n\n

\u6b65\u9a5f1\uff1a<\/strong>\u5c07sepc->template->spec->containers->image\u5f9enginx\u6539\u70bahttpd\uff1a<\/p>\n\n\n

\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: nginx-server-replicaset\n  labels:\n    app: frontend\n    env: production\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  replicas: 2\n  template:\n    metadata:\n      name: nginx-server\n      labels:\n        app: frontend\n    spec:\n      containers:\n        - name: nginx-server\n          image: httpd\n<\/pre><\/div>\n\n\n

\u6b65\u9a5f2\uff1a<\/strong>\u4f7f\u7528kubeclt apply\u4f86\u66f4\u65b0\u9019\u500bdeployment\uff1a<\/p>\n\n\n\n

$ kubectl apply -f deployment.yaml<\/code><\/pre>\n\n\n\n

\u57f7\u884c\u6307\u4ee4\u5f8c\u6703\u986f\u793a\u8b66\u544a\u8a0a\u606f\uff0c\u5982\u4e0b\uff1a<\/p>\n\n\n\n

Warning: resource deployments\/nginx-server-deployment is missing the kubectl.kubernetes.io\/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.\ndeployment.apps\/nginx-server-deployment configured<\/code><\/pre>\n\n\n\n

\u539f\u56e0\u6211\u5011\u5f8c\u9762\u518d\u4f86\u8aaa\u660e\uff0c\u4f46\u5176\u5be6\u7cfb\u7d71\u5df2\u7d93\u5b8c\u6210\u57f7\u884c\u4e86\u3002<\/p>\n\n\n\n

\u6b65\u9a5f3\uff1a<\/strong>\u6b64\u6642\u518d\u4f7f\u7528kubectl describe\u4f86\u67e5\u770bdeployment\uff1a<\/p>\n\n\n

\nName:                   nginx-server-deployment\nNamespace:              default\nCreationTimestamp:      Sat, 28 Jan 2023 23:32:26 +0800\nLabels:                 app=frontend\n                        env=production\n# \u56e0\u70ba\u66f4\u65b0\u904eimage\uff0c\u6240\u4ee5\u7248\u672c\u7d2f\u52a0\u70ba2\nAnnotations:            deployment.kubernetes.io\/revision: 2\nSelector:               app=frontend\nReplicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable\nStrategyType:           RollingUpdate\nMinReadySeconds:        0\nRollingUpdateStrategy:  25% max unavailable, 25% max surge\nPod Template:\n  Labels:  app=frontend\n  Containers:\n   nginx-server:\n    # v2\u8abf\u6574\u70bahttpd\u9019\u500bimage\n    Image:        httpd\n    Port:         <none>\n    Host Port:    <none>\n    Environment:  <none>\n    Mounts:       <none>\n  Volumes:        <none>\nConditions:\n  Type           Status  Reason\n  ----           ------  ------\n  Available      True    MinimumReplicasAvailable\n  Progressing    True    NewReplicaSetAvailable\nOldReplicaSets:  <none>\nNewReplicaSet:   nginx-server-deployment-6c6f9cff4f (2\/2 replicas created)\n# \u6709\u66f4\u591a\u4e8b\u4ef6\uff0c\u986f\u793aPod\u66f4\u65b0image\u7684\u904e\u7a0b\nEvents:\n  Type    Reason             Age    From                   Message\n  ----    ------             ----   ----                   -------\n  Normal  ScalingReplicaSet  6m12s  deployment-controller  Scaled up replica set nginx-server-deployment-67b95b8b9c to 2\n  Normal  ScalingReplicaSet  88s    deployment-controller  Scaled up replica set nginx-server-deployment-6c6f9cff4f to 1\n  Normal  ScalingReplicaSet  84s    deployment-controller  Scaled down replica set nginx-server-deployment-67b95b8b9c to 1 from 2\n  Normal  ScalingReplicaSet  84s    deployment-controller  Scaled up replica set nginx-server-deployment-6c6f9cff4f to 2 from 1\n  Normal  ScalingReplicaSet  80s    deployment-controller  Scaled down replica set nginx-server-deployment-67b95b8b9c to 0 from 1\n<\/pre><\/div>\n\n\n

\u6b65\u9a5f4\uff1a<\/strong>\u900f\u904ekubectl rollout history\u6307\u4ee4\u67e5\u770b\u7248\u672c\u8cc7\u8a0a\uff0c\u4e00\u500bDeployment\u4e4b\u4e0b\u5df2\u7d93\u6709\u5169\u500b\u7248\u672c\uff1a<\/p>\n\n\n\n

$ kubectl rollout history deployment\/nginx-server-deployment<\/code><\/pre>\n\n\n
\n
\"kubectl<\/figure><\/div>\n\n\n

\u8a3b\uff1a\u56e0\u70ba\u6c92\u6709\u7279\u5225\u4e0b\u8a3b\u89e3\uff0c\u6240\u4ee5CHANGE-CAUSE\u6c92\u6709\u5167\u5bb9\u3002<\/p>\n\n\n\n

\u56de\u6efe\u7248\u672c<\/strong><\/h2>\n\n\n\n

\u6b65\u9a5f1\uff1a<\/strong>\u56de\u6efe\u7248\u672c\u7684\u6307\u4ee4\u8a9e\u6cd5\uff1a<\/p>\n\n\n\n

kubectl rollout undo deployment [Deployment\u540d\u7a31] --to-revision=[\u7248\u865f]<\/code><\/pre>\n\n\n\n

\u5728\u6b64\uff0c\u56de\u6efe\u81f3\u820a\u7248(v1)\u6307\u4ee4\u5982\u4e0b\uff1a<\/p>\n\n\n\n

$ kubectl rollout undo deployment nginx-server-deployment --to-revision=1<\/code><\/pre>\n\n\n
\n
\"kubectl<\/figure><\/div>\n\n\n

\u6b65\u9a5f2\uff1a<\/strong>\u4f7f\u7528kubectl describe\u4f86\u67e5\u770b\u662f\u5426\u6709\u56de\u6efe\uff1a<\/p>\n\n\n

\nName:                   nginx-server-deployment\nNamespace:              default\nCreationTimestamp:      Sat, 28 Jan 2023 23:32:26 +0800\nLabels:                 app=frontend\n                        env=production\n# \u56e0\u70ba\u56de\u6efe\u7248\u672c\uff0c\u6240\u4ee5\u7248\u865f\u53c8\u7d2f\u52a0\u52303\uff0c\u53ea\u8981\u6709\u7570\u52d5\uff0c\u5c31\u6703\u4e00\u76f4\u7d2f\u52a0\u4e0a\u53bb\nAnnotations:            deployment.kubernetes.io\/revision: 3\nSelector:               app=frontend\nReplicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable\nStrategyType:           RollingUpdate\nMinReadySeconds:        0\nRollingUpdateStrategy:  25% max unavailable, 25% max surge\nPod Template:\n  Labels:  app=frontend\n  Containers:\n   nginx-server:\n    # image\u5df2\u7d93\u5f9ev2\u7684httpd\u6539\u56dev1\u7684nginx\n    Image:        nginx\n    Port:         <none>\n    Host Port:    <none>\n    Environment:  <none>\n    Mounts:       <none>\n  Volumes:        <none>\nConditions:\n  Type           Status  Reason\n  ----           ------  ------\n  Available      True    MinimumReplicasAvailable\n  Progressing    True    NewReplicaSetAvailable\nOldReplicaSets:  <none>\nNewReplicaSet:   nginx-server-deployment-67b95b8b9c (2\/2 replicas created)\nEvents:\n  Type    Reason             Age   From                   Message\n  ----    ------             ----  ----                   -------\n  Normal  ScalingReplicaSet  25m   deployment-controller  Scaled up replica set nginx-server-deployment-67b95b8b9c to 2\n  Normal  ScalingReplicaSet  21m   deployment-controller  Scaled up replica set nginx-server-deployment-6c6f9cff4f to 1\n  Normal  ScalingReplicaSet  21m   deployment-controller  Scaled down replica set nginx-server-deployment-67b95b8b9c to 1 from 2\n  Normal  ScalingReplicaSet  21m   deployment-controller  Scaled up replica set nginx-server-deployment-6c6f9cff4f to 2 from 1\n  Normal  ScalingReplicaSet  20m   deployment-controller  Scaled down replica set nginx-server-deployment-67b95b8b9c to 0 from 1\n  Normal  ScalingReplicaSet  38s   deployment-controller  Scaled up replica set nginx-server-deployment-67b95b8b9c to 1 from 0\n  Normal  ScalingReplicaSet  34s   deployment-controller  Scaled down replica set nginx-server-deployment-6c6f9cff4f to 1 from 2\n  Normal  ScalingReplicaSet  34s   deployment-controller  Scaled up replica set nginx-server-deployment-67b95b8b9c to 2 from 1\n  Normal  ScalingReplicaSet  30s   deployment-controller  Scaled down replica set nginx-server-deployment-6c6f9cff4f to 0 from 1\n<\/pre><\/div>\n\n\n

~ END ~<\/p>\n\n\n\n


\n\n\n\n
< For K8S Beginner EP 7\uff1a\u900f\u904eKubernetes ReplicaSet\u6a5f\u5236\u90e8\u7f72\u4e00\u7fa4Container<\/a><\/td>For K8S Beginner EP 9\uff1a\u90e8\u7f72Kubernetes Service\u4f86\u63d0\u4f9b\u670d\u52d9<\/a> ><\/td><\/tr><\/tbody><\/table><\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"

Kubernetes Deployment\u63d0\u4f9bPod\u8207ReplicaSet\u7684\u7ba1\u7406\u80fd\u529b\u3002<\/p>\n","protected":false},"author":2,"featured_media":2733,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[191],"tags":[195,116,196],"_links":{"self":[{"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/posts\/2710"}],"collection":[{"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/comments?post=2710"}],"version-history":[{"count":12,"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/posts\/2710\/revisions"}],"predecessor-version":[{"id":2929,"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/posts\/2710\/revisions\/2929"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/media\/2733"}],"wp:attachment":[{"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/media?parent=2710"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/categories?post=2710"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jovepater.com\/wp-json\/wp\/v2\/tags?post=2710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}