kubernetes常用命令

控制器

Deployment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# nginx-deployment.yaml
$ vim nginx-deployment.yaml
apiVersion: apps/v1 # 1.11版本之后
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 # 3个副本
selector:
matchLabels:
app: nginx # 与template.metadata.labels一致
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80

创建Deployments

  • record参数设置为true,在Deployment revision时方便命令记录,以及在describe时能够看到Annotations中指令记录
1
2
$ kubectl create -f nginx-deployment.yaml --record
deployment "nginx-deployment" created

查看发布历史记录

  • rollout 字面是上线意思,我理解为发布.

替换metadata.name,即上面文件中的nginx-deployment名称.

1
2
3
4
5
6
7
8
9
10
# kubectl rollout history deployment/[metadata.name]
$ kubectl rollout history deployment/nginx-deployment
# 如果在创建Deployments时没有使用--record,没有命令记录.
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 <none>
# 如果在创建时指定--record,会有命令记录.
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl create --filename=nginx-deployment.yaml --record=true

查看历史版本的具体信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ kubectl rollout history deployment/nginx-deployment --revision=1
deployments "nginx-deployment" with revision #1
Pod Template:
Labels: app=nginx
pod-template-hash=2777190766
Annotations: kubernetes.io/change-cause=kubectl create --filename=nginx-deployment.yaml --record=true
Containers:
nginx:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>

查看Deployments

1
2
3
4
5
$ kubectl get deployment [metadata.name](可选)
# 不指定deployment的名字将查询全部的deployments.如下:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-node-deployment 1 1 1 1 17m
nginx-deployment 1 1 1 1 4m

查看RS(ReplicaSet)

1
2
3
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-966857787 1 1 1 5m

更新Deployments(自动rollout)

1
2
3
4
5
6
# 方式一,修改文件中的spec.template.spec.containers[0].image值
kubectl edit deployment/[metadata.name]
$ kubectl edit deployment/nginx-deployment
# 方式二
kubectl set image deployment [metadata.name] [spec.spec.containers.name]=镜像名称
$ kubectl set image deployment nginx-deployment nginx=nginx:1.7.9

查看发布状态

1
2
3
4
5
6
7
8
9
10
# kubectl rollout status deployment/[metadata.name]
$ kubectl rollout status deployment/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out

查看deployment详细信息

  • 关注Events,记录了发布的过程.实际是创建了一个新的ReplicaSet->nginx-deployment-6ccc5f4cbb,然后逐渐下原来的ReplicaSet->nginx-deployment-966857787的Pod.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# kubectl describe deployment/[metadata.name]
