Deployment ---- 适合无状态的服务部署
ReplicaSet ---- ReplicaSet不支持滚动更新,但是Deployment支持 不推荐使用,建议直接使用 Deployment
DaemonSet ---- 一次部署,所有的node节点都会部署
运行集群存储 daemon,例如在每个Node上运行 glusterd、ceph
在每个Node上运行日志收集 daemon,例如 fluentd、 logstash
在每个Node上运行监控 daemon,例如 Prometheus Node Exporter
StatefuleSet ----- 适合有状态的服务部署
应用的场景:
1.需要稳定的持久化存储;
2.需要稳定的网络标志(即Pod被重新调度时网络访问不变);
3.有序部署和有序扩展;
4.有序收缩和删除。
使用的服务有:MySQL集群、MongoDB集群、Akka集群、ZooKeeper集群等。
Job ---- 一次性的执行任务
CronJob ---- 周期性的执行任务
之前我们也使用Deployment部署过应用,如下代码所示
kubectrl create deployment web --image=nginx
但是上述代码不是很好的进行复用,因为每次我们都需要重新输入代码,所以我们都是通过YAML进行配置
但是我们可以尝试使用上面的代码创建一个镜像【只是尝试,不会创建】
kubectl create deployment web --image=nginx --dry-run -o yaml > nginx.yaml
然后输出一个yaml配置文件 nginx.yml ,配置文件如下所示
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: {}
我们看到的 selector 和 label 就是我们Pod 和 Controller之间建立关系的桥梁
通过刚刚的代码,我们已经生成了YAML文件,下面我们就可以使用该配置文件快速创建Pod镜像了
但是因为这个方式创建的,我们只能在集群内部进行访问,所以我们还需要对外暴露端口
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1
关于上述命令,参数说明:
--port:就是我们内部的端口号
--target-port:就是暴露外面访问的端口号
--name:名称
--type:类型
同理,我们一样可以导出对应的配置文件
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
得到的web1.yaml如下所示
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2020-11-16T02:26:53Z"
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: "2020-11-16T02:26:53Z"
name: web2
namespace: default
resourceVersion: "113693"
selfLink: /api/v1/namespaces/default/services/web2
uid: d570437d-a6b4-4456-8dfb-950f09534516
spec:
clusterIP: 10.104.174.145
externalTrafficPolicy: Cluster
ports:
- nodePort: 32639
port: 80
protocol: TCP
targetPort: 80
selector:
app: web
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
然后我们可以通过下面的命令来查看对外暴露的服务
kubectl get pods,svc
然后我们访问对应的url,即可看到 nginx了 http://{当前机器IP}:32639/
首先我们先创建一个 1.14版本的Pod
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
name: nginx
resources: {}
status: {}
我们先制定版本为 1.14,然后开始创建我们的Pod
kubectl apply -f nginx.yaml
同时,我们使用 docker images 命令,就能看到我们成功拉取到了一个 1.14 版本的镜像
我们使用下面的命令,可以将nginx从 1.14 升级到 1.15
kubectl set image deployment web nginx=nginx:1.15
我们在下载 1.15版本,容器就处于ContainerCreating状态,然后下载完成后,就用 1.15版本去替换1.14版本了,这么做的好处就是:升级可以保证服务不中断
我们到我们的node2节点上,查看我们的 docker images;
能够看到,我们已经成功拉取到了 1.15版本的nginx了
查看升级状态
下面可以,查看升级状态
kubectl rollout status deployment web
kubectl rollout history deployment web
应用回滚
我们可以使用下面的命令,完成回滚操作,也就是回滚到上一个版本
kubectl rollout undo deployment web
然后我们可以查看状态
kubectk rollout status deployment web
同时我们还可以回滚到指定版本
kubectl rollout undo deployment web --to-revision=2
弹性伸缩,也就是我们通过命令一下创建多个副本
kubectl scale deployment web --replicas=10
能够清晰看到,我们一下子创建了10个副本