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

posted @ 2021-05-19 23:44  Hei蛋炒饭  阅读(164)  评论(0编辑  收藏  举报