一、service:pod是有生命周期的,我们想给客户一个固定的访问端点,在客户端与服务端之间启动一个固定的中间层,依赖于kubernetes的一个附件CoreDns。kubernetes有三类网路地址

1.node network           节点网路,实在存在的,配置在节点接口之上的

2.pod network             pod网络,实在存在的,配置在pod资源之上的

3.cluster network        集群地址,虚拟地址,仅出现service的规则当中

service:有三种工作模式

    userspace:用户空间,用户请求到达service以后,先把他转为本地监听在某个套接字上的用户空间的kube-proxy,由kube-proxy负责处理。kube-proxy处理完成以后再转给service ip 最终代理至这个service管理的各pod实现调度。效率很低,先到内核空间--->用户空间--->内核空间.是kube-proxy负责调度的

    iptables:客户端ip请求时直接请求service ip,请求报文在本地内核空间的service规则截取,进而直接调度给相关的pod。由iptables规则直接负责调度。1.10-之前用

    ipvs:客户端ip请求时直接请求service ip,请求报文在本地内核空间的service ipvs截取,进而直接调度给相关的pod。由ipvs规则直接负责调度。1.1.1+用的是ipvs

    service的pod资源发生改变,例如标签选择器适用的pod增加。适用的信息会立即反映到api server中,kube-proxy watch到api server中的变化 ,立即转为ipvs的规则。动态实时转换

使用清单创建service资源:

    获取service字段信息:kubectl explain service

type格式是clusterIP

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: redis
  5. namespace: default
  6. spec:
  7. selector:
  8. app: redis
  9. role: logstor
  10. clusterIP: 10.97.97.97
  11. type: ClusterIP
  12. ports:
  13. - port:
  14. targetPort:

type格式是nodeport,可以在集群外访问。通过访问每个节点的ip:nodeport

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: myapp
  5. namespace: default
  6. spec:
  7. selector:
  8. app: myapp
  9. release: canary
  10. clusterIP: 10.98.98.98 #如果将clusterIP设置为None就是无头的service,没有ip地址,但是可以通过名称myapp.defalut.svc.cluster.local.进行访问
    sessionAffinity: ClientIP
  11. type: NodePort
  12. ports:
  13. - port:
  14. targetPort:
  15. nodePort: 30080
    红色字体表示设置选择session保持

二、ingress Controller + service(仅用于对pod的分类,service关联的有几个pod,就是upstream后端pod) 实现

ingress基于service分类,识别出有几个pod和pod信息。并且把pod的信息(ip地址)生成配置信息,注入到ingress Controller

k8s还有yi一种引入集群外部流量的方式ingress,ingress资源是一种七层调度器,他利用一种七层pod来实现将外部流量引入到内部来。事实上他也脱离不了service的工作。 作为ingress 用于基于七层调度时,我们必须要用pod中的运行的七层服务功能的mirror调度。可用的解决方案nginx,haproxy等。

nginx

Traefik

Envooy(适用于微服务)

ingress的定义   kubectl explain ingress

安装ingress可以参照 https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md

用ingress-nginx代理到后端tomcat

定义后端tomcat的deployment和service

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: tomcat
  5. namespace: default
  6. spec:
  7. selector:
  8. app: tomcat
  9. release: canary
  10. ports:
  11. - name: http
  12. port:
  13. targetPort:
  14. - name: ajp
  15. port:
  16. targetPort:
  17.  
  18. ---
  19. apiVersion: apps/v1
  20. kind: Deployment
  21. metadata:
  22. name: tomcat-deploy
  23. namespace: default
  24. spec:
  25. replicas:
  26. selector:
  27. matchLabels:
  28. app: tomcat
  29. release: canary
  30. strategy:
  31. rollingUpdate:
  32. maxSurge:
  33. maxUnavailable:
  34. template:
  35. metadata:
  36. labels:
  37. app: tomcat
  38. release: canary
  39. spec:
  40. containers:
  41. - name: tomcat-container
  42. image: tomcat:8.5.-jre8-alpine
  43. imagePullPolicy: IfNotPresent
  44. ports:
  45. - name: http
  46. containerPort:
  47. - name: ajp
  48. containerPort:

vim ingress-tomcat.yaml

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: ingress-tomcat
  5. namespace: default
  6. annotations:
  7. kubernetes.io/ingress.clall: "nginx"
  8. spec:
  9. rules:
  10. - host: tomcat.yiruiduan.com
  11. http:
  12. paths:
  13. - path: /tomcat
  14. backend:
  15. serviceName: tomcat
  16. servicePort:

红色部分是想对应的,只有在同一个namespace才能找到后端的tomcat。ingress是通过service确定哪些是他的后端服务器的所以serviceName要和后端的service名称相同

注:根据url路径代理,后端的tomcat必须存在真是的path路径。即tomcat的pod中/usr/local/tomcat/webapps的目录下有tomcat路径,否则会返回404

构建https服务

创建secret对象 kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key

