Service 是 k8s 中非常重要的组成单元, 作用是作为代理把在 POD 中容器内的服务发布出去, 提供一套简单的发现机制和服务代理, 也就是运维常说的'前端'概念, 那么它如何实现代理功能以及自动伸缩服务架构, 下面将在本文中详细说明.
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
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
现有两个 service, 第一个是系统自动分配的 service, 下面一个可以看到咱们自己创建的 service, 访问集群的 IP 是 10.254.204.76, 开放端口是 80
.kubectl describe service
Endpoints 就是连接后端的 Pod 的容器的 ip 地址, 因为通过 Label 成功连接上了 Pod, 现在访问 clusterip 将被转发到后端的 Pod 中
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
二. 自动更新
1. 将 Pod 数量缩减为一个
- kubectl scale replicationcontroller --replicas=1 nginx-rc
- replicationcontroller "nginx-rc" scaled
- kubectl get rc
2. 查看 Service 更新情况
kubectl describe service
三. 发布 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
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
此时外部访问这个集群的方式为, http://121.100.110.88:31119
其实 Service 的内容远远不止这些, 这些是一些比较常用的功能, 如果在平时用到可以参考一下, 下节讲解存储 Volume
来源: http://blog.51cto.com/forall/2132440