Kubernetes YAML 详解之网络服务一 Service

Kubernetes YAML 详解之网络服务一 Service 一、Service YAMLService四层代理简写svc基于 IP 和 端口号Service定义一个服务访问的入口客户端通过这个入口访问服务后面的资源。Service是一组 Pod 的逻辑集合这组 Pod 有相同的标签Service 通过labelSelector查找 Pod 标签来实现访问。查看Service相关 yaml 字段说明与pod.metadata相同kubectl explain serviceService 的service.meatdata字段与pod.metadata相同kubectl explain service.meatdataService 的service.spec字段kubectl explain service.spec字段值类型说明allocateLoadBalancerNodePortsboolean用于控制 LoadBalancer 类型 Service 是否自动分配 NodePort。true默认值为 LoadBalancer 类型的 Service 自动分配 NodePort即使不需要通过节点端口访问。false禁止分配 NodePort仅通过云厂商的负载均衡器如 AWS ALB、GCP LB暴露服务。clusterIPstring定义集群 IPtype为ClusterIP时默认是随机分配的不需要 ip 为空就行clusterIP: noneclusterIPs[]string手动指定多个ClusterIP需与ipFamilies对应externalIPs[]string指定外部可访问的 VIP非云厂商 LBexternalNamestring当type为externalName时这里是请求其他命名空间时用的 pod 的域名externalTrafficPolicystring控制外部流量路由方式Cluster默认流量可能跨节点转发保留客户端 IP需云厂商支持Local流量仅路由到本节点 Pod保留真实客户端 IP但可能负载不均internalTrafficPolicystring控制内部流量路由方式Cluster默认流量可能跨节点转发Local流量仅路由到本节点 PodhealthCheckNodePortinteger为externalTrafficPolicy: Local的NodePortService 指定健康检查端口ipFamilies[]string指定 Service 的 IP 协议栈双栈支持[IPv4][IPv6][IPv4,IPv6]ipFamilyPolicystring控制 IP 协议栈策略SingleStack单协议栈PreferDualStack优先双栈RequireDualStack必须双栈loadBalancerClassstring指定负载均衡器实现类如 AWS NLB/GCE L7loadBalancerSourceRanges[]string限制访问 LB 的源 IP 范围CIDR 格式ports[]Object端口appProtocol:name: 端口名nodePort: 物理机端口号将 Service 的端口映射到物理机的端口* port: service 自己的端口号protocol: 协议SCTPTCPUDPtargetPort: 目标端口号资源中容器的端口号或给端口定义的名字publishNotReadyAddressesboolean是否发布未就绪ReadyFalse的 Pod 地址false默认只发布就绪 Podtrue发布所有 Pod包括未就绪的selectormap[string]string容器标签选择器直接写标签就行 如app:123sessionAffinitystring定义客户端会话是否绑定到同一 PodNone默认无会话保持ClientIP相同客户端 IP 的请求路由到同一 PodsessionAffinityConfigObject配置会话保持的详细参数clientIP.timeoutSeconds会话保持超时时间默认 10800 秒typestringService 类型ExternalName: 跨命名空间访问服务仅通过域名即服务名名组合方式SVC_NAME(service 名).NS_NAME(命名空间名).DOMAIN.LTD(集群默认的域名后缀 svc.cluster.loca)示例nginx-service.default.svc.cluster.local提供对外的服务;用法看下面示例 \color{blue}{用法看下面示例}用法看下面示例ClusterIP:默认服务只能在群集内访问 通过群集 IP 的方式NodePort: 服务映射到物理机的一个端口上对外提供服务LoadBalancer: 通过外部负载均衡对外提供服务示例:创建 nginx deployment 服务apiVersion:apps/v1kind:Deploymentmetadata:name:nginxlabels:# 定义 deployment 标签my_deploy:nginxspec:replicas:3selector:# 定义标签选择器matchLabels:# 定义标签筛选app:nginxversion:v1template:metadata:labels:# 定义 pod 标签app:nginxversion:v1spec:containers:-name:nginximage:nginximagePullPolicy:IfNotPresentports:-containerPort:80创建ClusterIP类型的 ServiceapiVersion:v1kind:Servicemetadata:name:nginx-servicelabels:# 定义 service 标签my_service:servicespec:type:ClusterIP# service 类型ports:# 定义端口数据-port:80# Service 的端口号protocol:TCP# 使用的协议targetPort:80# deployment 中 template 中 containers 的端口号selector:# 标签选择器找 appnginx 的 podapp:nginx创建NodePort类型的 Service使用命令ipvsadm -Ln可以看到物理机的 31180 端口转发到 pod 的 80 端口其他节点也有这个规则rootmaster:~# ipvsadm -Ln TCP 192.168.17.130:31180 rr - 10.244.104.15:80 Masq 1 0 0 - 10.244.104.16:80 Masq 1 0 0 - 10.244.166.136:80 Masq 1 0 0......spec:type:NodePort# service 类型ports:# 定义端口数据-port:80# Service 的端口号protocol:TCP# 使用的协议targetPort:80# deployment 中 template 中 containers 的端口号nodePort:31180# 映射到物理机的端口号将 Service 的 80 映射到物理机 31180......创建ExternalName类型的 Service......spec:type:ExternalName# 定义 ExternalName 类型externalName:nginx-service.xxxx.svc.cluster.local# 定义其他命名空间 pod 的域名......