k8s学习记录,Service(十二)
文章中资料参考来源2022 云原生Kubernetes全栈架构师
什么是Service
Service可以简单的理解为逻辑上的一组Pod。它是一种可以访问Pod的策略,而且其他Pod可以通过这个Service访问到这个Service代理的Pod应用。相对于Pod而言,它会有一个固定的名称,一旦创建就固定不变。
定义一个Service
#可以使用已有的svc导出修改
kubectl get svc -n kube-system kube-dns -oyaml > nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-svc
name: nginx-svc
spec:
ports:
- name: http # Service端口的名称
port: 80 # Service最的端口 servicea -> serviceb http://serviceb
protocol: TCP # UCP TCP SCTP default: TCP
targetPort: 80 #后端应用的端口
- name: https
port: 443
protocol: TCP
targetPort: 443
selector: # 这里的selector配置要和对应的pod匹配
app: nginx #匹配成功后会自动对pod的服务进行代理,并生成同名的endpoint
sessionAffinity: None
type: ClusterIP
创建完成后,要访问svc代理的后端Pod应用,可以直接通过 curl http://nginx-svc 来访问
如果是跨了namespace,则需要在svc后面加上namespace的名字 curl http://nginx-svc.default 【很少使用,不建议】
使用Service代理k8s外部服务
- 希望在生产环境中使用某个固定的名称而非IP地址进行访问外部的中间件服务
使用场景:某个项目正在迁移至k8s集群,但是一部分服务仍然在集群外部,此时可以使用service代理至k8s集群外部的服务
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
protocol: TCP # UCP TCP SCTP default: TCP
targetPort: 80 #后端应用的端口
sessionAffinity: None
type: ClusterIP
kubectl get ep nginx-svc -oyaml > nginx-svc-external-endpoint.yaml
#修改endpoint的yaml文件,大致如下配置
apiVersion: v1
kind: Endpoints
metadata:
labels:
app: nginx-svc-external #与service的名字一致
name: nginx-svc-external #与service的名字一致
namespace: default
subsets:
- addresses:
- ip: 39.156.69.79 #外部服务的IP地址,这里我是使用的百度的IP地址
ports:
- name: http #与service配置的name一致
port: 80
protocol: TCP
配置完成后,创建endpoing,并去访问service的内部地址,结果返回百度的响应内容
当我们的外部服务地址变更后,我们只需要去修改endpoint创建时所配置的外部IP地址和端口即可,这里我以淘宝网为例
apiVersion: v1
kind: Endpoints
metadata:
labels:
app: nginx-svc-external
name: nginx-svc-external
namespace: default
subsets:
- addresses:
- ip: 182.140.143.232 #外部服务的IP地址
ports:
- name: http
port: 80
protocol: TCP
使用Service反向代理外部域名【可能导致跨域问题】
- 创建yaml文件
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-externalname
name: nginx-externalname
spec:
type: ExternalName #type修改为ExternalName
externalName: www.baidu.com #反向代理的域名
-
创建nginx-externalname Service
-
进入容器中去验证Service反向代理的域名是否正常可用
Service常用的类型
-
ClusterIP:在集群内部使用,也是默认值
-
ExternalName:通过返回定义的CNAME别名
-
NodePort:在所有安装了kube-proxy的节点上打开一个端口,此端口可以代理至后端Pod,集群外部可以使用节点的IP地址和NodePort的端口号访问到集群Pod的服务,NodePort端口默认范围是:30000~32767【比如kubenetes-dashboard在创建时,创建了一个service,这个service的类型就是NodePort,通过访问宿主机的30328端口就可以访问到k8s集群内pod的服务】
-
LoadBalancer:使用云提供商的负载均衡器公开服务