Service对象
Service对象:
原理参考:k8s组件的kube-proxy部分
依赖kube-proxy来生成规则,每个node上的kube-proxy负责监听apiserver的对service的变更信息,一旦有对service变更,kube-proxy就执行规则更改
依赖coreDNS来动态添加、解析A记录
loadbalance是公有云提供的一个接口,当k8s集群创建lb类型service时,会在集群内创建nodeport的svc,在云平台生成一个软lb,lb对应所有节点的nodeport端口(lb从api-server获取pod运行信息),而此lb的公网ip就是extenalIP(所有公网ip都可以是)
dns域名解析格式:
svc名称.ns名称.域名.TLD自动补全域
svc资源:
配置格式:
kubectl explain svc.spec
spec:
externalName
clusterIPs #多个ip使用
clusterIP #svc的ip设置
#ip地址时,svc是:svc名+svcIP
#None,svc自身不再有svcIP,而是直接使用pod的ip,访问svc名时,直接解析到pod的ip,此方式叫:无头service
selector <map[string]string> #标签选择器
标签: 值
ports: #svc端口定义
- name
nodePort #映射在node主机的端口,默认范围是:30000~32767
port #svc端口
targetPort #pod的端口,可以直接写pod.spec.containers.ports.name的名称(会自动解析端口)
protocol #协议,默认TCP
appProtocol #应用层系
type: #svc工作模式
#ExternalName,做snat,让svc绑定外部的应用,pod访问时基于snat原理。pod-->svc-->外部应用-->node主机-->svc-->pod
#ClusterIP,仅用于集群内部通信,不会映射端口到node
#NodePort,映射svc端口到node主机
#LoadBalancer,直接由云负载均衡器向外部暴露服务。云负载均衡器可以将流量路由到自动创建的NodePort服务(绑定node端口))和ClusterIP服务上,openstack支持此功能
sessionAffinity: 规则 #会话粘性
#ClientIP,源ip绑定
#None,不开启会话粘性,使用轮循,默认
sessionAffinityConfig: #配置会话粘性的超时时间,源ip绑定时间,超过后,重新分配
clientIP:
timeoutSeconds: #默认10800(3小时),取值在1~86400
allocateLoadBalancerNodePorts: 布尔值
#使用云负载均衡器的时候,不在节点主机暴露端口,直接绑定到pod端口。默认true,创建绑定node节点端口,false绑定pod端口
externalIPs: #运行将端口暴露到k8s集群外部的ip,客户端访问此ip就能访问pod
- ip1
status: #此配置在spec.type为LoadBalancer时使用
loadBalancer: #弹性lb,可以动态识别k8s集群的所有nodeport,且可以健康检测nodeport端口。k8s暴露集群端口给外部访问时,直接暴露到lb上,lb会关联所有节点
ingress:
- ip: 192.0.2.127
案例:
例1: 创建svc
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
app: ngx
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
例2: 开启访问源ip绑定
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: ngx
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
sessionAffinity: ClientIP
例3: 无头svc
svc自身不再有ip,只有域名,解析地址对应pod地址。具体使用案例结合pod控制器 sts部分mysql案例
apiVersion: v1
kind: Service
metadata:
name: svc-3
spec:
selector:
app: ngx
clusterIP: ""
ports:
- port: 80
targetPort: 80
例4: 使用集群外部ip暴露端口
访问k8s集群外部的ip时,就能直接访问pod
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
externalIPs:
- 80.11.12.10
例5: 使用云负载均衡器暴露端口
必须内网网段是可访问的
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
clusterIP: 10.0.171.239
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 192.0.2.127