Service介绍

一、什么是Service?

	Service可以简单的理解为逻辑上的一组Pod。一种可以访问Pod的策略,而且其他Pod可以通过这个Service访问到这个Service代理的Pod。相对于Pod而言,它会有一个固定的名称,一旦创建就固定不变。
	可以简单的理解成访问一个或者一组Pod的时候,先访问service再去访的IP的,service的名称的固定的,不管你怎么重启Pod,Pod的IP怎么改变,都不影响用户的使用

二、创建一个简单的Service

[root@k8s-master01 ~]# cat nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-svc    #service 标签名字
  name: nginx-svc	  #service 固定名字
spec:
  ports:
  - name: http 		# Service端口的名称
    port: 80 	    # Service自己的端口, servicea --> serviceb http://serviceb,  http://serviceb:8080 
    protocol: TCP   # UDP TCP SCTP default: TCP
    targetPort: 80  # 后端应用的端口
  - name: https     
    port: 443
    protocol: TCP
    targetPort: 443
  selector:
    app: nginx
  sessionAffinity: None
  type: ClusterIP
  
# 创建一个service
[root@k8s-master01 ~]# kubectl create -f nginx-svc.yaml  

三、使用Service代理k8s外部应用

使用场景:

希望在生产环境中使用某个固定的名称而非IP地址进行访问外部的中间件服务
希望Service指向另一个Namespace中或其他集群中的服务
某个项目正在迁移至k8s集群,但是一部分服务仍然在集群外部,此时可以使用service代理至k8s集群外部的服务
# 创建一个类型为external的service(svc),这个svc不会自动创建一个ep
[root@k8s-master01 ~]# vim nginx-svc-external.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-svc-external
  name: nginx-svc-external
spec:
  ports:
  - name: http # Service端口的名称
    port: 80 # Service自己的端口, servicea --> serviceb http://serviceb,  http://serviceb:8080 
    protocol: TCP # UDP TCP SCTP default: TCP
    targetPort: 80 # 后端应用的端口
  sessionAffinity: None
  type: ClusterIP

# create svc
[root@k8s-master01 ~]# kubectl create -f nginx-svc-external.yaml 
service/nginx-svc-external created

# 查看svc
[root@k8s-master01 ~]# kubectl get svc
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes           ClusterIP   10.96.0.1       <none>        443/TCP          6d4h
nginx-svc            ClusterIP   10.96.141.65    <none>        80/TCP,443/TCP   4d3h
nginx-svc-external   ClusterIP   10.109.18.238   <none>        80/TCP           16s
# 手动创建一个ep,跟上面创建的svc关联起来
[root@k8s-master01 ~]# vim nginx-ep-external.yaml 
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    app: nginx-svc-external   #名字要跟svc的一致
  name: nginx-svc-external
  namespace: default
subsets:
- addresses:
  - ip: 220.181.38.148 
  ports:
  - name: http
    port: 80
    protocol: TCP
   
# create ep
[root@k8s-master01 ~]# kubectl create -f nginx-ep-external.yaml
endpoints/nginx-svc-external created

# 查看ep
[root@k8s-master01 ~]# kubectl get ep
NAME                 ENDPOINTS                                                               AGE
kubernetes           192.168.1.100:6443,192.168.1.101:6443,192.168.1.102:6443                6d4h
nginx-svc            172.161.125.15:443,172.162.195.15:443,172.169.244.194:443 + 9 more...   4d3h
nginx-svc-external   220.181.38.148:80                                                       35s

# 访问ep
[root@k8s-master01 ~]# curl 220.181.38.148:80 -I
HTTP/1.1 200 OK
Date: Sat, 26 Dec 2020 16:00:57 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sun, 27 Dec 2020 16:00:57 GMT
Connection: Keep-Alive
Content-Type: text/html

四、使用Service反代域名

cat > nginx-externalName.yaml  << EOF
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-externalname
  name: nginx-externalname
spec:
  type: ExternalName
  externalName: www.baidu.com
EOF

# create svc
[root@k8s-master01 ~]# kubectl create -f nginx-externalName.yaml
service/nginx-externalname created

# 查看svc
[root@k8s-master01 ~]# kubectl get svc
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
kubernetes           ClusterIP      10.96.0.1       <none>          443/TCP          6d4h
nginx-externalname   ExternalName   <none>          www.baidu.com   <none>           27s
nginx-svc            ClusterIP      10.96.141.65    <none>          80/TCP,443/TCP   4d3h
nginx-svc-external   ClusterIP      10.109.18.238   <none>          80/TCP           18m

五、SVC类型

ClusterIP:在集群内部使用,也是默认值

ExternalName:通过返回定义的CNAME别名

NodePort:在所有安装了kube-proxy的节点上打开一个端口,此端口可以代理至后端Pod,然后集群外部可以使用节点的IP地址和NodePort的端口号访问到集群Pod的服务。NodePort端口范围默认是30000-32767

LoadBalancer:使用云提供商的负载均衡器公开服务
原文地址:https://www.cnblogs.com/hsyw/p/14195074.html