controller主要做的事情:是在集群上管理和运行容器的对象
controller是实际存在的,而pod只是一个抽象的概念
pod是通过controller去实现应用的运维
如:伸缩、滚动升级等
Pod和Controller之间通过label标签建立关系,其关系的建立如下图所示
控制器(Controller)又可以称为工作负载。
pod在配置文件中定义一个标签,在controller里面定义相同的key和value,如此便使其和controller之间建立了关系
deployment是一种最常用的控制器
应用场景如下:
所以,其常见的场景是:web服务、微服务
部署应用的步骤如下:
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
查看配置文件,下面框柱的地方,便是将pod和controller通过label标签进行关联
使用yaml文件部署应用
暴露端口:提供对外服务的端口(因为目前只能集群内容进行网络通信)
现在部署这个生成的配置文件便可以比之前部署的多了一个对外暴露端的端口的配置
执行该配置文件
现在便可以通过下面框住的端口号,通过任何一个node节点+端口号都能访问到nginx
升级:比如之前部署nginx,我们并没有指定版本,获取到的便是最新版本,但是当我们指定nginx的版本是1.14,后面我们需要将其升级到1,15,这样一个过程便称为应用升级
回滚:当我们想把当前的版本1.15,回滚到1.14,这个过程便成为应用回滚
弹性伸缩:比如我创建多个web副本,其满足不同的应用,这个便称为弹性伸缩
操作如下:
在创建的yaml文件中指定nginx的版本
通过下面的地方去指定版本为1.14
部署上面的配置
过一会儿,当镜像拉取完后,便可以在node节点的docker中去查看版本信息
升级:将nginx升级到1.15,这个操作按如下的命令去执行
查看docker里面的版本,其版本更新为1.15了
在这一张的上一张图中,查看pod,会发现有三个。原理:
查看升级状态:可以发现是成功的
回滚
操作如下:
无状态部署应用的特点:
有状态部署应用的特点:
无头service:ClusterIP的值为none
如下,如果CLUSTER-IP属性为none,这样其便不是以后面的CLUSTERIP进行约定,而是有一个唯一标识(生成一个特定规则的域名,通过域名做相关的操作,这就称为无头Service),如下面的CLUSTER-IP
如下准备一个yal文件:内容如下
建立无状态Service
SatefulSet部署有状态应用:其有三个nginx副本
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: nginx-statefulset
namespace: default
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
剩下的步骤如下:
二者最大的区别是:statefulset是有身份的(唯一标识)
主机名称.service名称.名称空间.svc.cluster.local
将所有node运行在同一个pod,新加入的node也同样运行在一个pod里面,在controller有部署守护进程,实现这个操作
使用DaemonSet部署守护进程的步骤:下面以在每个node节点安装数据采集工具为例
准备一个yaml文件,生成node:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: logs
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: varlog
mountPath: /tmp/log
volumes:
- name: varlog
hostPath:
path: /var/log
执行上面的ds.yaml文件
查看执行前的node节点内容
开始执行该yaml文件
查看Pod
进入某个pod,查看采集的内容
进入pod
查看文件内容
首先,编写了一个yaml文件(文件名为job.yaml),如下所示:该文件定义了一个job,并规定了重启策略(backoffLimit),如果失败,则重启四次
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
在服务器上编写并执行文件job.yaml
查看pod
查看jobs:便可以发现这个一次性任务
再等待一会儿,当docker将镜像下载完后,如下
然后回到master节点查看
首先,创建一个yaml文件,如下,在里面配置了一个定时任务(每隔一分钟输出hello…信息),里面设置cron表达式
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
在服务器上编写并执行上述的文件(cronjob.yaml)
查看相关内容