k8s重要概念-0 Service

文摘   2024-09-11 09:49   上海  

前言

最近意识到k8s的重要性,又在重新学习。这一系列文章作一下简单的学习笔记。本文是第一篇,主要介绍一下k8s中的Service这一对象。

K8s Service 对象介绍

在Kubernetes中,Service是一个抽象概念,它定义了一组Pod的逻辑分组和访问策略。

k8s中的三种IP (预备知识)

Node IP:Node节点的IP地址 Pod IP: Pod的IP地址 Cluster IP: Service的IP地址

首先,Node IP是Kubernetes集群中节点的物理网卡IP地址(一般为内网),所有属于这个网络的服务器之间都可以直接通信,所以Kubernetes集群外要想访问Kubernetes集群内部的某个节点或者服务,肯定得通过Node IP进行通信(这个时候一般是通过外网IP了)

然后Pod IP是每个Pod的IP地址,它是Docker Engine根据docker0网桥的IP地址段进行分配的(我们这里使用的是flannel这种网络插件保证所有节点的Pod IP不会冲突)

最后Cluster IP是一个虚拟的IP,仅仅作用于Kubernetes Service这个对象,由Kubernetes自己来进行管理和分配地址,当然我们也无法ping这个地址,他没有一个真正的实体对象来响应,他只能结合Service Port来组成一个可以通信的服务。

Service的主要功能包括:

  1. 服务发现:为一组Pod提供统一的访问入口,使其他组件可以通过Service名称访问这些Pod。

  2. 负载均衡:在多个Pod之间分发流量,提高应用的可用性和性能。

  3. 网络代理:为Pod提供稳定的网络地址,即使Pod的IP地址发生变化,Service的地址保持不变。

  4. 暴露服务:可以将服务暴露给集群内部或外部的客户端访问。

Service的主要类型

  • ClusterIP:默认类型,仅在集群内部可访问。
  • NodePort:通过节点的静态端口暴露服务,可从集群外部访问。
  • LoadBalancer:使用云提供商的负载均衡器暴露服务。
  • ExternalName:将服务映射到外部DNS名称。

Service通过选择器(Selector)与Pod关联,确保流量被正确路由到匹配的Pod。

示例:定义一个简单的Service

# 定义一个Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
# 定义一个Service
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx

服务发现

对于在集群内运行的客户端,Kubernetes 支持两种主要的服务发现模式:环境变量和 DNS。

参加文献

1、https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/

2、https://www.qikqiak.com/k8s-book/docs/27.Service.html


欢迎关注公众号:DBA札记,一起交流数据库与云原生技术。欢迎觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!谢谢大家。

DBA札记
dba 数据库 知识科普 踩坑指南 经验分享 原理解读
 最新文章