kubernetes将集群外部流量引入集群内
一、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
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: redis
role: logstor
clusterIP: 10.97.97.97
type: ClusterIP
ports:
- port:
targetPort:
type格式是nodeport,可以在集群外访问。通过访问每个节点的ip:nodeport
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: 10.98.98.98 #如果将clusterIP设置为None就是无头的service,没有ip地址,但是可以通过名称myapp.defalut.svc.cluster.local.进行访问
sessionAffinity: ClientIP
type: NodePort
ports:
- port:
targetPort:
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
apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: default
spec:
selector:
app: tomcat
release: canary
ports:
- name: http
port:
targetPort:
- name: ajp
port:
targetPort: ---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
namespace: default
spec:
replicas:
selector:
matchLabels:
app: tomcat
release: canary
strategy:
rollingUpdate:
maxSurge:
maxUnavailable:
template:
metadata:
labels:
app: tomcat
release: canary
spec:
containers:
- name: tomcat-container
image: tomcat:8.5.-jre8-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort:
- name: ajp
containerPort:
vim ingress-tomcat.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat
namespace: default
annotations:
kubernetes.io/ingress.clall: "nginx"
spec:
rules:
- host: tomcat.yiruiduan.com
http:
paths:
- path: /tomcat
backend:
serviceName: tomcat
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
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat-tls
namespace: default
annotations:
kubernetes.io/ingress.clall: "nginx"
spec:
tls:
- hosts:
- tomcat.yiruiduan.com
secretName: tomcat-ingress-secret
rules:
- host: tomcat.yiruiduan.com
http:
paths:
- path: /tomcat
backend:
serviceName: tomcat
servicePort:
- path:
backend:
serviceName: tomcat
servicePort:
访问测试:https://tomcat.yiruiduan.com:80443
kubernetes将集群外部流量引入集群内的更多相关文章
- Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)
原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...
- Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress
NodePort,LoadBalancer和Ingress之间的区别.它们都是将集群外部流量导入到集群内的方式,只是实现方式不同. ClusterIP ClusterIP服务是Kubernetes的默 ...
- 【Kubernetes】K8s笔记(十一):Ingress 集群进出流量总管
目录 0. Ingress 解决了什么问题 1. Ingress Controller 2. 指定 Ingress Class 使用多个 Ingress Controller 3. 使用 YAML 描 ...
- 容器服务kubernetes federation v2实践五:多集群流量调度
概述 在federation v2多集群环境中,通过前面几篇文章的介绍,我们可以很容易的进行服务多集群部署,考虑到业务部署和容灾需要,我们通常需要调整服务在各个集群的流量分布.本文下面简单介绍如何在阿 ...
- kubernetes (一)使用Rancher搭建集群
目录 如何快速高效部署K8s集群 Rancher是什么 为什么是Rancher 1.0.安装Rancher 1.1.环境 1.2.选择Rancher版本 1.3.拉取镜像 2.0.容器启动高级选项 2 ...
- Kubernetes集群搭建之Etcd集群配置篇
介绍 etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点. 简单 : 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过g ...
- Kubernetes使用集群联邦实现多集群管理
Kubernetes在1.3版本之后,增加了“集群联邦”Federation的功能.这个功能使企业能够快速有效的.低成本的跨区跨域.甚至在不同的云平台上运行集群.这个功能可以按照地理位置创建一个复制机 ...
- Kubernetes v1.12/v1.13 二进制部署集群(HTTPS+RBAC)
官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...
- MapReduce Service更换集群外部时钟源,仅需10步
摘要:MapReduce Service 集群使用NTP进行时钟同步.本文简要介绍了MapReduce Service集群NTP机制及NTP的配置方式. 本文分享自华为云社区<MapReduce ...
随机推荐
- 第十二章 ZYNQ-MIZ702 PS读写PL端BRAM
本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将 ...
- 【Trie】Phone List
[题目链接]: https://loj.ac/problem/10049 [题意] 问是否存在一组公共前缀.如果存在输出“NO”,否则输出“YES” [题解] 首先建出Trie树来,然后开始记录所有的 ...
- ubuntu+nginx+uwsgi部署django web项目
前言 将本地开发的django项目部署至linux上的uwsgi服务器,并配置nginx,完成基于ubuntu+nginx+uwsgi的上线运行.下面整理相关步骤. 服务器配置virtualenv 如 ...
- 数据库(mysql和oracle)
1. mysql索引: https://www.jikewenku.com/22030.html 2.
- 图解Java继承内存分配
图解Java继承内存分配 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法. (3)子 ...
- docker启动mysql 自定义配置文件
命令行如下: docker run --name mysql56 -p : -v /home/mysql56/data:/var/lib/mysql -v /home/mysql56/conf:/et ...
- 事件处理程序EventUtil
/**********事件处理程序***********EventUtil.js*浏览器兼容,<高三>13章 P354*2014-12-8************************* ...
- javaIO——AutoCloseable 小试
前面在 IO 概述篇提到过,AutoCloseable 接口类会自动调用 close() 方法,那究竟具体怎么写呢?以及发生异常情况下或者多个资源是不是都能自动调用呢?我们来写一个简单的类测试一下就知 ...
- 小程序 ----踩坑 ---安卓iOS兼容等
关于小程序一些小功能的代码都在这个GitHub上,感兴趣的可以去看看,https://github.com/huihuijiang/miniProgram目前有:列表左滑删除,拖拽浮标 一.小程序坑1 ...
- 逗渣的学习笔记-关于webpack从头撸一遍
刚开始接触webpack,完全是工作需求.那是去年年末的事情了,当时被迫换到另一个项目组,也是一个新的项目,做手机上面的应用,客户要求用react做应用,所以完全属于赶鸭子上架,当时说真的蛮懵逼的,也 ...