首页 > 其他分享 >k8s-Service网络服务

k8s-Service网络服务

时间:2022-09-03 14:23:11浏览次数:60  
标签:网络服务 Service 端口 metadata v1 k8s spec name

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的名称访问服务也可以。

 

标签:网络服务,Service,端口,metadata,v1,k8s,spec,name
From: https://www.cnblogs.com/zumengjie/p/16634993.html

相关文章

  • 【云原生】K8s pod优雅退出(postStart、terminationGracePeriodSeconds、preStop)
    目录一、概述二、Pod的生命周期三、pod的终止过程四、钩子函数(postStart和preStop)五、示例演示一、概述更新部署服务时,旧的Pod会终止,新Pod上位。如果在这个部......
  • k8s中安装jenkins
    编写jenkins.yaml说明:容器跑起来后,jenkins的目录是/var/jenkins_home存储卷用的是hostPath,这里面我们指定pod调度到k8s-master01在k8s-master01上创建目录:mkdi......
  • 【云原生】k8s中volumeMounts.subPath的巧妙用法
    目录一、概述二、使用场景三、共享卷中使用,挂载多个路径四、ConfigMap和Secret中使用subPath一、概述有时,在单个Pod中共享卷以供多方使用是很有用的。volumeMou......
  • K8s - 重新生成token以及hash值(解决令牌过期的问题)
     当我们使用 kubeadminit 完成 Master 节点的安装后,界面上会输出如下 kubeadmjoin…… 命令。这个命令使用来将各个节点加入集群中。kubeadmjoin192.168.60......
  • k8s配置deployment的 liveness 和 readiness 探针
    1.概要我遇到的问题主要是,在部署的时候老的pod都是正常的,但是新部署的pod由于参数等配置错了,其实启动是有问题的。但是新的pod在启动3秒以后就把老的pod给干掉了,错误判断......
  • 使用axis2生成webService客户端代码并使用(做个记录)
    背景:公司以前用过一次axis2,调用webservice,但是因为过去大半年的时间当再一次有需求使用axis2的时候发现自己忘得差不多了,这里做一个记录.1)首先根据wsdl生成客户端代......
  • K8s cronjob Usage
    环境:Ubuntu20.04使用minikube创建nodeminikubestart--nodes2-pmultinode-demo创建完成之后使用下面的命令查看kubectlgetnodes#查看创建的nodeminikubes......
  • K8s包管理工具Helm v3(19)
    一、Helm概述官网:https://v3.helm.sh/zh/docs/https://helm.sh/helm官方的chart站点:https://hub.kubeapps.com/Helm是kubernetes的包管理工具,相当于linux环境......
  • IHostedService(BackgroundService)的启动和停止顺序
    一句话总结:按照Add顺序启动,先启动,后停止.Host源代码publicasyncTaskStartAsync(CancellationTokencancellationToken=default(CancellationToken)){ _hos......
  • K8S 设置node最大pod数量
    1.默认情况下k8s一个node最多起110个pod。2.在node上设置打开文件/var/lib/kubelet/config.yaml3.修改参数maxPods为指定的值。4.node端重启kubelet:systemctlrest......