Pod与controllers的关系
控制器管理pod
- • controllers:在集群上管理和运行容器的对象
- • 使用label-selector 标签 让控制器关联pod
- • Pod通过控制器实现应用的运维,如伸缩,升级等
Deployment
- • 部署无状态应用--用于web服务,无需多的更改
- • 管理Pod和ReplicaSet(若是一个pod挂了,就起一个pod在别的节点)
- • 具有上线部署、副本设定、滚动升级、回滚等功能
- • 提供声明式更新,例如只更新一个新的Image
记录的版本,用于回滚:
总结
1、deployment 认为pod都保持一致
2、不用考虑启动顺序
3、不用考虑在哪个node上运行,在哪个node上运行都一样
4、随意的扩容、缩容
SatefulSet
部署有状态应用
- • 解决Pod独立生命周期,保持Pod启动顺序和唯一性
-
- 稳定,唯一的网络标识符,持久存储
-
- 有序,优雅的部署和扩展、删除和终止
-
- 有序,滚动更新
- 应用场景:数据库
总结
1、比如etcd就需要部署在这个控制器下,因为集群之间的配置会变化
2、不对等的关系,需要用外部存储,类似于3台web,存储附件,不要用一个nfs共享存储,让每个web都可以正常访问
service:外部可以访问,通过CLUSTER-IP 转发到容器的节点上来提供服务
现需要将CLUSTER-IP 设置为None,这样就能保证转发到一台节点上,需要用到的是dns的通信
设置:clusterIP: None 若是不设置,默认都是有clusterIP
配置dns服务:
kubectl apply -f coredns.yaml
验证:(若是running,就没问题)
验证开始
[root@docker demo]# cat sys.yaml
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
说明:1、serviceName: nginx 与service 中的name: nginx 绑定
2、kind: StatefulSet 指定这个控制器
创建
kubectl apply -f sys.yaml
创建一个pod,在这里用dns解析
[root@docker demo]# kubectl apply -f pod1.yaml
[root@docker demo]# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: dns-test
spec:
containers:
- name: busybox
image: busybox:1.28.4
args:- /bin/sh
- -c
- sleep 39999999
说明:1、必须要加上参数,不然启动就退出了,保证不被退出
进入到容器里解析:
说明:1、nginx-statefulset-0.nginx 中nginx-statefulset-0 是pod的主机名,nginx是service名称,这样来保证稳定
主机名获取:
StatefulSet与Deployment区别:有身份的!
身份三要素:
• 固定域名
• 固定主机名
• 存储(PVC)
ClusterIP A记录格式:<service-name>.<namespace-name>.svc.cluster.local
ClusterIP=None A记录格式:<statefulsetName-index>.<service-name>.svc.cluster.local
示例:web-0.nginx.default.svc.cluster.local