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
各属性的说明:
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