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
合集:
《kubernetes》
, 第一章 原理和对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!