Kubernetes核心概念之Service详解

    Service是k8s中非常重要的组成单元,作用是作为代理把在POD中容器内的服务发布出去,提供一套简单的发现机制和服务代理,也就是运维常说的‘前端’概念,那么它如何实现代理功能以及自动伸缩服务架构,下面将在本文中详细说明。


K8S.jpg

Service主要的功能是映射pod对应的端口到宿主机上(代理),或是做负载均衡,还可以将内部IP发布成外部IP

一.服务代理

1.首先创建RC的Pod(使用的是上一节的脚本)

vim rc.json

{
"apiVersion": "v1",
"kind": "ReplicationController",
"metadata": {        //设置rc的元数据
    "name": "nginx-rc"
},
"spec": {            //设置rc的具体规格
    "replicas": 2,    //设置Pod的具体数量
    "selector": {        //通过selector来匹配相应的Pod的label
        "name": "myservice"
    },
    "template": {    //设置Pod的模板
        "metadata": {
            "labels": {
                "name":"myservice"
        }
    },
        "spec": {
                "containers": [{
                       "name": "nginx",
                       "image": "nginx",
               "imagePullPolicy": "IfNotPresent",    //镜像拉取策略,分为Always,Never,IfNotPresent,默认是Always
                       "ports": [{
                          "containerPort": 80
           }]
            }]
          }
    }
}
}

kubectl create -f rc.json

kubectl get pod

1.png

2.创建Service

①cat myservice.yaml

apiVersion: v1
kind: Service
metadata:
  name: myservice        #设定Service名称,必须唯一
spec:
  selector:
    name: myservice        #要匹配的Pod的Label
  ports:                    #设置端口转发规则
  - port: 80
    targetPort: 80
    protocol: TCP

②.kubectl create -f myservice.yaml

service "myservice" created

③.kubectl get service

ser1.png

现有两个service,第一个是系统自动分配的service,下面一个可以看到咱们自己创建的service,访问集群的IP是10.254.204.76,开放端口是80

④.kubectl describe service

ser2.png

Endpoints就是连接后端的Pod的容器的ip地址,因为通过Label成功连接上了Pod,现在访问clusterip将被转发到后端的Pod中

blob.png

3.代理其他后端

①代理Mysql服务器

vim mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    name: mysql
  ports:
  - port: 3306
    targetPort: 3306
    protocol: TCP

②设置后端ip(缩进一定要正确,不然会报错)

apiVersion: v1
kind: Endpoints
metadata:
  name: mysql
subsets:
  - addresses:
      - ip: 192.168.66.109    #节点ip
    ports:
      - port: 3306

③创建Service和Endpoints

kubectl create -f mysql-endpoints.yaml-f mysql-service.yaml

④查看Endpoints

kubectl describe ep

blob.png

二.自动更新

1.将Pod数量缩减为一个

kubectl scale replicationcontroller --replicas=1 nginx-rc

replicationcontroller "nginx-rc" scaled

kubectl get rc

rc1.png

2.查看Service更新情况

kubectl describe service

blob.png

三.发布Service

由于代理ip10.254.204.76不能通过外部访问,但是web服务需要暴露到外网,这就需要一层转发机制

1.NodePort Service

①创建NodePort Service

vim nodeport-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  type: NodePort

kubectl create -f nodeport-service.yaml

②查询NodePort Service

kubectl describe service my-nginx

blob.png

K8S创建了一个NodePort,范围是3000-32767,这里就可以通过30664端口访问到web服务,形式是NodeIP:NodePort,如果NodeIP是外网IP则将把流量分发给后端服务器

二.LoadBalancer与外部ip的指定

1.可以再K8S上指定一个不由K8S维护的外部IP,在外部访问时直接使用这个IP就可以把请求分发到后端服务器

①创建Service

vim loadbalancer.yaml 

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
spec:
  selector:
    app: nginx
  externalIPs: ["121.100.110.88"]      #指定一个外部IP
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  type: LoadBalancer        #类型负载均衡

kubectl create -f loadbalancer.yaml

②查询LoadBalancer Service

kubectl describe service my-nginx

blob.png

此时外部访问这个集群的方式为,http://121.100.110.88:31119

其实Service的内容远远不止这些,这些是一些比较常用的功能,如果在平时用到可以参考一下,下节讲解存储Volume

猜你喜欢

转载自blog.51cto.com/forall/2132440