Kubernetes核心概念之Service详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes核心概念之Service详解相关的知识,希望对你有一定的参考价值。
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
以上是关于Kubernetes核心概念之Service详解的主要内容,如果未能解决你的问题,请参考以下文章