Deployment也是控制器,它构建在 ReplicaSet控制器之上。后期我们只需要描述 Deployment资源清单,Deployment控制器就会按照我们所描述的资源清单进⾏ 资源的创建,并尽可能的向⽤户所期望的状态逼近。 也就是说,后期我们部署容器应⽤不直接使⽤Pod和ReplicaSet,⽽是使⽤ Deployment控制器来调⽤ReplicaSet来实现,Deployment控制器在ReplicaSet 原有基础上,添加了部分特性。
1、事件和状态查看:允许⽤户通过特定的命令查看Deployment对象的更新 进度和状态。
2、版本记录:将Deployment对象的更新操作都进⾏了保存,以便后续执⾏ 回滚操作使⽤;
创建ng-deploy.yaml的deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: myng
name: ng-deploy
spec:
replicas: 2 ##副本数
selector:
matchLabels:
app: myng
template:
metadata:
labels:
app: myng
spec:
containers:
- name: myng
image: nginx:1.23.2
ports:
- name: myng-port
containerPort: 80
执行命令创建deployment: kubectl apply -f ng-deployment.yaml;
服务的暴露:vi ng-svc.yaml:
apiVersion: v1
kind: Service
metadata:
name: ngx-svc
spec:
selector:
app: myng
ports:
- protocol: TCP
port: 80
targetPort: 80
执行命令创建svc: kubectl apply -f ng-svc.yaml;
Daemonset:有些场景需要在每一个node上运行Pod(比如,网络插件calico、监控、日志收集),Deployment无法做到,而Daemonset(简称ds)可以。Deamonset的目标是,在集群的每一个节点上运行且只运行一个Pod。
Daemonset不支持使用kubectl create获取YAML模板,所以只能照葫芦画瓢了,参考Deployment的YAML编写,其实Daemonset和Deployment的差异很小,除了Kind不一样,还需要去掉replica配置。
vi dmset.yaml 如:
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: ds-demo
name: ds-demo
spec:
selector:
matchLabels:
app: ds-demo
template:
metadata:
labels:
app: ds-demo
spec:
containers:
- name: ds-demo
image: nginx:1.23.2
ports:
- name: mysql-port
containerPort: 80
创建damonset: kubectl apply -f ds-demo.yaml
API资源对象Statefulset:
Pod的有状态和无状态:
无状态:指的Pod运行期间不会产生重要数据,即使有数据产生,这些数据丢失了也不影响整个应用。比如Nginx、Tomcat等应用属于无状态。
有状态:指的是Pod运行期间会产生重要的数据,这些数据必须要做持久化,比如MySQL、Redis、RabbitMQ等。
Deployment和Daemonset适合做无状态,而有状态也有一个对应的资源,那就是Statefulset(简称sts)。
vim redis-sts.yaml ,需要提前准备好pvc:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-sts
spec:
serviceName: redis-svc ##这里要有一个serviceName,Sts必须和service关联
volumeClaimTemplates:
- metadata:
name: redis-pvc
spec:
storageClassName: nfs-client
accessModes:
- ReadWriteMany
resources:
requests:
storage: 500Mi
replicas: 2
selector:
matchLabels:
app: redis-sts
template:
metadata:
labels:
app: redis-sts
spec:
containers:
- image: redis:6.2
name: redis
ports:
- containerPort: 6379
volumeMounts:
- name: redis-pvc
mountPath: /data
创建关联的service: vim redis-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-svc
spec:
selector:
app: redis-sts
ports:
- port: 6379
protocol: TCP
targetPort: 6379
分别kubectl apply -f redis-sts.yaml && kubectl apply -f redis-service.yaml