K8S对象-Service

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

posted on   运维开发玄德公  阅读(28)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示