一、什么是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:使用云提供商的负载均衡器公开服务