查看secret对象 kubectl get secret

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: ingress-tomcat-tls
  5. namespace: default
  6. annotations:
  7. kubernetes.io/ingress.clall: "nginx"
  8. spec:
  9. tls:
  10. - hosts:
  11. - tomcat.yiruiduan.com
  12. secretName: tomcat-ingress-secret
  13. rules:
  14. - host: tomcat.yiruiduan.com
  15. http:
  16. paths:
  17. - path: /tomcat
  18. backend:
  19. serviceName: tomcat
  20. servicePort:
  21. - path:
  22. backend:
  23. serviceName: tomcat
  24. servicePort:

访问测试:https://tomcat.yiruiduan.com:80443

kubernetes将集群外部流量引入集群内的更多相关文章

  1. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)

    原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...

  2. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress

    NodePort,LoadBalancer和Ingress之间的区别.它们都是将集群外部流量导入到集群内的方式,只是实现方式不同. ClusterIP ClusterIP服务是Kubernetes的默 ...

  3. 【Kubernetes】K8s笔记(十一):Ingress 集群进出流量总管

    目录 0. Ingress 解决了什么问题 1. Ingress Controller 2. 指定 Ingress Class 使用多个 Ingress Controller 3. 使用 YAML 描 ...

  4. 容器服务kubernetes federation v2实践五:多集群流量调度

    概述 在federation v2多集群环境中,通过前面几篇文章的介绍,我们可以很容易的进行服务多集群部署,考虑到业务部署和容灾需要,我们通常需要调整服务在各个集群的流量分布.本文下面简单介绍如何在阿 ...

  5. kubernetes (一)使用Rancher搭建集群

    目录 如何快速高效部署K8s集群 Rancher是什么 为什么是Rancher 1.0.安装Rancher 1.1.环境 1.2.选择Rancher版本 1.3.拉取镜像 2.0.容器启动高级选项 2 ...

  6. Kubernetes集群搭建之Etcd集群配置篇

    介绍 etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点. 简单 : 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过g ...

  7. Kubernetes使用集群联邦实现多集群管理

    Kubernetes在1.3版本之后,增加了“集群联邦”Federation的功能.这个功能使企业能够快速有效的.低成本的跨区跨域.甚至在不同的云平台上运行集群.这个功能可以按照地理位置创建一个复制机 ...

  8. Kubernetes v1.12/v1.13 二进制部署集群(HTTPS+RBAC)

    官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...

  9. MapReduce Service更换集群外部时钟源,仅需10步

    摘要:MapReduce Service 集群使用NTP进行时钟同步.本文简要介绍了MapReduce Service集群NTP机制及NTP的配置方式. 本文分享自华为云社区<MapReduce ...

随机推荐

  1. 第十一章 ZYNQ-MIZ702 DDR3 PS读写操作方案

      本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写. 本文所使用的开发板是Miz702 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4 11.0本章难度 ...

  2. 怎样获取xhr的当前状态

    一个XMLHttpRequets实例从创建到发起请求再到获取数据, 期间会有一些中间状态, 这些状态是必要的, 我们可以通过判断这些状态值来进行不同的动作. xhr中获取请求状态的属性是: xhr.r ...

  3. Mybatis 多个参数传入的多种方法

    ist<XXXBean> getXXXBeanList(HashMap map); <select id="getXXXBeanList" parameterTy ...

  4. HTTP协议探究(四):TCP和TLS优化

    一 复习与目标 1 复习 简单密码学.对称加密与非对称加密 数字签名.数字证书 SSL/TLS HTTPS = HTTP + SSL/TLS,SSL/TLS为HTTP提供了保密性.完整性和鉴别性 2 ...

  5. C语言快速判断素数——不超时

    这属于算法上的问题,好好考虑一下算法,还要考虑一下素数的定义. 素数是只有1和本身能整除的整数.所以在求素数的时候,要将素数与1到素数本身中间的所有整数都相除,看是否有整除的数,如果有,那肯定不是素数 ...

  6. go语言入门(8)异常处理

    1,error接口 Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下: type error interface { Error() strin ...

  7. QTP10破解步骤(亲试有效)

    QTP10破解步骤: 1.安装qtp,一路默认下来(一定要默认安装目录),一直到要求输入License的界面 2.拷贝mgn-mqt82.exe到C:\Program Files\Mercury In ...

  8. Shell脚本相关

    cat /proc/17616/cmdline 17616代表进程号 用这个可以完整打印出当前的进程的全名 当前shell的进程号.你可以使用ps -A 看你自己shell 的pid.是内置变量. $ ...

  9. Tomcat - Tomcat安装

    Tomcat官网:http://tomcat.apache.org/ 准备:JAVA环境布置完成 一.Windows平台 1. 版本选择 1) 进入官网 2) 查看版本匹配 官网说明 https:// ...

  10. 团队项目-Beta版本发布

    这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业要求链接 团队名称 众志陈成 这个作业的目标 通过团队协作了解软件开发的大致流程,并在这个过程中体会调整与优化程序的方法,为以后真实的软件开发奠 ...