k8s-Service网络服务

Service概念

会话保持

多端口设置

Service暴露到集群外部

服务发现

Service概念

Service主要用于提供网络服务,通过Service的定义,能够为客户端应用提供稳定的访问地址(域名或IP地址)和负载均衡功能,以及屏蔽后端Endpoint的变化,是k8s实现微服务的核心资源。

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: d1
spec:
  selector:
    matchLabels:
      app: v1 
  replicas: 2  
  template:
    metadata:
      labels:
        app: v1
    spec:
      containers:
        - name: myapp01
          image: 192.168.180.129:9999/myharbor/myapp:v1
          imagePullPolicy: IfNotPresent
          ports:
            - name: tomcatport
              containerPort: 8080
          command: ["nohup","java","-jar","/usr/local/test/dockerdemo.jar","&"]
复制代码

创建了两个pod,如果要访问pod内部的接口,只能是根据pod的ip:port

定义Service主要注意的是两个端口还有Service的标签选择器选择的是pod不是deployment。

复制代码
apiVersion: v1
kind: Service
metadata:
  name: svc1
spec:
  ports:
  - protocol: TCP
    port: 18080 #service自身的端口,对应客户端的端口
    targetPort: 8080 #对应容器内的端口
  selector:
    app: v1
复制代码

查看service详细信息和对应后端的endpoints列表。

kubectl describe svc svc1

kubectl get svc

kubectl get endpoints

通过访问Service的ip,将请求转发到后端pod,请求访问了两次,分别转发到了两个不同的pod容器。

会话保持

Sercice可以通过设置做到首次将某个客户端来源IP发起的请求转发到后端的某个pod上,之后从相同的客户端IP发起的请求都将被转发到相同的后端Pod上。同时用户可以设置会话保持的最长时间,在此时间之后重置客户端来源ip的保持规则。

复制代码
apiVersion: v1
kind: Service
metadata:
  name: svc1
spec:
  ports:
  - protocol: TCP
    port: 18080 #service自身的端口,对应客户端的端口
    targetPort: 8080 #对应容器内的端口
  selector:
    app: v1
  sessionAffinity: ClientIP #会话保持
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 60 #单位秒
复制代码

apply和create的区别是apply是更新操作。可以看出三次访问都转发到了同一个pod,后边的三次78的是过了一分钟后,会话重置了。

多端口设置

pod中存在多个容器时,每个容器对应各自的端口,此时就需要用到service多端口映射。

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: d1
spec:
  selector:
    matchLabels:
      app: v1 
  replicas: 2  
  template:
    metadata:
      labels:
        app: v1
    spec:
      containers:
        - name: myapp01
          image: 192.168.180.129:9999/myharbor/myapp:v1
          imagePullPolicy: IfNotPresent
          ports:
            - name: tomcatport
              containerPort: 8080
          command: ["nohup","java","-jar","/usr/local/test/dockerdemo.jar","&"]
        - name: nginx
          image: nginx
          ports:
            - name: nginxport
              containerPort: 80
复制代码

在service中配置多个映射内部容器的端口,多端口情况下需要配置name字段。

复制代码
apiVersion: v1
kind: Service
metadata:
  name: svc1
spec:
  ports:
  - name: p1
    protocol: TCP
    port: 18080 #service自身的端口,对应客户端的端口
    targetPort: 8080 #对应容器内的端口
  - name: p2
    protocol: TCP
    port: 28080 #service自身的端口,对应客户端的端口
    targetPort: 80 #对应容器内的端口
  selector:
    app: v1
复制代码

Service暴露到集群外部

ClusterIP

默认类型,虚拟服务IP地址,该地址用于K8S集群内部的pod访问。

NodePort

使用宿主机的端口,外部客户端通过任意Node的IP和设定的端口都可以访问服务。

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: d1
spec:
  selector:
    matchLabels:
      app: v1 
  replicas: 2  
  template:
    metadata:
      labels:
        app: v1
    spec:
      containers:
        - name: myapp01
          image: 192.168.180.129:9999/myharbor/myapp:v1
          imagePullPolicy: IfNotPresent
          ports:
            - name: tomcatport
              containerPort: 8080
          command: ["nohup","java","-jar","/usr/local/test/dockerdemo.jar","&"]
复制代码
复制代码
apiVersion: v1
kind: Service
metadata:
  name: svc1
spec:
  type: NodePort
  ports:
  - name: p1
    protocol: TCP
    port: 18080 #service自身的端口,对应客户端的端口
    targetPort: 8080 #对应容器内的端口
    nodePort: 30000 #将这个端口映射到每一台node上,通过任意一个nodeIp:nodePort都能映射到容器内部
  selector:
    app: v1
复制代码

服务发现 

环境变量方式

声明两个Deployment每个有两个pod副本,在创建两个Service。

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: d1
spec:
  selector:
    matchLabels:
      app: v1 
  replicas: 2  
  template:
    metadata:
      labels:
        app: v1
    spec:
      containers:
        - name: myapp01
          image: 192.168.180.129:9999/myharbor/myapp:v1
          imagePullPolicy: IfNotPresent
          ports:
            - name: tomcatport
              containerPort: 8080
          command: ["nohup","java","-jar","/usr/local/test/dockerdemo.jar","&"]
复制代码
复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: d2
spec:
  selector:
    matchLabels:
      app: v2 
  replicas: 2  
  template:
    metadata:
      labels:
        app: v2
    spec:
      containers:
        - name: myapp01
          image: 192.168.180.129:9999/myharbor/myapp:v1
          imagePullPolicy: IfNotPresent
          ports:
            - name: tomcatport
              containerPort: 8080
          command: ["nohup","java","-jar","/usr/local/test/dockerdemo.jar","&"]
复制代码
复制代码
apiVersion: v1
kind: Service
metadata:
  name: svc1
spec:
  ports:
  - protocol: TCP
    port: 18080 #service自身的端口,对应客户端的端口
    targetPort: 8080 #对应容器内的端口
  selector:
    app: v1
复制代码
复制代码
apiVersion: v1
kind: Service
metadata:
  name: svc2
spec:
  ports:
  - protocol: TCP
    port: 28080 #service自身的端口,对应客户端的端口
    targetPort: 8080 #对应容器内的端口
  selector:
    app: v1
复制代码

进入d1中的一个pod,查看环境变量。可以看到SVC1和SVC2的IP和端口。

使用环境变量中的IP和端口访问Service

DNS方式

直接使用Service的名称访问服务也可以。

 

posted @   顶风少年  阅读(349)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
历史上的今天:
2020-09-03 JDK源码之LinkedList
2019-09-03 Oracle之PL/SQL
返回顶部
点击右上角即可分享
微信分享提示