找回密码
 立即注册
快捷导航

[Docker/K8s] Kubernetes/k8s Service

[复制链接]
茎肛互撸娃 2023-7-20 03:08:47 | 显示全部楼层
本帖最后由 茎肛互撸娃 于 2023-7-20 03:42 编辑

Service特性

  • Service 通过 label 关联对应的 Pod
  • Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP
  • 提供了负载均衡功能,自动转发流量到不同 Pod
  • 可对集群外部提供访问端口
  • 集群内部可通过服务名字访问

Kubernetes/k8s Service42 作者:茎肛互撸娃 帖子ID:517

创建一个Service

Service 通过标签 test-k8s 跟对应的 Pod 关联上

# service.yaml

apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  type: ClusterIP      # 
  ports:
    - port: 8080        # 本 Service 的端口
      targetPort: 8080  # 容器端口

与pod部署一样:kubectl apply -f service.yaml
查看服务:kubectl get svc
查看服务详情:kubectl describe svc test-k8s

[root@localdomain yaml]# kubectl describe svc test-k8s
Name:              test-k8s
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=test-k8s
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.96.154.148
IPs:               10.96.154.148
Port:              <unset>  5111/TCP
TargetPort:        8080/TCP
Endpoints:         10.244.1.5:8080,10.244.2.5:8080
Session Affinity:  None
Events:            <none>

上面的输出中,可以发现 Endpoints 是各个 Pod 的 IP,也就是他会把流量转发到这些节点。

服务的默认类型是ClusterIP,只能在集群内部访问,我们可以进入到 Pod 里面访问:

kubectl exec -it pod-name -- bash
curl http://test-k8s:8080

如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):
kubectl port-forward service/test-k8s 8888:8080

对外暴露服务

上面我们是通过端口转发的方式可以在外面访问到集群里的服务,如果想要直接把集群服务暴露出来,我们可以使用NodePort 和 Loadbalancer 类型的 Service
NodePort

apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  # 默认 ClusterIP 集群内可访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
  type: NodePort
  ports:
    - port: 8080        # 本 Service 的端口
      targetPort: 8080  # 容器端口
      nodePort: 31000   # 节点端口,范围固定 30000 ~ 32767

部署,访问: curl http://localhost:31000/hello/easydoc
并且是有负载均衡的,网页的信息可以看到被转发到了不同的 Pod

Loadbalancer
Loadbalancer 也可以对外提供服务,这需要一个负载均衡器的支持,因为它需要生成一个新的 IP 对外服务,否则状态就一直是 pendding,这个很少用了,后面我们会讲更高端的 Ingress 来代替它。

多端口

多端口时必须配置 name, 文档

apiVersion: v1
kind: Service
metadata:
  name: test-k8s
spec:
  selector:
    app: test-k8s
  type: NodePort
  ports:
    - port: 8080        # 本 Service 的端口
      name: test-k8s    # 必须配置
      targetPort: 8080  # 容器端口
      nodePort: 31000   # 节点端口,范围固定 30000 ~ 32767
    - port: 8090
      name: test-other
      targetPort: 8090
      nodePort: 32000

总结

ClusterIP
默认的,仅在集群内可用

NodePort
暴露端口到节点,提供了集群外部访问的入口
端口范围固定 30000 ~ 32767

LoadBalancer
需要负载均衡器(通常都需要云服务商提供,裸机可以安装 METALLB 测试)
会额外生成一个 IP 对外服务
K8S 支持的负载均衡器:负载均衡器

Headless
适合数据库
clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP,后面会再讲到具体用法
官网文档

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2024-10-30 18:21

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表