前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10.服务负载-使用和管理Service

10.服务负载-使用和管理Service

作者头像
AI码师
发布2024-04-23 17:38:35
680
发布2024-04-23 17:38:35
举报

Kubernetes Service 是一个抽象层,用于定义一组 Pod 的访问方式。它为应用程序提供了一个稳定的网络终结点,使得其他服务或外部用户能够访问这组 Pod,而无需关心 Pod 的具体 IP 地址或具体的运行位置。

基本组件

Service 类型: Kubernetes Service 有不同的类型,用于满足不同的需求。

  • ClusterIP:默认类型,只在集群内部提供服务。通过集群内部 IP 地址访问。
  • NodePort:在每个节点上开放一个高端口,允许外部流量进入。通过 <NodeIP>:<NodePort> 访问服务。
  • LoadBalancer:在支持的云平台上创建外部负载均衡器,将流量分发到服务的后端 Pod。适用于公共访问的生产环境。
  • ExternalName:将服务映射到外部名称(例如,DNS 记录)而不是 IP 地址或端口。用于将 Kubernetes 服务映射到外部系统。

Selector 与 Endpoint: 使用标签选择器将 Pod 添加到服务。当 Pod 匹配 Service 的标签选择器时,它们会被添加到服务的 Endpoint 中,用于流量的转发。Service Discovery: Kubernetes Service 提供了一种简单的服务发现机制,允许一个 Pod 通过服务名访问另一个 Pod,而不必知道其具体 IP 地址。Headless Service: 创建一个 Headless Service,它不提供 ClusterIP,但可以通过 DNS 解析返回所有与服务相关的 Pod 的 IP 地址。Annotations 和 Labels: 可以使用 Annotations 和 Labels 为 Service 添加元数据,提供更多信息或配置额外的行为。

service 使用

定义Service

创建一个Deployment ,方便后面测试

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx
  labels:
    app: deployment-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deployment-nginx
  template:
    metadata:
      labels:
        app: deployment-nginx
    spec:
      containers:
      - name: deployment-nginx
        image: nginx:1.14.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

定义一个基本Service

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service
spec:
  selector:
    app: deployment-nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP
代码语言:javascript
复制
kubectl get svc,pod

默认Service type是cluster IP,我们可以通过clusterIP在集群内部访问 为了能够证明 service 负载的能力,我们需要修改pod的内容

代码语言:javascript
复制
kubectl exec -it deployment-nginx-584f786477-d8vm4 -- /bin/bash
echo 'pod/deployment-nginx-584f786477-d8vm4' > /usr/share/nginx/html/index.html
exit

kubectl exec -it deployment-nginx-584f786477-fsmnq -- /bin/bash
echo 'pod/deployment-nginx-584f786477-fsmnq' > /usr/share/nginx/html/index.html
exit

kubectl exec -it deployment-nginx-584f786477-srmf8 -- /bin/bash
echo 'pod/deployment-nginx-584f786477-srmf8' > /usr/share/nginx/html/index.html
exit
代码语言:javascript
复制
curl 10.86.236.109

从结果可以看到通过访问serviced的clusterIP,被负载到各个Pod中

服务发现

其它Pod可以通过 http://clusterip-service直接访问 创建一个pod,用来测试

代码语言:javascript
复制
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.34
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
EOF
代码语言:javascript
复制
# 进入容器
kubectl exec -it busybox -- /bin/sh
wget http://clusterip-service -O -

Service 类型

Service默认是ClusterIP 类型,接下来我们学习另外几种

  • NodePort:在每个节点上开放一个端口,允许外部流量进入。通过 <NodeIP>:<NodePort> 访问服务。nodePort: 30000-32767,不填则随机生成
代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service
spec:
  selector:
    app: deployment-nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    #(默认:30000-32767)
    nodePort: 30007
  type: NodePort

直接访问

代码语言:javascript
复制
curl 127.0.0.1:30007
  • LoadBalancer 在支持的云提供商上创建外部负载均衡器,将请求分发到服务的后端 Pod。适用于需要公共访问的生产环境。云提供商的负载均衡器负责流量分发。这里就不做演示了
  • ExternalName 将服务映射到外部名称,而不是 IP 地址或端口。用于将 Kubernetes 服务映射到外部系统,例如数据库服务。
代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: service-external
spec:
  type: ExternalName
  externalName: www.jianshu.com

进入到busybox容器,可以通过serviceName直接访问 jianshu,但是会被拒绝,因为服务端有安全校验,但是不影响我们验证这种方式

没有selector的service

上面的service 有selector选择符,默认会创建对应的EndpointSlice,可以通过如下命令查看

代码语言:javascript
复制
kubectl get svc,ep

EndpointSlice 名称默认和Service名称相同,并且暴露的Endpoints 和 Pod个数对应

如果你不配置Selector选择,Endpoints将不会创建

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: service-without-selector
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

创建一个同名的EP

代码语言:javascript
复制
apiVersion: v1
kind: Endpoints
metadata:
  name: service-without-selector
subsets:
  - addresses:
      - ip: 10.188.169.155
      - ip: 10.188.36.123
    ports:
      - port: 80

访问service 因为我只配置了两个IP,所以只会访问到对应两个Pod

??

—END—

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-22,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 乐哥聊编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本组件
  • service 使用
    • 定义Service
      • 服务发现
        • Service 类型
          • 没有selector的service
          相关产品与服务
          负载均衡
          负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com