Kubernetes Service基础


2019年11月07日 13:29:07   1,436 次浏览

Kubernetes可以为一组具有相同功能的Pod提供一个统一的入口地址,并且将请求均衡的转发到各个对应的Pod上。本节主要记录Service的一些基本用法。

基本用法

创建一个Tomcat RC(tomcat-rc.yml):

apiVersion: v1
kind: ReplicationController
metadata:
  name: tomcat-rc
spec:
  replicas: 2
  selector:
    name: tomcat
  template:
    metadata:
      name: tomcat
      labels:
        name: tomcat
    spec:
      containers:
        - name: tomcat
          image: tomcat
          ports:
            - containerPort: 8080

创建该RC:

我们可以通过Node IP + Container Port在Kubernetes集群中访问Tomcat:

由于Pod是Kubernetes集群范围内的虚拟概念,集群外的客户端无法通过Pod的IP和端口访问,我们可以将Pod的端口号映射到宿主机,以使客户端应用能够通过物理机访问容器应用,修改刚刚的tomcat-rc.yml,添加hostPort:

apiVersion: v1
kind: ReplicationController
metadata:
  name: tomcat-rc
spec:
  replicas: 2
  selector:
    name: tomcat
  template:
    metadata:
      name: tomcat
      labels:
        name: tomcat
    spec:
      containers:
        - name: tomcat
          image: tomcat
          ports:
            - containerPort: 8080
              hostPort: 8081 # 新增

更新该RC:

可以看到tomcat pod被分配到了node1和node2上,所以我们可以在宿主机外使用或者访问tomcat:

但是我们知道,Pod的IP地址是不可靠的,例如当Pod所在的Node发生故障时,Pod将被Kubernetes重新调度到另一个Node,Pod的IP地址将发生变化。所以我们可以定义一个tomcat pod的统一访问入口,这就是Service的作用。

创建Service有两种方式:

1.kubectl expose命令来创建Service

kubectl expose rc tomcat-rc

现在我们就可以通过Service的clusterIP + Port来访问了:

Service地址10.1.187.222:8080均衡的负载到了两个tomcat pod上(10.244.1.19:8080和10.244.4.13:8080)

2.通过配置文件创建

定义一个tomcat-service.yml:

apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  ports:
    - port: 8081 # service端口
      targetPort: 8080 # 目标端口
  selector:
    name: tomcat # 选择器,选择name=tomcat的pod

创建该Service:

同样,Service默认是不能外部访问的,如果想让外部能够访问到tomcat service,我们也需要将Service的端口映射到物理机,修改上面的tomcat-service.yml:

apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  type: NodePort # 新增
  ports:
    - port: 8081
      targetPort: 8080
      nodePort: 30000 # 新增
  selector:
    name: tomcat

上面配置通过设置nodePort(范围30000-32767)映射到物理机,同时设置Service的类型为NodePort,创建该Service:

现在我们就可以通过宿主机的IP+30000访问tomcat了:

负载均衡策略

Kubernetes Service提供了两种负载分发策略:RoundRobin和SessionAffinity:

  1. RoundRobin:轮询模式(默认),即轮询将请求转发到后端的各个Pod上。
  2. SessionAffinity:基于客户端IP地址进行会话保持的模式,即第1次将某个客户端发起的请求转发到后端的某个Pod上,之后从相同的客户端发起的请求都将被转发到后端相同的Pod上。可以通过设置service.spec.sessionAffinity=ClientIP来启用SessionAffinity策略:
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  type: NodePort
  sessionAffinity: ClientIP # 采用SessionAffinity策略
  ports:
    - port: 8081
      targetPort: 8080
      nodePort: 30000
  selector:
    name: tomcat

Headless Service

Headless Service不提供ClusterIP,仅通过Label Selector将后端的Pod列表返回给调用的客户端。

创建tomcat-headless-service.yml:

apiVersion: v1
kind: Service
metadata:
  name: tomcat-headless-service
spec:
  ports:
    - port: 8080
  clusterIP: None # 设置clusterIP为None,表示headless service
  selector:
    name: tomcat

创建该headless service:

发表评论

邮箱地址不会被公开。 必填项已用*标注