SERVICE
-
-
NodePort: 在每个节点上开放一个端口,将流量转发到
ClusterIP
类型的服务上。可以通过<NodeIP>:<NodePort>
从集群外部访问服务。适合用于测试或小型集群。 -
LoadBalancer: 自动配置一个外部负载均衡器(通常由云提供商提供),并将流量转发到
ClusterIP
类型的服务上。适用于需要从外部访问的服务,如生产环境。 -
ExternalName
#ExternalName详细解释 定义: ExternalName 类型的 Service 通过 DNS 名称将服务请求转发到外部主机。它不创建任何代理或负载均衡器,而是将请求直接转发到指定的外部地址。 用途: 适用于将 Kubernetes 内部服务与集群外部的服务进行集成。例如,可以用来访问外部数据库或第三方 API。 配置: 在 Service 的 YAML 文件中,配置 type 为 ExternalName,并设置 externalName 字段为目标外部主机名 #行为 DNS 解析: 当在 Kubernetes 集群内部访问 my-external-service 时,它会解析为 external.example.com 的 DNS 名称。 不进行流量管理: ExternalName 类型的 Service 不处理流量路由或负载均衡,流量直接发送到 externalName 指定的外部地址。 #使用场景 与外部资源对接: 当需要与集群外的服务进行通信时,ExternalName 提供了一种简单的方式来实现。 简化配置: 使集群内部的服务可以通过 DNS 名称访问外部资源,无需修改集群内部服务的配置。
示例(ExternalName):
#yaml1,部署一个centos7的pod apiVersion: v1 kind: Pod metadata: name: centos7 spec: containers: - name: centos7 image: centos:7
imagePullPolicy: Never command: ["/bin/sh"] args: ["-c","while true; do echo hello; sleep 10; done"]
#command: 容器启动时执行的命令,这里是 /bin/sh。 #args: 传递给命令的参数,容器将运行一个无限循环,每 10 秒输出一次hello。 #yaml2,部署一个svc,用于external类型 apiVersion: v1 kind: Service metadata: name: external-test spec: type: ExternalName externalName: baidu.com #externalName: baidu.com: 这个服务将请求转发到 baidu.com。 kubectl apply -f external.yaml kubectl apply -f service1.yaml kubectl get pod -o wide kubectl get svc kubectl exec -it external-pod bash
-
-
Endpoints:
Service
Endpoint #概述:endpoint是一个关键的核心对象,它承担着连接service和后端Pod的重要角色。 #定义: 1.资源对象:用于表示一个服务的网络终结点。 2.抽象层:将服务的网络地址与后端容器或节点上的实际服务进行关联。 #作用: 1.服务发现:自动识别和管理服务的网络终结点,从而实现服务发现和访问。 2.负载均衡:将流量负载均衡到后端Pod上,实现服务的高可用性和水平扩展。 3.动态更新:根据service和pod的标签选择器自动生成的,因此当service或pod的标签发生变化时,endpoint会自动更新,实现动态的服务发现和负载均衡。 #生成与管理: 1.自动生成:每个service对象都会自动创建一个对应的endpoint对象,其中包含了与该service相关联的后端pod的网络地址和端口号。 2.控制平面管理:endpoint资源通常由kubenetes控制平面自动创建和管理。 #结构: IP地址与端口号:包含了与service相关联的后端pod的ip地址和端口号。一个endpoint可以包含多个ip地址和端口号的组合,这取决于与service相关联的pod的数量。 #endpoint的使用场景: 1.内部服务访问:endpoint主要在集群中内部使用,用于实现集群内部的服务发现和负载均衡,不直接对外暴露。 2.被其他资源引用:endpoint可以被其他kubernetes资源对象引用,例如Ingress,LoadBalancer等,从而实现对服务的访问和负载均衡。
-
port: 服务暴露的端口号。
-
targetPort: 后端 Pods 上容器的端口号。
-
protocol
-
#Service 名为 myapp-service,类型为 NodePort,将流量通过端口 30007 转发到 Pods 上的端口 80。这样,你可以通过集群中任意节点的 IP 地址和端口 30007 访问 nginx 服务。
apiVersion: v1 kind: Service metadata: name: myapp-service spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30007 selector: app: nginx
#nodePort: 30007: 在每个节点上开放的端口,用于外部访问。
#app: nginx: 选择具有 app: nginx 标签的 Pods。这意味着这个 Service 会将流量转发到 Deployment 创建的 Pods 上。
通过Deployment添加pod
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx-dep spec: replicas: 4 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: harbor.hiuiu.com/nginx/nginx:1.21.5 imagePullPolicy: Never ports: - containerPort: 80
1.查看 Service
列出当前ns的所有 Services
kubectl get services
查看特定 Service 的详细信息
kubectl describe service <service-name>
查看特定 Service 的 YAML 配置
kubectl get service <service-name> -o yaml
这将显示指定 Service 的 YAML 配置,方便查看或保存配置。
2.创建 Service
从 YAML 文件创建 Service
kubectl apply -f <file-name>.yaml
使用命令行创建 Service
kubectl expose deployment <deployment-name> --port=<port> --target-port=<target-port> --name=<service-name>
kubectl expose deployment nginx-deployment --port=80 --target-port=80 --name=nginx-service
3.更新 Service
编辑 Service
kubectl edit service <service-name>
这将打开一个编辑器,你可以在其中修改 Service 的配置。保存后,Kubernetes 会应用这些更改。
替换 Service 的配置
kubectl replace -f <file-name>.yaml
kubectl delete service <service-name>
5.获取 Service 的端口映射
kubectl get service <service-name> -o jsonpath='{.spec.ports[*].nodePort}'
kubectl get services --all-namespaces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了