k8s——depolyment的部署(管理服务类容器)
kubernetes作为容器编排引擎,最重要也是最基本的功能当然是运行容器化应用deployment(部署)kubernetes通过各种controller来管理pod的生命周期,为了满足不同的业务场景,kubernetes开发了多种,我们先学习最常用的deployment运行deployment#部署两个副本的 nginx-deployment,容器的image为nginx:1.7.9...
kubernetes作为容器编排引擎,最重要也是最基本的功能当然是运行容器化应用
deployment(部署)
kubernetes通过各种controller来管理pod的生命周期,为了满足不同的业务场景,kubernetes开发了多种,我们先学习最常用的deployment
运行deployment
#部署两个副本的 nginx-deployment,容器的image为nginx:1.7.9
[k8s@server1 ~]$ kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-deployment created
#通过kubectl get deployment命令查看nginx-deployment的状态,显示输出的两个副本正常运行
[k8s@server1 ~]$ kubectl get deployment nginx-deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 2m31s
获取更详细的信息
[k8s@server1 ~]$ kubectl describe deployment nginx-deployment
#这里告诉我们创建了一个 replicaset(容器副本) nginx-deployment-748ff87d9d
#Events是 deployment的日志,记录了replicaset的启动过程
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 3m24s deployment-controller Scaled up replica set nginx-deployment-748ff87d9d to 2
[k8s@server1 ~]$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
nginx-deployment-748ff87d9d 2 2 2 16m
[k8s@server1 ~]$ kubectl describe replicaset nginx-deployment-748ff87d9d
Name: nginx-deployment-748ff87d9d
Namespace: default
Selector: pod-template-hash=748ff87d9d,run=nginx-deployment
Labels: pod-template-hash=748ff87d9d
run=nginx-deployment
Annotations: deployment.kubernetes.io/desired-replicas: 2
deployment.kubernetes.io/max-replicas: 3
deployment.kubernetes.io/revision: 1
#指明replicaset是由Deployment/nginx-deployment创建的
Controlled By: Deployment/nginx-deployment
Replicas: 2 current / 2 desired
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: pod-template-hash=748ff87d9d
run=nginx-deployment
Containers:
nginx-deployment:
Image: nginx:1.7.9
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 16m replicaset-controller Created pod: nginx-deployment-748ff87d9d-bxc8r
Normal SuccessfulCreate 16m replicaset-controller Created pod: nginx-deployment-748ff87d9d-25k5w
两个副本处于running状态
[k8s@server1 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-748ff87d9d-25k5w 1/1 Running 0 17m
nginx-deployment-748ff87d9d-bxc8r 1/1 Running 0 17m
查看详细信息
[k8s@server1 ~]$ kubectl describe pod nginx-deployment-748ff87d9d-25k5w
Name: nginx-deployment-748ff87d9d-25k5w
Namespace: default
Priority: 0
Node: server3/172.25.0.3
Start Time: Sat, 24 Aug 2019 14:52:14 +0800
Labels: pod-template-hash=748ff87d9d
run=nginx-deployment
Annotations: <none>
Status: Running
IP: 10.244.2.3
Controlled By: ReplicaSet/nginx-deployment-748ff87d9d
Containers:
nginx-deployment:
Container ID: docker://1c3dcd7cabea668eb5e947a1fbf9bf5b8837220c52b32e75eced9e198b4c3149
Image: nginx:1.7.9
Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
Port: <none>
Host Port: <none>
State: Running
Started: Sat, 24 Aug 2019 14:54:44 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-zt8dv (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-zt8dv:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-zt8dv
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
# 记录了pod的启动过程,如果操作失败(eg:image不存在),也可以在这里查到原因
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 20m default-scheduler Successfully assigned default/nginx-deployment-748ff87d9d-25k5w to server3
Normal Pulling 20m kubelet, server3 Pulling image "nginx:1.7.9"
Normal Pulled 18m kubelet, server3 Successfully pulled image "nginx:1.7.9"
Normal Created 18m kubelet, server3 Created container nginx-deployment
Normal Started 18m kubelet, server3 Started container nginx-deployment
总结一下这个过程
- 1.用户通过kubectl创建deployment
- 2.deployment创建replicaset
- 3.replicaset创建pod
删除之前的资源
kubectl delete deployment nginx-deployment
[k8s@server1 ~]$ kubectl get pod
No resources found in default namespace.
[k8s@server1 ~]$ kubectl get pod -o wide
No resources found.
Kubernetes支持两种创建资源的方式
(1)用kubectl命令直接创建
比如“kubectl run nginx-deployment --image=nginx:1.7.9–replicas=2”,在命令行中通过参数指定资源的属性
(2)通过配置文件和kubectl apply创建。
要完成前面同样的工作,可执行命令“kubectl apply -f nginx.yml”
现在编辑一个简单的文件创建容器
注意不要加减空格!!!(如正确的话:vim 打开文件 关键字是蓝色的)
最近由于k8s 摒弃了apiVersion:extensions/v1beta1导致现在很多以前可以成功的操作而现在无法成功
[k8s@server1 ~]$ cat nginx.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.7.9
修改排错
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.7.9
[k8s@server1 ~]$ kubectl apply -f nginx.yml
error: error validating "nginx.yml": error validating data: ValidationError(Deployment.spec): missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors, turn validation off with --validate=false
[k8s@server1 ~]$ kubectl apply -f nginx.yml
deployment.extensions/nginx-deployment created
apiVersion | 当前配置格式的版本 |
---|---|
kind | 要创建的资源类型,这里是Deployment |
metadata | 该资源的元数据,name是必需的元数据项 |
spec | 部分该Deployment的规格说明 |
replicas | 指明副本数量,默认为1 |
template | 定义Pod的模板,这是配置文件的重要部分 |
metadata | 定义Pod的元数据,至少要定义一个label。label的key和value可以任意指定 |
spec | 描述Pod的规格,此部分定义Pod中每一个容器的属性,name和image是必需的 |
查看详细信息
[k8s@server1 ~]$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 2m8s
[k8s@server1 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5d76d6897d-cwvj5 1/1 Running 0 2m24s 10.244.2.4 server3 <none> <none>
nginx-deployment-5d76d6897d-md8x5 1/1 Running 0 2m24s 10.244.1.4 server2 <none> <none>
# 要删除资源:执行kubectl delete deployment nginx-deployment(命令行方式 )或者kubectl delete -f nginx.yml
伸缩
伸缩是指在线增加或减少Pod的副本数
Replication Controller(RC)是Kubernetes中的另一个核心概念,应用托管在Kubernetes之后,Kubernetes需要保证应用能够持续运行,这是RC的工作内容,它会确保任何时间Kubernetes中都有指定数量的Pod在运行。在此基础上,RC还提供了一些更高级的特性,比如滚动升级、升级回滚等
Deployment nginx-deployment初始是两个副本
[k8s@server1 ~]$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 2m8s
[k8s@server1 ~]$ kubectl get pod -o wide #查看pods所在的运行节点
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5d76d6897d-cwvj5 1/1 Running 0 2m24s 10.244.2.4 server3 <none> <none>
nginx-deployment-5d76d6897d-md8x5 1/1 Running 0 2m24s 10.244.1.4 server2 <none> <none>
server2和server3上各自跑了一个副本,现在修改nginx.yml文件,将副本改成5个
[k8s@server1 ~]$ cat nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 5
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.7.9
再次执行kubectl apply
[k8s@server1 ~]$ kubectl apply -f nginx.yml
deployment.extensions/nginx-deployment configured
[k8s@server1 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5d76d6897d-ckj64 1/1 Running 0 11s 10.244.2.5 server3 <none> <none>
nginx-deployment-5d76d6897d-cwvj5 1/1 Running 0 6m5s 10.244.2.4 server3 <none> <none>
nginx-deployment-5d76d6897d-d8fx2 1/1 Running 0 11s 10.244.1.5 server2 <none> <none>
nginx-deployment-5d76d6897d-md8x5 1/1 Running 0 6m5s 10.244.1.4 server2 <none> <none>
nginx-deployment-5d76d6897d-rnb9s 1/1 Running 0 11s 10.244.1.6 server2 <none> <none>
# 三个新副本被创建并调度到server2和server3上
接下来修改配置文件,将副本数减少为3个,重新执行kubectl apply
#注意的是:关闭和启动是需要时间的
[k8s@server1 ~]$ cat nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.7.9
[k8s@server1 ~]$ kubectl apply -f nginx.yml
deployment.extensions/nginx-deployment configured
[k8s@server1 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5d76d6897d-ckj64 1/1 Running 0 2m39s 10.244.2.5 server3 <none> <none>
nginx-deployment-5d76d6897d-cwvj5 1/1 Running 0 8m33s 10.244.2.4 server3 <none> <none>
nginx-deployment-5d76d6897d-d8fx2 0/1 Terminating 0 2m39s 10.244.1.5 server2 <none> <none>
nginx-deployment-5d76d6897d-md8x5 1/1 Running 0 8m33s 10.244.1.4 server2 <none> <none>
nginx-deployment-5d76d6897d-rnb9s 0/1 Terminating 0 2m39s 10.244.1.6 server2 <none> <none>
[k8s@server1 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5d76d6897d-ckj64 1/1 Running 0 2m56s 10.244.2.5 server3 <none> <none>
nginx-deployment-5d76d6897d-cwvj5 1/1 Running 0 8m50s 10.244.2.4 server3 <none> <none>
nginx-deployment-5d76d6897d-md8x5 1/1 Running 0 8m50s 10.244.1.4 server2 <none> <none>
1.1.5 Failover
出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。如果希望将k8s-master也当作Node使用,可以执行如下命令
kubectl taint node k8s-master node-role.kubernetes.io/master-
如果要恢复Master Only状态,执行如下命令:
kubectl taint node k8s-master node-role.kubernetes.io/master="":NoSchedul
pod 和 deployment 的关系是什么 ?
1.创建pod的时候一定会创建 deployment 么 ?
2.创建deployment的时候一定会创建 pod么?
pod是可以单独创建并进行生命周期管理的
单独创建pod的时候就不会有deployment出现,但是创建deployment的时候一定会创建pod,因为pod是一个基础的单位。
任何的控制器单位的具体实现必须落到pod去实现
下面我们模拟k8s-node1(server2)故障,关闭该节点
[root@server2 ~]# halt -h
Connection to 172.25.0.2 closed by remote host.
[k8s@server1 ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
server1 Ready master 5h7m v1.15.3
server2 NotReady <none> 4h38m v1.15.3
server3 Ready <none> 4h37m v1.15.3
等待一段时间,Kubernetes会检查到k8s-node2不可用,将k8s-node2上的Pod标记为Unknown状态,并在k8s-node2上新创建两个Pod,维持总副本数为3
当k8s-node2恢复后,Unknown的Pod会被删除,不过已经运行的Pod不会重新调度回k8s-node2
# 下面的过程会漫长一些
#一定要等待一定的时间的
[k8s@server1 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5d76d6897d-4mwqw 1/1 Running 0 2m57s 10.244.2.10 server3 <none> <none>
nginx-deployment-5d76d6897d-ckj64 1/1 Running 1 22m 10.244.2.6 server3 <none> <none>
nginx-deployment-5d76d6897d-cwvj5 1/1 Running 1 28m 10.244.2.7 server3 <none> <none>
nginx-deployment-5d76d6897d-md8x5 1/1 Terminating 1 28m 10.244.1.7 server2 <none> <none>
nginx-deployment-5d76d6897d-n6t9x 1/1 Running 0 2m57s 10.244.2.8 server3 <none> <none>
nginx-deployment-5d76d6897d-ps4xb 1/1 Terminating 0 8m58s 10.244.1.9 server2 <none> <none>
nginx-deployment-5d76d6897d-qhj85 1/1 Running 0 2m57s 10.244.2.9 server3 <none> <none>
nginx-deployment-5d76d6897d-tm4wr 1/1 Terminating 0 8m58s 10.244.1.8 server2 <none> <none>
Pod的生命周期过程包括:通过模板进行定义,然后分配到一个Node上运行,就不会离开这个Node,直到被删除。当某个Pod失败,首先会被Kubernetes清理掉,之后ReplicationController将会在其它机器上(或本机)重建Pod,重建之后Pod的ID发生了变化,那将会是一个新的Pod。所以,Kubernetes中Pod的迁移,实际指的是在新Node上重建Pod
用label控制Pod的位置
RC与Pod的关联是通过Label来实现的。Label机制是Kubernetes中的一个重要设计,通过Label进行对象的弱关联,可以灵活地进行分类和选择
默认配置下,Scheduler会将Pod调度到所有可用的Node。不过有些情况我们希望将Pod部署到指定的Node,比如将有大量磁盘I/O的Pod部署到配置了SSD的Node;或者Pod需要GPU,需要运行在配置了GPU的节点上
Kubernetes是通过label来实现这个功能的 label是key-value对,各种资源都可以设置label,灵活添加各种自定义属性
比如执行如下命令标注k8s-node1是配置了SSD的节点
[k8s@server1 ~]$ kubectl label node server2 disktype=ssd
node/server2 labeled
# 然后通过kubectl get node --show-labels查看节点的label
[k8s@server1 ~]$ kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
server1 Ready master 5h32m v1.15.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
server2 Ready <none> 5h2m v1.15.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=server2,kubernetes.io/os=linux
server3 Ready <none> 5h1m v1.15.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server3,kubernetes.io/os=linux
# disktype=ssd已经成功添加到k8s-node1,除了disktype,Node还有几个Kubernetes自己维护的labe
有了disktype这个自定义label,接下来就可以指定将Pod部署到k8s-node1(server2)。编辑nginx.yml
# 在Pod模板的spec里通过nodeSelector指定将此Pod部署到具有label disktype=ssd的Node上
[k8s@server1 ~]$ cat nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 6
selector:
matchLabels:
app: web_server
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.7.9
nodeSelector:
disktype: ssd
部署Deployment并查看Pod的运行节点
[k8s@server1 ~]$ kubectl apply -f nginx.yml
deployment.extensions/nginx-deployment created
[k8s@server1 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-56bf7c59b8-4nvdm 1/1 Running 0 8s 10.244.1.12 server2 <none> <none>
nginx-deployment-56bf7c59b8-5gxr4 1/1 Running 0 8s 10.244.1.15 server2 <none> <none>
nginx-deployment-56bf7c59b8-d2sp6 1/1 Running 0 8s 10.244.1.10 server2 <none> <none>
nginx-deployment-56bf7c59b8-hct8s 1/1 Running 0 8s 10.244.1.14 server2 <none> <none>
nginx-deployment-56bf7c59b8-nmlmx 1/1 Running 0 8s 10.244.1.11 server2 <none> <none>
nginx-deployment-56bf7c59b8-t4b2m 1/1 Running 0 8s 10.244.1.13 server2 <none> <none>
# 全部6个副本都运行在server2上,符合我们的预期
要删除 label disktype,执行如下命令
[k8s@server1 ~]$ kubectl label node server2 disktype-
node/server2 labeled
在nginx.yml中删除nodeSelector设置,然后通过kubectl apply重新部署
[k8s@server1 ~]$ cat nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 6
selector:
matchLabels:
app: web_server
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.7.9
#删除是需要一定的时间的,会删除之前创建的容器
[k8s@server1 ~]$ kubectl apply -f nginx.yml
deployment.extensions/nginx-deployment configured
[k8s@server1 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5b5dfcc76-66gpx 1/1 Running 0 3s 10.244.1.10 server3 <none> <none>
nginx-deployment-5b5dfcc76-6jl6j 1/1 Running 0 2s 10.244.1.12 server3 <none> <none>
nginx-deployment-5b5dfcc76-98j5b 1/1 Running 0 3s 10.244.1.11 server3 <none> <none>
nginx-deployment-5b5dfcc76-9j8x5 0/1 ContainerCreating 0 1s <none> server2 <none> <none>
nginx-deployment-5b5dfcc76-rbssj 0/1 ContainerCreating 0 1s <none> server2 <none> <none>
nginx-deployment-5b5dfcc76-wwd6w 1/1 Running 0 3s 10.244.2.13 server2 <none> <none>
nginx-deployment-7bb8d48dd6-2l4ms 0/1 Terminating 0 70s 10.244.2.9 server2 <none> <none>
nginx-deployment-7bb8d48dd6-d77l7 1/1 Running 0 70s 10.244.2.7 server2 <none> <none>
nginx-deployment-7bb8d48dd6-fnm4t 1/1 Terminating 0 70s 10.244.2.12 server2 <none> <none>
nginx-deployment-7bb8d48dd6-gdcq8 0/1 Terminating 0 70s 10.244.2.10 server2 <none> <none>
nginx-deployment-7bb8d48dd6-jbpwv 1/1 Terminating 0 70s 10.244.2.8 server2 <none> <none>
nginx-deployment-7bb8d48dd6-tm5tc 1/1 Terminating 0 70s 10.244.2.11 server2 <none> <none>
[k8s@server1 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5d76d6897d-7xxxh 1/1 Running 0 9s 10.244.1.16 server2 <none> <none>
nginx-deployment-5d76d6897d-mwp6d 1/1 Running 0 7s 10.244.2.14 server3 <none> <none>
nginx-deployment-5d76d6897d-sfkbt 1/1 Running 0 8s 10.244.2.12 server3 <none> <none>
nginx-deployment-5d76d6897d-tbmtt 1/1 Running 0 9s 10.244.2.11 server3 <none> <none>
nginx-deployment-5d76d6897d-vmn28 1/1 Running 0 8s 10.244.2.13 server3 <none> <none>
nginx-deployment-5d76d6897d-whdbv 1/1 Running 0 6s 10.244.1.17 server2 <none> <none>
# Kubernetes会删除之前的Pod并调度和运行新的Pod
更多推荐
所有评论(0)