$ kubectl describe deployment/nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Tue, 21 Aug 2018 15:18:18 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision=2
kubernetes.io/change-cause=kubectl create --filename=nginx-deployment.yaml --record=true
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.7.9
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-6ccc5f4cbb (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 4m deployment-controller Scaled up replica set nginx-deployment-966857787 to 3
Normal ScalingReplicaSet 3m deployment-controller Scaled up replica set nginx-deployment-6ccc5f4cbb to 1
Normal ScalingReplicaSet 3m deployment-controller Scaled down replica set nginx-deployment-966857787 to 2
Normal ScalingReplicaSet 3m deployment-controller Scaled up replica set nginx-deployment-6ccc5f4cbb to 2
Normal ScalingReplicaSet 3m deployment-controller Scaled down replica set nginx-deployment-966857787 to 1
Normal ScalingReplicaSet 3m deployment-controller Scaled up replica set nginx-deployment-6ccc5f4cbb to 3
Normal ScalingReplicaSet 3m deployment-controller Scaled down replica set nginx-deployment-966857787 to 0

版本回退

  • 回滚之后,revision对应记录就会消失

  • undo是回滚到上一个版本的操作.

    假设有三个版本:nginx:1.4.7, nginx:1.7.9, nginx:1.9.7, nginx:1.10.3,当前版本为nginx:1.10.3.

    1、假如指定to-revision回滚到1.7.9版本,再执行undo(不指定to-revision),则恢复到1.10.3版本.

    2、第一次执行undo(不指定to-revision),回滚到1.9.7版本,再次执行undo(不指定to-revision),则恢复到1.10.3版本.

    3、第一次指定to-revision回滚到1.7.9,第二次指定to-revision回滚到1.9.7,第三次指定to-revision回滚到1.4.7,第四次指定undo(不指定to-revison),则是回滚到1.9.7.

假设有三个版本:nginx:1.7.9,nginx:1.9.7,nginx:1.10.3,当前版本为nginx:1.10.3.

1
2
3
4
5
6
7
# 查看发布历史记录
$ kubectl rollout history deployment/nginx-deployment
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl create --filename=nginx-deployment.yaml --record=true
2 kubectl create --filename=nginx-deployment.yaml --record=true
3 kubectl create --filename=nginx-deployment.yaml --record=true

第一次执行undo回退到前一个版本,即nginx:1.9.7.如果第二次再执行,又会回滚到原版本,即nginx:1.10.3.

1
2
3
4
5
6
7
8
9
# kubectl rollout undo deployment/[metatdata.name]
$ kubectl rollout undo deployment/nginx-deployment
deployment.extensions/nginx-deployment
# 这里查看下发布历史记录,发现revision为3的记录消失了.
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl create --filename=nginx-deployment.yaml --record=true
2 kubectl create --filename=nginx-deployment.yaml --record=true
4 kubectl create --filename=nginx-deployment.yaml --record=true

指定to-revision回退到指定历史

1
2
3
4
# kubectl rollout undo deployment/[metadata.name] --to-revision=[number]
$ kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment.extensions/nginx-deployment
# 这里如果执行undo但不指定--to-revision,则恢复导原来版本.

Deployment扩容

指定 扩容/缩容 副本数量

1
2
3
4
5
6
7
8
9
# kubectl scale deployment/[metadata.name] --replicas=[number]
$ kubectl scale deployment/nginx-deployment --replicas=6
deployment.extensions/nginx-deployment scaled
# 查看扩容状态
$ kubectl rollout status deployment/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 3 of 6 updated replicas are available...
Waiting for deployment "nginx-deployment" rollout to finish: 4 of 6 updated replicas are available...
Waiting for deployment "nginx-deployment" rollout to finish: 5 of 6 updated replicas are available...
deployment "nginx-deployment" successfully rolled out

当集群启用horizontal pod autoscaling后,可以根据CPU利用率,在范围内扩容或缩容.(todo还不知道怎么做)

1
2
$ $ kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80
deployment "nginx-deployment" autoscaled

设置Deployments发布历史记录

在nginx-deployment.yaml中设置spec.revisionHistoryLimits属性,默认是保留全部历史记录.可以不用去理会.

设置Deployments发布策略

spec.strategy 指定新的Pod替换旧的Pod的策略。 spec.strategy.type 可以是Recreate或者是 RollingUpdateRollingUpdate是默认值。

  • Recreate 指在创建出新的Pod之前会杀掉已经存在的Pod.(强烈建议不使用)
  • RollingUpdate 指滚动升级.逐步一个一个交替升级.可以指定maxUnavailablemaxSurge 来控制 rolling update 进程。
    • maxUnavaiables .spec.strategy.rollingUpdate.maxUnavailable指定在升级的过程中不可用的Pod数量.默认为1,也可以设置为百分比.如设置为30%,则原来的ReplicaSet会立刻缩容到70%.
    • maxSurge .spec.strategy.rollingUpdate.maxSurge指定在升级过程中,新老Pod的总数的最大值.如设置为30%,启动rolling update后新的ReplicatSet将会立即扩容,新老Pod的总数不能超过期望的Pod数量的130%。

Pause设置

.spec.paused是可以可选配置项,boolean值。默认为false.

如果设置paused后,对Deployment中的PodTemplateSpec的修改都不会触发新的rollout。

后续需要学习

如何在集群中启用了horizontal pod autoscaling

参考

Kubernetes apis

坚持原创技术分享,您的支持将鼓励我继续创作!
Fork me on GitHub