Service 的功能:
- Service主要用于提供网络服务,通过Service的定义,能够为客户端应用提供稳定的访问地址(域名或IP地址)和负载均衡功能,以及屏蔽后端Endpoint的变化,是K8s实现微服务的核心资源。
Service主要解决了什么问题:
- 引入Service主要是解决Pod的动态变化,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。
- 由于pod的不稳定性,比如水平扩展时,pod异常时生成新的pod,都会让pod拥有新的ip地址,这不利于前端的访问,所以需要把pod绑定到固定的IP(域名)上,所以Service就出现了。
本文主要介绍Service的创建方法,命令行模式和声明模式,
Service主要是为Pod提供统一访问入口的资源对象,所有需要先创建一个pod
-
创建Pod
kubectl run nginx --image=nginx --port=80 --labels="app=nginx"
kubectl run nginx
: 创建一个名为nginx的pod--image=nginx
:使用nginx镜像文件--port=80
:声明服务的端口--labels="app=nginx"
:给pod打上标签
note: 如果pod想要外部访问,必须打上标签
-
命令行模式创建service并绑定“ app = nginx” 的pod
kubectl expose pod nginx --port=80 --target-port=80 --type=NodePort
kubectl expose pod nginx
: 创建一个svc,svc的名称就是nginx,自动选择nginx pod的标签--port=80
: svc的端口--target-port=80
:容器的端口--type=NodePort
:svc的类型,NodePort模式,会自动把svc的80端口映射到所有node主机的随机端口(端口范围:30000-32767),这样客户端可以通过任意node主机的IP + 端口访问到Pod。
svc的几种类型
类型 | 描述 |
---|---|
ClusterIP | 集群内部使用 |
NodePort | 对外暴露应用端口(集群外可访问) |
LoadBalancer | 对外暴露应用,将Service映射到一个已存在的负载均衡器的IP地址上,适合公有云 |
ExternalName | 将Service映射为一个外部域名地址,通过externalName字段进行设置 |
查看svc
# kubectl get svc nginx -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx NodePort 10.105.125.73 <none> 80:30974/TCP 12m app=nginx
CLUSTER-IP
: Service地址(是一个不会变化的ip地址)PORT(S)
: svc端口和node端口的映射SELECTOR
: 通过标签选择绑定哪些Pod
由于已经通过NodePort模式将svc的端口映射到了node主机的 30974 端口,即可以通过node的ip加端口访问到Pod的服务
-
通过yaml 文件声明式的创建svc
编写yaml文件# cat nginx.yaml
apiVersion: v1 # api版本 kind: Service # 绑定资源类型,首字符必须大写 metadata: # metadata 元数据name: nginx-svc # 定义 svc的名称labels: # 下面是定义标签tier: frontend spec: # 规格ports: # 定义端口,svc和pod- port: 80 # svc的端口protocol: TCP # 协议targetPort: 80 # 容器的端口selector: # 标签选择app: nginxtype: NodePort # svc 类型
创建svc(svc 是service的简写)
查看那些资源对象存在简写:
kubectl api-resources
# kubectl create -f nginx.yaml
查看svc
# kubectl get svc nginx-svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR nginx-svc NodePort 10.107.55.165 <none> 80:32238/TCP 5m40s app=nginx
-
-
o wide
: 显示更多信息svc nginx-svc的类型为 NodePort 同样可以通过 node的ip加端口访问到pod 里的容器服务。
Additional information:
可以使用命令行创建svc的使用使用 -o yaml输出yaml格式信息。
例如:
kubectl expose pod nginx --port=80 --target-port=80 --type=NodePort --dry-run=client -o yaml
apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:app: nginxname: nginx
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:app: nginxtype: NodePort
status:loadBalancer: {}
--dry-run=client
: 以客户端的模式运行(运行测试并不生效)-o yaml
:以yaml格式输出
--dry-run=client
,以客户端的方式尝试运行,配置 -o yaml 输出简略的信息
--dry-run=server
,以服务端的方式运行,配合-o yaml 输出非常详细的信息
kubectl expose pod nginx --port=80 --target-port=80 --type=NodePort --dry-run=server -o yaml
Error from server (AlreadyExists): services "nginx" already exists
- 在server模式下,由于 svc nginx 已经存在所以报错,删除svc nginx即可正常显示