Kubernetes服务基础

o打

# 查看
kubectl get svc
kubectl get svc <svc-name>
kubectl describe svc <svc-name>
# 创建
kubectl expose deployment <d-name> --port<port> --target-port=<target-port>
# 调试
kubectl get endpoints <svc-name>:查看服务端点
kubectl port-forward svc/<svc-name><local-port>:<svc-port>:本地端口转发服务端口

服务

服务的类型

  • ClusterIP: 分配一个集群内部的ip地址,使得服务只能集群内部访问
  • NodePort: 在每个节点上分配一个端口,是的可以外部访问服务
  • LoadBalancer: 使用负载均衡来暴露服务,让服务加入后端池
  • ExternalName: 通过返回的CNAME记录来映射另一个外部的DNS名称

image-20240717132825010

image-20240717145241179

ClusterIP

用于定义一组Pod的逻辑集合,并且可以通过一个稳定的IP地址和端口进行访问。ClusterIP服务类型会在集群内部分配一个虚拟IP地址,这个IP地址只能在集群内部访问,不能从外部直接访问。

工作原理
  1. 定义Service: 当你创建一个ClusterIP类型的Service时,Kubernetes会为这个Service分配一个虚拟IP地址(Cluster IP)。
  2. 选择器(Selector): Service通过标签选择器(Label Selector)来选择一组Pod,这些Pod将成为这个Service的后端。
  3. Endpoints: Kubernetes会自动创建一个Endpoints对象,记录所有符合选择器条件的Pod的IP地址和端口。
  4. 内部负载均衡: 当集群内的其他Pod或服务通过Cluster IP访问这个Service时,Kubernetes会自动将请求负载均衡到后端的Pod上。
yaml参考
kind: Service
apiVersion: v1
metadata:
name: kubernetes
namespace: default
uid: 855d96b0-c9e8-4ef2-afe5-bdb86e21adc3
resourceVersion: '194'
creationTimestamp: '2024-07-12T07:36:07Z'
labels:
component: apiserver
provider: kubernetes
spec:
ports:
- name: https
protocol: TCP
port: 443
targetPort: 6443
clusterIP: 10.233.0.1
clusterIPs:
- 10.233.0.1
type: ClusterIP
sessionAffinity: None
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
internalTrafficPolicy: Cluster
status:
loadBalancer: {}

NodePort

工作原理
  1. 定义Service: 当你创建一个NodePort类型的Service时,Kubernetes会在每个节点上分配一个端口(范围通常是30000-32767)。
  2. 选择器(Selector): Service通过标签选择器(Label Selector)来选择一组Pod,这些Pod将成为这个Service的后端。
  3. Endpoints: Kubernetes会自动创建一个Endpoints对象,记录所有符合选择器条件的Pod的IP地址和端口。
  4. 节点端口(NodePort): Kubernetes会在每个节点上开放一个指定的端口,并将这个端口的流量转发到Service的Cluster IP,然后再负载均衡到后端的Pod上。

yaml参考

LoadBalancer

ps:这里的LoadBalancer和云上的不同,是为了解决nodeport不清晰问题。

外部流量策略
  1. cluster
  • 把流量分配给所有集群中所有节点的可用实例上
  • 能够做到全局分配和高利用,但是可能会造成比较高的延迟
  • 场景:适合需要整体稳定可用的
  1. local
  • 优先把流量分给同一节点或同一区域的可用实例上
  • 能够低延迟访问服务,本地优先
  • 场景:适合游戏或者视频流媒体
yaml参考
kind: Service
apiVersion: v1
metadata:
name: loadbalancer-01
namespace: default
uid: c4093644-e423-4737-94e1-8fd92606933d
resourceVersion: '3774606'
creationTimestamp: '2024-07-16T03:04:31Z'
annotations:
kpanda.io/alias-name: loadbalancer
spec:
ports:
- name: tcp-loadbalaner
protocol: TCP
port: 8081
targetPort: 8081
nodePort: 30683
selector:
app: baize-notebook-ssh
clusterIP: 10.233.59.228
clusterIPs:
- 10.233.59.228
type: LoadBalancer
sessionAffinity: None
externalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
allocateLoadBalancerNodePorts: true
internalTrafficPolicy: Cluster
status:
loadBalancer: {}

ExternalName

工作原理
  1. 定义Service: 当你创建一个ExternalName类型的Service时,你需要指定一个外部的DNS名称。
  2. DNS解析: Kubernetes的DNS服务会为这个Service创建一个CNAME记录,将Service名称解析为指定的外部DNS名称。
  3. 访问外部服务: 集群内的Pod可以通过Service名称访问外部的服务,Kubernetes的DNS服务会将这个名称解析为外部的DNS名称
yaml参考

不许参考,懒得cv了都基本一样就其他字段和type不同。