Controller是在集群上管理和运行容器的对象,Controller是实际存在的,Pod是抽象的,主要建立管理pod
html
Pod是经过Controller实现应用的运维,好比弹性伸缩,滚动升级等node
Pod 和 Controller之间是经过label标签来创建关系,同时Controller又被称为控制器工做负载nginx
Deployment表示用户对K8S集群的一次更新操做。Deployment是一个比RS( Replica Set, RS) 应用模型更广的 API 对象,能够是建立一个新的服务,更新一个新的服务,也能够是滚动升级一个服务。滚动升级一个服务,实际是建立一个新的RS,而后逐渐将新 RS 中副本数增长到理想状态,将旧RS中的副本数减小到0的复合操做。web
这样一个复合操做用一个RS是很差描述的,因此用一个更通用的Deployment来描述。以K8S的发展方向,将来对全部长期伺服型的业务的管理,都会经过Deployment来管理。docker
以前咱们也使用Deployment部署过应用,以下代码所示shell
[root@k8s-master ~]$ kubectrl create deployment web --image=nginx
可是上述代码不是很好的进行复用,由于每次咱们都须要从新输入代码,因此咱们都是经过YAML进行配置vim
可是咱们能够尝试使用上面的代码建立一个镜像【只是尝试,不会建立】api
[root@k8s-master ~]$ kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml [root@k8s-master ~]$ cat web.yaml apiVersion: apps/v1 #API版本,能够用kubectl api-versions命令查询 kind: Deployment #yaml文件定义的资源类型和角色,能够是Deployment、Job、Ingress、Service等 metadata: #元数据,固定值写metadata,包含Pod的一些meta信息,好比名称、namespace、标签等信息。 creationTimestamp: null labels: # 设定资源的标签 app: web name: web spec: # 资源规范字段 replicas: 1 # 声明副本数目 selector: # 选择器 matchLabels: # 匹配标签 app: web #匹配template标签的web strategy: {} # 策略 template: # 模版 metadata: # 资源的元数据/属性 creationTimestamp: null labels: # 设定资源的标签 app: web spec: # 资源规范字段 containers: - image: nginx # 容器使用的镜像地址 name: nginx # 容器的名字 resources: {} status: {}
咱们看到的 selector 和 label 就是咱们Pod 和 Controller之间创建关系的桥梁session
经过刚刚的代码,咱们已经生成了YAML文件,下面咱们就可使用该配置文件快速建立Pod镜像了app
[root@k8s-master ~]$ kubectl apply -f web.yaml [root@k8s-master ~]$ kubectl get pods NAME READY STATUS RESTARTS AGE web-5dcb957ccc-jph2p 1/1 Running 0 63s
可是由于这个方式建立的,咱们只能在集群内部进行访问,因此咱们还须要对外暴露端口
[root@k8s-master ~]$ kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1
关于上述命令,有几回参数
导出发布对应的配置文件
[root@k8s-master ~]$ kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml [root@k8s-master ~]$ cat web1.yaml apiVersion: v1 # 指定api版本,此值必须在kubectl api-versions中 kind: Service # 指定建立资源的角色/类型 metadata: # 资源的元数据/属性 creationTimestamp: "2021-01-24T12:53:26Z" 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: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-01-24T12:53:26Z" name: web1 namespace: default resourceVersion: "52349" selfLink: /api/v1/namespaces/default/services/web1 uid: 296d8c14-d397-42d4-b26d-28de0a7d372d spec: clusterIP: 10.99.52.163 externalTrafficPolicy: Cluster ports: #对外发布 - nodePort: 32180 port: 80 protocol: TCP targetPort: 80 selector: app: web sessionAffinity: None type: NodePort status: loadBalancer: {} #对外暴露服务 [root@k8s-master ~]$ kubectl apply -f web1.yaml
能够经过下面的命令来查看对外暴露的服务
[root@k8s-master ~]$ kubectl get pods,svc NAME READY STATUS RESTARTS AGE pod/web-5dcb957ccc-jph2p 1/1 Running 0 11m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h service/web1 NodePort 10.99.52.163 <none> 80:32180/TCP 6m2s
而后咱们访问对应的url,便可看到 nginx了http://192.168.88.11:32180/
以前建立的pod删除掉
[root@k8s-master ~]# kubectl delete deployment web
首先建立一个 1.14版本的Pod
[root@k8s-master ~]$ vim web.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:1.14 #指定1.14版本 name: nginx resources: {} status: {}
开始建立Pod
[root@k8s-master ~]$ kubectl apply -f web.yaml
在node节点使用docker images命令,就能看到咱们成功拉取到了一个 1.14版本的镜像
使用下面的命令,能够将nginx从 1.14 升级到 1.15
[root@k8s-master ~]$ kubectl set image deployment web nginx=nginx:1.15
咱们在下载 1.15版本,容器就处于ContainerCreating状态,而后下载完成后,就用 1.15版本去替换1.14版本了,这么作的好处就是:升级能够保证服务不中断
[root@k8s-master ~]$ kubectl rollout status deployment web deployment "web" successfully rolled out
查看历史版本
[root@k8s-master ~]$ kubectl rollout history deployment web deployment.apps/web REVISION CHANGE-CAUSE 1 <none> 2 <none>
回滚到上一个版本
[root@k8s-master ~]$ kubectl rollout undo deployment web #undo
同时咱们还能够回滚到指定版本
[root@k8s-master ~]$ kubectl rollout undo deployment web --to-revision=2
弹性伸缩,也就是咱们经过命令一下建立多个副本
[root@k8s-master ~]$ kubectl scale deployment web --replicas=10 [root@k8s-master ~]$ kubectl get pods NAME READY STATUS RESTARTS AGE web-65b7447c7-28ppk 1/1 Running 0 3m5s web-65b7447c7-8rspl 1/1 Running 1 6m42s web-65b7447c7-9mv5n 1/1 Running 0 3m5s web-65b7447c7-9sqrv 1/1 Running 0 3m5s web-65b7447c7-c8g9t 1/1 Running 0 3m5s web-65b7447c7-mczxb 1/1 Running 0 3m5s web-65b7447c7-nxz2h 1/1 Running 0 3m5s web-65b7447c7-r6p75 1/1 Running 0 3m5s web-65b7447c7-vx6mv 1/1 Running 0 3m5s web-65b7447c7-vzt7s 1/1 Running 0 3m5s