kubernetes 我不明白为什么要用无头服务

o0lyfsai  于 2023-11-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(96)

很多这样的网站都说无头服务的好处是直接检测Pod的IP地址,直接访问Pod。但是这个解释对我来说没有意义。原因是即使我们不使用无头服务,我们仍然可以直接访问Pod。
我认为下面的例子:

  • 1 pod(这是客户端)
  • 3 pod由StatefulSet管理

1.使用无头服务

apiVersion: v1
kind: Service
metadata:
  name: my-headless-service
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  serviceName: my-headless-service
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx
          ports:
            - name: http
              containerPort: 8080
---
# Client Pod
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    name: myapp
spec:
  containers:
  - name: myapp
    image: willfarrell/ping
    ports:
    - containerPort: 8080

字符串
从名为myapp-pod的Pod中,我们可以访问由StatefulSet管理的每个Pod,如下所示

ping my-statefulset-0.my-headless-service
ping my-statefulset-1.my-headless-service
ping my-statefulset-2.my-headless-service


1.没有无头服务

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  serviceName: my-service
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx
          ports:
            - name: http
              containerPort: 8080
---
# Client Pod
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    name: myapp
spec:
  containers:
  - name: myapp
    image: willfarrell/ping
    ports:
    - containerPort: 8080


从名为myapp-pod的Pod中,我们还可以访问由StatefulSet管理的每个Pod,如下所示

ping my-statefulset-0.my-service
ping my-statefulset-1.my-service
ping my-statefulset-2.my-service


这样我们就可以访问StatefulSet管理的Pod,而不需要headless service。
1(使用无头服务)和2(不使用无头服务)有什么区别吗?

js81xvg6

js81xvg61#

  • 无头服务是一种没有CluserIP的非负载平衡服务,因此无法暴露在集群之外。这也为您的关键服务提供了安全性
  • 当客户端希望一次连接到一个或所有pod时,它非常有用-数据库(如MongoDB)利用无头服务执行复制
  • 当你查询一个无头服务时,你会(动态地)获取服务后面所有Pod的IP,而不是像常规服务那样只获取一个Pod的IP。
  • 在您的示例中,您需要提前知道有多少个Pod及其CDN。没有无头服务,它既不理想也不动态。

进一步探索的好文章:https://www.goglides.dev/bkpandey/headless-services-in-kubernetes-what-why-and-how-39fl

相关问题