负载均衡

集群内如何访问一个微服务

当我们使用kubernetes发布我们的微服务后(deployment对象),那么在其他的容器中,我们要怎样去访问这个微服务呢?

假设我们发布了一个服务(deployment),名字叫web1,它提供8080端口的服务,yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web1
spec:
  selector:
    matchLabels:
      app: web1
  replicas: 3
  template:
    metadata:
      labels:
        app: web1
    spec:
      containers:
      - name: web1
        image: xxxx:latest
        ports:
        - containerPort: 8080
          protocol: TCP

此时,我们再创建一个同名的Service对象,那么我们便可以在其他的容器中通过curl web1:8080的方式来访问该微服务,如果是其他命名空间的Pod,则可以通过curl web1.default:8080来访问该微服务

apiVersion: v1
kind: Service
metadata:
  name: web1
spec:
  selector:
    app: web1
  ports:
  - name: default
    protocol: TCP
    port: 8080
    targetPort: 8080

Service

为什么我们创建了一个与deployment同名的service对象,就可以通过web1:8080来访问这个微服务了呢?这个微服务发布了三个实例(Pod),那么这三个Pod之间是如何实现负载均衡的呢?

我们先来回答最后一个问题,这三个Pod之间是如何实现负载均衡的。

每创建一个Service对象,k8s便会自动生成一个同名的Endpoints对象。我们创建了如上的Service对象后,通过kubectl get ep web1可以看到看到该Service对应的Endpoints

$ kubectl get ep web1
NAME      ENDPOINTS                                                  AGE
web1      172.26.93.201:8080,172.26.93.202:8080,172.26.93.203:8080   8s

Last updated

Was this helpful?