前言
最近意识到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的主要功能包括:
服务发现:为一组Pod提供统一的访问入口,使其他组件可以通过Service名称访问这些Pod。
负载均衡:在多个Pod之间分发流量,提高应用的可用性和性能。
网络代理:为Pod提供稳定的网络地址,即使Pod的IP地址发生变化,Service的地址保持不变。
暴露服务:可以将服务暴露给集群内部或外部的客户端访问。
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札记,一起交流数据库与云原生技术。欢迎觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!谢谢大家。