k8s基本使用入门-了解deployments
官网的介绍地址:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
一个部署控制器提供声明更新 pods 和 ReplicaSets。
您在 Deployment 对象中描述了所需的状态,Deployment 控制器以受控速率将实际状态更改为所需状态。您可以定义 “部署” 以创建新的 ReplicaSet,或者删除现有的部署并使用新的部署采用所有资源。
注意:您不应管理部署所拥有的 ReplicaSet。应该通过操作 Deployment 对象来涵盖所有用例。如果您的用例未在下面介绍,请考虑在主 Kubernetes 存储库中打开一个问题。
同样,我们首先来看一个对应类型的 yaml 文件。
[root@master deployment]$cat deployment_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 #replicas指的是replicaset,定义了3个数目。
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12.2 #定义镜像,这个地方随便指定了一个版本1.12.2
ports:
- containerPort: 80
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
接下来创建一下:
[root@master deployment]$kubectl create -f deployment_nginx.yml
deployment.apps "nginx-deployment" created
2
使用 deployments 之后,管理方式也随之变化:
[root@master deployment]$kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 7s
2
3
当然,也可以使用其他方式查看到:
[root@master deployment]$kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 7s
[root@master deployment]$kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7498dc98f8 3 3 3 1m
[root@master deployment]$kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7498dc98f8-2hhvg 1/1 Running 0 1m
nginx-deployment-7498dc98f8-gljq6 1/1 Running 0 1m
nginx-deployment-7498dc98f8-l5xns 1/1 Running 0 1m
2
3
4
5
6
7
8
9
10
11
这里可以做一个简单的有意思的小对比,可以看到,越往上层,名称越简化,又一次,曾经我提出过的,提取公因式法
又出现了,看到在 pods 里边的时候,每个 pod 的名称区别在于最后的那几位随机数,而到 rs 这一层,则甩掉后边的几位数,提取了前边相同的,变成nginx-deployment-7498dc98f8
,再到 deployments 当中,数字也去掉了,直接变成了nginx-deployment
。
现在还回到正规的管理来查看:
[root@master deployment]$kubectl get deployment -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3 3 3 3 5m nginx nginx:1.12.2 app=nginx
2
3
动态扩容管理。命令很相像的。
[root@master deployment]$kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 11s
[root@master deployment]$kubectl scale deployment nginx-deployment --replicas=5
deployment.extensions "nginx-deployment" scaled
[root@master deployment]$kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 5 5 5 5 1m
[root@master deployment]$kubectl scale deployment nginx-deployment --replicas=2
deployment.extensions "nginx-deployment" scaled
[root@master deployment]$kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 2 2 2 2 2m
2
3
4
5
6
7
8
9
10
11
12
13
升级的试验。
这里可以通过一些指令直接针对 pod 当中的容器进行替换,从而实现升级。
[root@master deployment]$kubectl set image deployment nginx-deployment nginx=nginx:1.13
deployment.apps "nginx-deployment" image updated
2
发现返回值没有问题。
那么查看一下过程:
[root@master deployment]$kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7498dc98f8 3 3 3 9m
nginx-deployment-86cd46c4d9 1 1 0 13s
[root@master deployment]$kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7498dc98f8 1 1 1 9m
nginx-deployment-86cd46c4d9 3 3 2 18s
[root@master deployment]$kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7498dc98f8 0 0 0 9m
nginx-deployment-86cd46c4d9 3 3 3 22s
[root@master deployment]$kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-86cd46c4d9-gbrdx 1/1 Running 0 11s
nginx-deployment-86cd46c4d9-hs7bf 1/1 Running 0 26s
nginx-deployment-86cd46c4d9-mpwtr 1/1 Running 0 12s
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
这个过程,完成记录了此 deployment 偷梁换柱(更改镜像)的过程,并且新的 pod 也成功 run 起来了。那么来查看一下,是否真的如操作所预想的:
[root@master deployment]$kubectl get deployment -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3 3 3 3 10m nginx nginx:1.13 app=nginx
2
3
这里可以看到,我们一开始定义的版本是 1.12.2,现在已经变成了 1.13 了。这些操作过的流程,也会被记录下来,可以通过如下指令进行查看:
[root@master deployment]$kubectl rollout history deployment nginx-deployment
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 <none>
2 <none>
2
3
4
5
看到有两次的历史记录。现在,更神奇的操作来了,我们可以直接将版本回归到第一次部署时的版本,而不需要其他外部的任何动作。
[root@master deployment]$kubectl rollout undo deployment nginx-deployment
deployment.apps "nginx-deployment"
[root@master deployment]$kubectl get deployment -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3 3 3 3 19m nginx nginx:1.12.2 app=nginx
2
3
4
5
除了感慨之外,还能说啥呢,以往在这种升级以及回滚的事情上,绞尽脑汁,费尽精力,现在,一切 so easy。
现在再去看一下历史:
[root@master deployment]$kubectl rollout history deployment nginx-deployment
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
2 <none>
3 <none>
2
3
4
5
发现 1 被覆盖了,就会这样的轮替,以后再进行发布以及回滚,都非常的方便了。
现在,简单说一下网络的事儿,上边有留下过一个疑问,就是如何将 pod 的端口妥善的映射到宿主机上来,这时可以通过如下指令:
[root@master deployment]$kubectl expose deployment nginx-deployment --type=NodePort
service "nginx-deployment" exposed
2
这个时候其实是使用了 service 这个概念,下边会详细了解,接着来查看一下:
[root@master deployment]$kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23h
nginx-deployment NodePort 10.111.172.137 <none> 80:32188/TCP 22s
2
3
4
可以看到刚刚定义的这个 NodePort,将内部的 80 端口映射到了集群的 32188 端口上来,现在就可以通过集群 IP+32188 来访问了。