1、存在的意义
(1)防止Pod失联(服务发现)因为Pod的IP可能因为Pod升级或回滚而发生IP变更
通过service找到具体Pod具体的IP再去访问
(2)定义一组Pod访问策略(负载均衡)
2、Pod和Service之间的关系
根据label和selector标签建立关联的
通过service实现Pod的负载均衡
vip 虚拟ip
常用service类型
kubectl expose --help # 暴露服务帮助文档
(1)clusterIP:集群内部使用
(2)NodePort:对外访问应用使用
(3)LoadBalancer:对外访问应用使用,公有云
node内网部署应用,外网一般不能访问到
* 找到一台可以进行外网访问机器,安装nginx,反向代理
** 手动把可以访问节点添加到nginx里面
Loadbalancer:公有云,负载均衡,控制器
3、无状态和有状态
(1)无状态:
* 认为Pod都是一样的
* 没有顺序要求
* 不用考虑在哪个node上运行
* 随意进行伸缩和扩展
(2)有状态:
* 上面因素都需要考虑到
* 让每个Pod独立,保持Pod启动顺序和唯一性
** 唯一的网络标识符,持久存储
** 有序,比如mysql主从
4、 部署有状态应用
* 无头service
** ClusterIP: none
(1)StatefulSet部署有状态应用
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None # 无头service
selector:
app: nginx
---
apiVersion: apps/v1
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
* deployment和statefulset区别: 有身份的(唯一标识的)
* 根据主机名+按照一定的规则生成域名
* 每个Pod有唯一主机名
* 唯一域名 格式: 主机名.service名称.名称空间.svc.cluster.local
nginx-statefulset-0.nginx.default.svc.cluster.local