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
posted @ 2022-09-02 15:14  suyanhj  阅读(83)  评论(0编辑  收藏  举报