一、Controller(控制器)
在k8s集群中,用于管理和运行容器的对象,也称之工作负载(workload)。如Deployment、DaemonSet、Job、StatefulSet等。
二、Pod和Controller的关系
Pod通过Controller来实现应用的运维,如伸缩、滚动升级。
如在Controller中,
selector:
matchLabels:
app: nginx
Pod中,
template:
labels:
app: nginx
两者之间通过label标签来建立关系。
三、Deployment控制器的应用场景
部署无状态应用(web应用、微服务)
管理Pod和ReplicaSet
滚动升级(回退)应用
四、通过Deployment控制器进行应用部署的示例
kubectl create deployment web --image=nginx --dry-run=client -o yaml > web.yaml
kubectl apply -f web.yaml
[root@master-146 ~]# kubectl create deployment web --image=nginx --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web-svc -o yaml
kubectl apply -f web-svc.yaml
[root@master-146 ~]# kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web-svc -o yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2021-07-24T06:49:30Z"
labels:
app: web
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:labels:
.: {}
f:app: {}
f:spec:
f:externalTrafficPolicy: {}
f:ports:
.: {}
k:{"port":80,"protocol":"TCP"}:
.: {}
f:port: {}
f:protocol: {}
f:targetPort: {}
f:selector:
.: {}
f:app: {}
f:sessionAffinity: {}
f:type: {}
manager: kubectl
operation: Update
time: "2021-07-24T06:49:30Z"
name: web-svc
namespace: default
resourceVersion: "248889"
selfLink: /api/v1/namespaces/default/services/web-svc
uid: b0a781e7-6811-4cb3-85d1-f01cec5c2734
spec:
clusterIP: 10.108.132.128
externalTrafficPolicy: Cluster
ports:
- nodePort: 31999
port: 80
protocol: TCP
targetPort: 80
selector:
app: web
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
结果如下:
[root@master-146 ~]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/web-5dcb957ccc-qljjr 1/1 Running 0 33m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 38h
service/ngnix NodePort 10.103.94.181 <none> 80:30608/TCP 30h
service/web-svc NodePort 10.99.61.243 <none> 80:32170/TCP 33m
访问web界面:nodeIp:32170
[root@master-146 ~]# curl -I worker-144:32170
HTTP/1.1 200 OK
Server: nginx/1.21.1
Date: Sat, 24 Jul 2021 08:18:39 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 06 Jul 2021 14:59:17 GMT
Connection: keep-alive
ETag: "60e46fc5-264"
Accept-Ranges: bytes
五、应用升级回滚
spec:
replicas: 2
template:
spec:
containers:
- image: nginx:1.14
修改yaml中这部分参数,设置2个副本,镜像版本设置为1.14,再次执行这个yaml,此时会调度2个pod到相应节点。
[root@master-146 ~]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web 2/2 1 2 76m nginx nginx:1.14 app=web
应用升级:kubectl set image deployment web nginx=nginx:1.15
[root@master-146 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-bbcf684cb-mnjh5 1/1 Running 0 4m22s 10.244.1.14 worker-145 <none> <none>
web-bbcf684cb-qn4zw 1/1 Running 0 4m55s 10.244.2.13 worker-144 <none> <none>
[root@master-146 ~]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web 2/2 2 2 75m nginx nginx:1.15 app=web
UP-TO-DATE为1时,表示正在升级;UP-TO-DATE为2时,表明版本升级完成。
查看是否升级成功:kubectl rollout status deployment web
[root@master-146 ~]# kubectl rollout status deployment web
deployment "web" successfully rolled out
查看版本升级信息:kubectl rollout history deploy/web
[root@master-146 ~]# kubectl rollout history deploy/web
deployment.apps/web
REVISION CHANGE-CAUSE
4 <none>
5 <none>
6 <none>
7 <none>
添加参数–record来记录升级信息,便于回滚
[root@master-146 ~]# kubectl set image deployment web nginx=nginx:1.16 --record
deployment.apps/web image updated
[root@master-146 ~]# kubectl rollout history deploy/web
deployment.apps/web
REVISION CHANGE-CAUSE
5 <none>
6 <none>
7 <none>
9 <none>
10 kubectl set image deployment web nginx=nginx:1.16 --record=true
回滚到指定版本:kubectl rollout undo deployment web --to-revision=9
[root@master-146 ~]# kubectl rollout undo deploy web --to-revision=9
deployment.apps/web rolled back
[root@master-146 ~]# kubectl rollout status deploy web
Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
deployment "web" successfully rolled out
回滚到上一个版本:kubectl rollout undo deploy web
六、弹性伸缩
kubectl scale deployment web --replicas=10
[root@master-146 ~]# kubectl scale deploy web --replicas=10
deployment.apps/web scaled
[root@master-146 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-66bf4959f5-77cm9 1/1 Running 0 62s 10.244.1.29 worker-145 <none> <none>
web-66bf4959f5-g7lbm 1/1 Running 0 62s 10.244.2.27 worker-144 <none> <none>
web-66bf4959f5-k6zln 0/1 ContainerCreating 0 62s <none> worker-145 <none> <none>
web-66bf4959f5-m79jw 0/1 ContainerCreating 0 62s <none> worker-144 <none> <none>
web-66bf4959f5-p9dn5 1/1 Running 0 8m37s 10.244.2.25 worker-144 <none> <none>
web-66bf4959f5-tmsg4 1/1 Running 0 8m14s 10.244.1.26 worker-145 <none> <none>
web-66bf4959f5-wbbwh 1/1 Running 0 62s 10.244.2.26 worker-144 <none> <none>
web-66bf4959f5-wz7vz 1/1 Running 0 62s 10.244.2.28 worker-144 <none> <none>
web-66bf4959f5-xhphc 1/1 Running 0 62s 10.244.1.27 worker-145 <none> <none>
web-66bf4959f5-zlbmf 1/1 Running 0 62s 10.244.1.28 worker-145 <none> <none>