[TOC]
# 服务暴露
共有四种类型:
* ClusterIP
* NodePort
* LoadBalancer
* ExternalName
* Headless
### ClusterIP
仅在集群内可达,这个为service的默认方式
### NodePort
在每个节点的IP地址的某个端口上暴露服务,将节点端口的流量转发到目标 Service 的 ClusterIP 上,通过:进行访问.
> k8s默认NodePort的范围为 30000~32767
##### 示例
~~~
kind: Service
apiVersion: v1
matadata:
name: myapp-svc-nodeport
spec:
type: NodePort
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 32223 #不写这段的话,k8s会默认自动分配
~~~
### LoadBalancer
LoadBalancer 构建在NodePort类型之上,通过云供应商提供的负载均衡器,将服务暴露在集群外部,因此LoadBalancer一样具有NodePort 和ClusterIP。
> 一个LoadBalancer类型的service服务,会指向到集群外部真实存在的某个负载均衡器上,该负载均衡器会把所有客户端的请求,都调度到所有NodePort之上,不依赖客户端自行选择用哪个节点
##### 示例
~~~
kind: Service
apiVersion: v1
matadata:
name: myapp-svc-lb
spec:
type: LoadBalancer
loadBalancerIP: XX.XX.XX.XX
#如果环境支持手动指定lb的IP地址时,用这个
LoadBalancerSourceRanges: x.x.x.x-x.x.x.x
#限制客户端地址的来源范围
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 32223
~~~
### ExternalName
这个类型不由k8s集群提供服务,而是把集群外不的某服务,以DNS的方式映射到集群内,从而让内部Pod能访问外部service。这个类型的service没有clusterIP和NodePort,也没有标签选择器用于选择Pod,因此也没有Endpoints存在
> 这个是将外部服务发布到集群内部
##### 示例
~~~
kind: service
apiVersion: v1
metadata:
name: external-redis-svc
namespace: default
spec:
type: ExternalName
externalName: redis.ilinux.io
ports:
- protocol: TCP
port: 6379
targetPort: 6379
nodePort: 0
selector: {}
~~~
这个创建完成后,Pod可以通过 external-redis-svc或其FQDN格式 的名称external-redis-svc.default.svc.cluster.local访问相应的服务。
### headless类型的service资源
客户端需要**直接访问**Service资源后端的所有Pod资源,这时就应该向客户端**暴露每个Pod资源的IP地址**,而不再是中间层Service对象的ClusterIP,这种类型的Service资源便称为Headless Service。
##### 示例
只需要将ClusterIP字段设置为“None”,就是headless类型了
~~~
kind: Service
apiVersion: v1
matadata:
name: myapp-headless-svc
spec:
ClusterIP: None
selector:
app: myapp
ports:
- port: 80
targetPort: 80
name: httpport
~~~
~~~
#通过nslookup解析myapp-headless-svc
nslookup myapp-headless-svc
Server: 10.96.0.10
Address 1:10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: myapp-headless-svc
Address 1: 10.244.2.13
Address 2: 10.244.1.113
Address 3: 10.244.3.104
~~~
- 一、K8S的安装
- 1.1 安装环境
- 1.2 问题汇总
- 1.3 事前准备
- 1.4 安装配置负载均衡
- 1.5 安装K8S软件
- 1.6 初始化kubeadm
- 1.7 添加控制节点
- 1.8 添加计算节点
- 1.9 安装故障问题处理
- 1.10 安装管理dashboard
- 1.11 编写测试Pod
- 1.12 从外部访问集群中的Pod
- 1.13 部署metrics-server指标采集
- 二、Pod管理
- 2.1 Pod 资源需求和限制
- 2.2 Init 容器
- 2.3 Pod 健康检查(探针)和重启策略
- 2.4 Pod 生命周期(钩子Hook)
- 2.5 静态Pod
- 2.6 初始化容器(init container)
- 2.7 资源限制
- 三、资源控制器
- 3.1 Deployment
- 3.2 StatefulSet
- 3.3 DaemonSet
- 3.4 Job
- 3.5 定时任务
- 3.6 准入控制器
- 3.7 自动伸缩
- 3.8 ReplicaSet
- 四、存储
- 4.1 Secret 管理敏感信息
- 4.2 ConfigMap 存储配置
- 4.3 Volume
- 4.4 PV
- 4.5 PVC
- 4.6 StorageClass
- 4.7 暴露宿主机信息给Pod
- 五、服务Service
- 5.1 Service 资源
- 5.2 服务发现
- 5.3 服务暴露
- 5.4 Ingress 资源
- 5.5 Ingress 专题
- 5.6 traefik 2.X版本使用
- 六、认证、授权、准入控制
- 6.1 服务账户
- 6.2 LimitRange资源与准入控制器
- 6.3 ResourceQuota 资源与准入控制器
- 七、Helm
- 7.1 Helm 安装
- 八、 istio
- 8.1 istio 介绍
- 8.2 iotis 安装
- 九、calico
- 9.1 两种网络模式
- 9.2 全互联模式 与 路由反射模式
- 9.3 BGP跨网段(大型网络)
- 十、Ingress
- 10.1 安装 LoadBalancer
- 10.2 部署 ingress-nginx
- 10.3 Ingress-nginx 的使用
- 10.4 开启TCP和UDP
- 使用中的问题
- CSI Node问题
