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.yamlapiVersion: 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: nginx type: NodePort # svc 类型创建svc(svc 是service的简写) 查看那些资源对象存在简写: kubectl api-resources# kubectl create -f nginx.yaml查看svc # kubectl get svc nginx-svc -o wideNAME 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: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: 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即可正常显示



















