Service
Service 概述
Service
是 Kubernetes
最核心概念, 通过创建 Service
,可以为一组具有相同功能的容器应用提供一个统一的入口地 址, 并且将请求负载分发到后端的各个容器应用上。
Service的类型
ClusterIP
ClusterIP是默认的Service类型。它为在同一Kubernetes集群中的Pod提供一个稳定的虚拟IP地址。通过ClusterIP,可以在集群内部通过这个IP地址访问Service提供的应用程序。这种Service类型适用于集群内部的服务通信。
NodePort
NodePort类型的Service将在每个节点上绑定一个固定的端口,并将流量转发到后端Pod。这样,可以通过任何节点的IP地址和该固定端口来访问Service。NodePort适用于集群外部的访问,但不适合生产环境,因为端口范围有限。
LoadBalancer
LoadBalancer类型的Service将使用云提供商的负载均衡器来暴露Service。该负载均衡器会动态分配一个外部的IP地址,并将流量转发到后端Pod。这种Service类型适用于公共云环境,可以通过外部IP地址直接访问Service。但是,需要注意的是,LoadBalancer类型的Service只在云提供商支持的情况下才可用。 除了这三种常见的Service类型,Kubernetes还支持其他类型的Service,如ExternalName和Headless Service,它们用于特定的使用场景和需求。
Service的定义
1、yaml格式的Service定义文件
apiVersion: v1 #必须 kind: Service #必须 metadata: #必须 name: string #必须 namespace: string #必须 labels: - name: string annotations: - name: string spec: #必须 selector: #必须 key: volume #必须 type: string #必须 clusterIP: string sessionAffinity: string ports: - name: string protocol: string port: int targetPort: int nodePort: int status: loadBalancer: ingress: ip: string hostname: string
Service基本用法
一般来说, 对外提供服务的应用程序需要通过某种机制来实现, 对于容器应用最简便的方式就是通过 TCP/IP
机制及 监听 IP
和端口号来实现。 创建一个基本功能的 Service
。
apiVersion: v1 kind: ReplicationController metadata: name: mytomcat spec: replicas: 2 selector: app: mytomcat template: metadata: labels: app: mytomcat spec: containers: - name: mytomcat image: reg.harbor.com/public/tomcat:latest imagePullPolicy: IfNotPresent ports: - containerPort: 8080
上述是创建一个RC资源的yaml文件,通过执行如下命令创建RC资源
[root@master1 rc]# kubectl apply -f mytomcat.yml replicationcontroller/mytomcat created
我们可以通过配置文件来定义 Service
, 再 通过kubectl create
来创建, 这样可以通过 Service
地址来访问后端的 Pod
。
apiVersion: v1 kind: Service metadata: labels: app: mytomcat name: web2 spec: ports: - port: 8080 protocol: TCP targetPort: 8080 selector: app: mytomcat type: NodePort status: loadBalancer: {}
[root@master1 rc]# kubectl apply -f web2.yaml service/web2 created [root@master1 rc]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 22d web2 NodePort 10.1.90.208 <none> 8080:35485/TCP 9s
这样可以通过访问Node节点的IP:35485去访问tomcat业务。
多端口Service
有时一个容器应用也可能需要提供多个端口的服务, 那么在 Service
的定义中也可以相应地设置为将多个端口对应 到多个应用服务。
apiVersion: v1 kind: Service metadata: labels: app: myapp name: web3 spec: ports: - port: 8080 name: web protocol: TCP targetPort: 8080 - port: 8081 name: management protocol: TCP targetPort: 8081 selector: app: myapp type: NodePort status: loadBalancer: {}