kubernetes 实践五:Service详解

Service 是 k8s 的核心概念,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。

Service 的定义

Service YAML格式的定义文件如下:

apiVersion: v1      // Required
kind: Service       // Required
metadata:           // Required
  name: string      // Required
  namespace: string // Required
  labels:
    - name: string
  annotations:
    - name: string
  spec:             // Required
    selectors: []   // Required
    type: string    // Required
    clusterIP: string
    sessionAffinity: string
    ports:
      - name: string
        protocol: string
        port: int
        targetPort: int
        nodePort: int
    status:
      loadBalancer:
        ingress:
          ip: string
          hostname: string

各属性的说明:

kubernetes 实践五:Service详解
kubernetes 实践五:Service详解
kubernetes 实践五:Service详解
kubernetes 实践五:Service详解

Service的基本用法

一般k8s的Pod都会以RC或者Deployment对外进行发布,并使用TCP/IP+Port的方式使得外部可以访问内部得服务。例如一个提供Web服务RC,由两个tomcat容器组成,每个容器都通过containerPort设置服务得端口号为8080。

# webapp-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: webapp
spec:
  replicas: 2
  template:
    metadata:
      name: webapp
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: tomcat
        ports:
          - containerPort: 8080  ## containerPort 要和 镜像暴露得端口要一直。

创建该RC:

kubectl apply -f webapp-rc.yaml

创建成功之后:

NAME           READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
webapp-nfrzq   1/1     Running   0          96s   10.244.1.44   k8s-node1    <none>           <none>
webapp-sxlmk   1/1     Running   0          96s   10.244.0.73   k8s-master   <none>           <none>

这样就可以使用Pod得IP+Port得方式访问Tomcat服务了:

# curl 10.244.1.44:8080
# curl 10.244.0.73:8080

但是以这种方式访问服务是有问题得,首先我们需要知道每个Pod得地址,如果该Pod故障,就需要切换使用另一个Pod得IP。所以k8s中Service组件就是用于解决这些问题的。

Service的简单使用

创建Service有两种方法,使用命令kubectl export或者根据定义文件创建。

先来使用命令创建Service,例如为之前的RC提供一个Service,使用命令如下:

[root@k8s-master service]# kubectl expose rc webap
[root@k8s-master service]# kubectl get svc webapp
NAME     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
webapp   ClusterIP   10.107.38.14   <none>        8080/TCP   27s

创建Service后就可以直接使用Service的IP:Port的格式访问服务,请求会被自动负载分发到后端的Pod上。

我们还可以使用yaml定义文件创建Service,定义文件如下:

apiVersion: v1
kind: Service
metadata:
  name: webapp
spec:
  ports:
    - port: 8081
      targetPort: 8080
  selector:
    app: webapp

创建该Service:

[root@k8s-master service]# kubectl create -f webapp-svc.yaml  
service/webapp created
[root@k8s-master service]# kubectl get svc webapp
NAME     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
webapp   ClusterIP   10.109.63.40   <none>        8081/TCP   7s
上一篇:cube-ui 重构饿了吗Webapp的 scroll-nav域名插槽问题


下一篇:springboot结合jsp页面详解