文章目录
1. ClusterIP
1.1 概念
- 作用: 默认模式,只能在集群内部访问
- 使用:
同namespace下: 使用service_name
访问
不同namespace下: 使用service_name.namespace_name
访问
1.2 示例
已流媒体服务的service做示例
- service.yml
kind: Service
apiVersion: v1
metadata:
name: store-server
namespace: streaming
labels:
name: store-server
spec:
type: ClusterIP #默认规则,这一行可以不写
ports:
- name: store-01
protocol: TCP
targetPort: 4383 # pod的端口
port: 4383 # k8s集群中的端口
- name: store-02
protocol: TCP
targetPort: 4384
port: 4384
- name: store-03
protocol: TCP
targetPort: 4385
port: 4385
selector:
app: store-server # 指定代理的 pod的标签
- 代理的deployment
deployment定义了pod标签,service正是指定了这个标签。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: store-server
namespace: streaming
spec:
replicas: 1
template:
metadata:
labels:
app: store-server # 上边service 指定这个标签
- 查看结果
# kubectl get service -n streaming
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
store-server ClusterIP 10.1.141.197 <none> 4383/TCP,4384/TCP,4385/TCP 6d6h
2. NodePort
2.1 概念
- 作用:在每个节点上都监听一个同样的端口号(默认范围:30000-32767)
- 访问:
集群中访问方式:同 clusterIP
集群外访问:使用 nodePort 指定的端口
2.2 示例
已流媒体服务的service做示例
kind: Service
apiVersion: v1
metadata:
name: cache-server
namespace: streaming
labels:
name: cache-server
spec:
type: NodePort
ports:
- name: cache-01
nodePort: 30521 #暴露在kube-proxy中的端口
port: 30521 # k8s集群中的端口
protocol: TCP
targetPort: 30521 # pod的端口
- name: cache-02
nodePort: 30522
port: 30522
protocol: TCP
targetPort: 30522
selector:
app: cache-server
- 查看结果
# kubectl get service -n streaming
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cache-server NodePort 10.1.244.21 <none> 30521:30521/TCP,30522:30522/TCP 6d6h
3. LoadBalancer
3.1 概念
要配合支持公有云负载均衡使用比如阿里云、AWS。本质也是NodePort,只不过会把:自动添加到公有云的负载均衡当中
3.2 示例
以阿里云托管集群自动创建的nginx-ingress为例
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-ingress-lb
name: nginx-ingress-lb
namespace: kube-system
spec:
externalTrafficPolicy: Local
healthCheckNodePort: 31386
ports:
- name: http
nodePort: 30782
port: 80
protocol: TCP
targetPort: 80
- name: https
nodePort: 30330
port: 443
protocol: TCP
targetPort: 443
selector:
app: ingress-nginx
type: LoadBalancer
- 查看结果
# kubectl get svc -A|grep LoadBalancer
kube-system nginx-ingress-lb LoadBalancer 172.21.7.221 39.xxx.xxx.45 80:30782/TCP,443:30330/TCP 397d
4. ExternalName
4.1概念
创建一个dns别名指到service name上,主要是防止service name发生变化,要配合dns插件使用
5. HeadLessService
5.1 概念
- 作用:
不给service分配集群IP,则访问service的时候会暴露后端pod的IP。 - 应用
有状态的pod通常使用这种service,如mysql集群、monogdb集群等 - 操作
只需要将spec.clusterIP的值设置为none
5.2 示例
以StatefulSet 创建mongo为例,其中service如下
- yml文件
apiVersion: v1
kind: Service
metadata:
name: headless-mongo
namespace: mongodb
labels:
name: mongo
spec:
selector:
role: mongo
ports:
- port: 27017
targetPort: 27017
clusterIP: None
- 查看结果
# kubectl get service -n mongodb
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
headless-mongo ClusterIP None <none> 27017/TCP 32m
6. 其他
6.1 local模式
- 作用
service默认会代理所有node节点上的pod,而local模式下poxy仅代理本节点上的pod。 - 解决问题
服务A通过service访问pod B,podB 显示的对方访问地址是proxy的node节点的IP。
使用lcoal模式会显示服务A的真实IP - 示例
示例说明:
以某项目中阿里云环境的emqx为例,无法获取到设备真实IP(客户环境资金很死,没法使用LoadBalancer)
我们把三个pod固定在三个打标签的node节点上,然后service使用local模式。
当然最好三个pod反亲和。
spec:
externalTrafficPolicy: Local
ports:
- name: mqtt
当然,我们在阿里云上也可以直接在控制台界面上操作。
6.2 Pod的会话保持
spec.sessionAffinity
支持以下值:
None
:取消session(默认模式)
ClientIP
:session保持,同一ip访问同一个pod
kind: Service
apiVersion: v1
metadata:
name: nginx-test
namespace: test
labels:
name: nginx-test
spec:
type: NodePort
sessionAffinity: ClientIP
ports:
- name: web01
nodePort: 31081
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-test