K8S对象-service(clusterIp、NodePort、LoadBalancer、ExternalName、HeadLessService)

1. ClusterIP

1.1 概念

  • 作用: 默认模式,只能在集群内部访问
  • 使用:
    同namespace下: 使用service_name 访问
    不同namespace下: 使用 service_name.namespace_name 访问

1.2 示例

已流媒体服务的service做示例

  • service.yml
kind: Service
apiVersion: v1
metadata:
  name:  store-server
  namespace:  streaming
  labels:
    name:  store-server
spec:
  type: ClusterIP  #默认规则,这一行可以不写
  ports:
  - name:  store-01
    protocol: TCP
    targetPort: 4383 # pod的端口
    port: 4383  # k8s集群中的端口
  - name: store-02
    protocol: TCP
    targetPort: 4384
    port: 4384
  - name: store-03
    protocol: TCP
    targetPort: 4385
    port: 4385
  selector:
    app: store-server  # 指定代理的 pod的标签

  • 代理的deployment
    deployment定义了pod标签,service正是指定了这个标签。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: store-server
  namespace: streaming
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: store-server  # 上边service 指定这个标签
  • 查看结果
# kubectl get service -n streaming
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                           AGE
store-server         ClusterIP   10.1.141.197   <none>        4383/TCP,4384/TCP,4385/TCP                                                        6d6h

2. NodePort

2.1 概念

  • 作用:在每个节点上都监听一个同样的端口号(默认范围:30000-32767)
  • 访问:
    集群中访问方式:同 clusterIP
    集群外访问:使用 nodePort 指定的端口

2.2 示例

已流媒体服务的service做示例

kind: Service
apiVersion: v1
metadata:
  name: cache-server
  namespace: streaming
  labels:
    name: cache-server
spec:
  type: NodePort
  ports:
  - name: cache-01
    nodePort: 30521  #暴露在kube-proxy中的端口
    port: 30521   # k8s集群中的端口
    protocol: TCP
    targetPort: 30521  # pod的端口
  - name: cache-02
    nodePort: 30522
    port: 30522
    protocol: TCP
    targetPort: 30522
  selector:
    app: cache-server
  • 查看结果
# kubectl get service -n streaming
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                           AGE
cache-server         NodePort    10.1.244.21    <none>        30521:30521/TCP,30522:30522/TCP                                                   6d6h

3. LoadBalancer

3.1 概念

要配合支持公有云负载均衡使用比如阿里云、AWS。本质也是NodePort,只不过会把:自动添加到公有云的负载均衡当中

3.2 示例

以阿里云托管集群自动创建的nginx-ingress为例

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-ingress-lb
  name: nginx-ingress-lb
  namespace: kube-system
spec:
  externalTrafficPolicy: Local
  healthCheckNodePort: 31386
  ports:
  - name: http
    nodePort: 30782
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    nodePort: 30330
    port: 443
    protocol: TCP
    targetPort: 443
  selector:
    app: ingress-nginx
  type: LoadBalancer
  • 查看结果
# kubectl get svc -A|grep LoadBalancer
kube-system       nginx-ingress-lb              LoadBalancer   172.21.7.221    39.xxx.xxx.45      80:30782/TCP,443:30330/TCP                                                                                                397d

4. ExternalName

4.1概念

创建一个dns别名指到service name上,主要是防止service name发生变化,要配合dns插件使用

5. HeadLessService

5.1 概念

  • 作用:
    不给service分配集群IP,则访问service的时候会暴露后端pod的IP。
  • 应用
    有状态的pod通常使用这种service,如mysql集群、monogdb集群等
  • 操作
    只需要将spec.clusterIP的值设置为none

5.2 示例

以StatefulSet 创建mongo为例,其中service如下

  • yml文件
apiVersion: v1
kind: Service
metadata:
  name: headless-mongo
  namespace: mongodb
  labels:
    name: mongo
spec:
  selector:
    role: mongo
  ports:
  - port: 27017
    targetPort: 27017
  clusterIP: None
  • 查看结果
# kubectl get service -n  mongodb
NAME                       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
headless-mongo            ClusterIP   None         <none>        27017/TCP   32m

6. 其他

6.1 local模式

  • 作用
    service默认会代理所有node节点上的pod,而local模式下poxy仅代理本节点上的pod。
  • 解决问题
    服务A通过service访问pod B,podB 显示的对方访问地址是proxy的node节点的IP。
    使用lcoal模式会显示服务A的真实IP
  • 示例

示例说明:
以某项目中阿里云环境的emqx为例,无法获取到设备真实IP(客户环境资金很死,没法使用LoadBalancer)
我们把三个pod固定在三个打标签的node节点上,然后service使用local模式。
当然最好三个pod反亲和。

spec:
  externalTrafficPolicy: Local
  ports:
  - name: mqtt

当然,我们在阿里云上也可以直接在控制台界面上操作。

6.2 Pod的会话保持

spec.sessionAffinity支持以下值:
None:取消session(默认模式)
ClientIP:session保持,同一ip访问同一个pod

kind: Service
apiVersion: v1
metadata:
  name: nginx-test
  namespace: test
  labels:
    name: nginx-test
spec:
  type: NodePort
  sessionAffinity: ClientIP
  ports:
  - name: web01
    nodePort: 31081
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-test

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值