kubernetes1.13.1部署ingress-nginx-十一
一、Ingress 简介
(1)
在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。
为了使外部的应用能够访问集群内的服务,
在Kubernetes 目前 提供了以下几种方案:
NodePort
LoadBalancer
Ingress
(2)
Ingress :
ingress controller
将新加入的Ingress转化成Nginx的配置文件并使之生效;
ingress服务
将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可;
(3)
Ingress 工作原理:
ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,
然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,
再写到nginx-ingress-control的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,
然后reload一下使配置生效。
以此达到域名分配置和动态更新的问题。
Ingress 可以解决什么问题:
动态配置服务:
如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务.
而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要而外的操作.
减少不必要的端口暴露:
配置k8s时, 第一步是要关闭防火墙, 原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅.
而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式。
(4)
结构图:

因为整个结构中,要创建不止一个service、pod,我这里用A和B加以区分说明:
service-A:此service是让ingress-controller能够接入集群外部的流量,因为默认外部是不能访问的;将此service的端口暴露出去;
service-B:此service就是就是正常的pod service ;
ingress-controller:也就是图中的pod-A,运行在service-A后面,也是一个pod,此pod的namespace为ingress-nginx;
二、部署配置Ingress
(1)获取配置文件
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy
下载以下几个文件:
configmap.yaml default-backend.yaml mandatory.yaml namespace.yaml rbac.yaml tcp-services-configmap.yaml udp-services-configmap.yaml with-rbac.yaml


(2) 准备镜像
a、
[root@master ingress-nginx]# vim mandatory.yaml #mandatory.yaml是其他文件的集合
编辑mandatory.yaml文件,将defaultbackend镜像地址改成阿里云的镜像地址(如下图),至于原因 你懂得...
image: registry.cn-hangzhou.aliyuncs.com/allinpay/defaultbackend-amd64:v1.5

b、
至于nginx-ingress-controller的镜像,国内可以访问quay.io,就不用改了;
(3) 安装
[root@master ingress-nginx]# kubectl apply -f mandatory.yaml #这里执行mandatory.yaml这一个文件就行了

稍等片刻,只要操作不出问题,应该就OK了,如下图:

(4)创建后端pod和service (pod-B、service-B)
[root@master ~]# cd /root/manifests/ingress
[root@master ingress]# cat deploy-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
ports:
- name: http
targetPort: 80
port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort: 80
------------------------------------------------------------------------------
[root@master ingress]# kubectl apply -f deploy-demo.yaml
[root@master ingress]# kubectl get pods
[root@master ingress]# kubectl get svc

(5)创建service-A
[root@master ingress-nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
[root@master ingress-nginx]# cat service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
nodePort: 30080
- name: https
port: 443
targetPort: 443
protocol: TCP
nodePort: 30443
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
[root@master ingress-nginx]# kubectl apply -f service-nodeport.yaml

在外部浏览器中中访问:ip:30080

此时报错的原因是因为没有生成ingress-controller关联到service-B的ingress规则;
(5)
定义ingress规则,此间规则会自动注入到ingress-controller(pod)的nginx.conf中;
ingress-controller是直接关联到service-B的,但是中间由ingress来生成各种规则;

此时ingress-controller的nginx.conf中会自动生成一个server段的配置,也就是一个nginx的虚拟主机的字段,还包括upstream配置等;
upstream自动代理到后端pod(pod-B),这些都是自动生成,所以就实现了自动生成配置,自动更改配置等;
只需要改此yaml文件即可;
[root@master ingress]# kubectl apply -f ingress-myapp.yaml


在外部主机上配置好host文件:

然后在浏览器中再访问,发现已经可以访问到后端pod了:

三、再来一个例子
举一个后端pod(pod-B)为Tomcat的例子:
草图如下:

service-B和后端的Tomcat-pod上要开启8080和8009端口;
ingress-controller上用80(这里是30080)映射到8080端口,来代理Tomcat;
此图中的两个nginx和两个tomcat都是pod(pod-B)
(1)创建后端pod(pod-B、service-B)


查看一下Tomcat容器中所开的端口,发现8080和8009已经打开:

查看tomcat的svc:

(2)创建ingress


(3)
修改hosts文件:

访问,发现已经有了,我们这里ingress-controller的nginx暴露的30080端口,不是80,所以要访问30080:

kubernetes1.13.1部署ingress-nginx-十一的更多相关文章
- 基于k8s集群部署prometheus监控ingress nginx
目录 基于k8s集群部署prometheus监控ingress nginx 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署pro ...
- [转帖]Breeze部署kubernetes1.13.2高可用集群
Breeze部署kubernetes1.13.2高可用集群 2019年07月23日 10:51:41 willblog 阅读数 673 标签: kubernetes 更多 个人分类: kubernet ...
- 云原生之旅 - 8)云原生时代的网关 Ingress Nginx
前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...
- Django 部署 uwsgi + nginx + supervisor
Django 部署 uwsgi + nginx + supervisor https://hacpai.com/article/1460607620615?p=1&m=0 zonghua • ...
- 【转帖】kubernetes 部署ingress
kubernetes 部署ingress https://www.cnblogs.com/dingbin/p/9754993.html 明天尝试一下 之前的文档里面一直没有提 需要改host文件 我有 ...
- kubernetes 部署ingress
kubernetes Ingess 是有2部分组成,Ingress Controller 和Ingress服务组成,常用的Ingress Controller 是ingress-nginx,工作的原理 ...
- Ubuntu16.04安装kubernetes1.13集群
Ubuntu16.04安装kubernetes1.13集群 最新的安装可以使用以下方式:https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/ ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第13章 - 部署metrics-server插件
文章目录 1.13.0.创建metrics-server证书和私钥 1.13.1.生成metrics-server证书和私钥 1.13.2.开启kube-apiserver聚合配置 1.13.3.分发 ...
- suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用
文章目录 编译部署nginx 下载nginx源码包 编译nginx 配置nginx.conf 配置nginx为systemctl管理 分发nginx二进制文件和配置文件 启动kube-nginx服务 ...
随机推荐
- git log 查看版本演变历史
1.查看git操作历史 $ git log #git 查看git操作历史 $ git log --oneline #git 简洁的查看git变更记录 $ git log -n4 --onelin ...
- Pat(Advanced Level)Practice--1018(Public Bike Management)
Pat1018代码 题目描写叙述: There is a public bike service in Hangzhou City which provides great convenience t ...
- GCD编程(封装GCD)
//GCDGroup 类 @interface GCDGroup : NSObject @property (strong, nonatomic, readonly) dispatch_group_t ...
- java 短信猫发送短信的方法
用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种: · 1. 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送 ...
- VLFeat中SIFT特征点检测
本代码使用VLFeat库中的函数对一幅图像进行了SIFT检测 需要事先配置好VLFeat和OpenCV,VLFeat的配置参考前一篇博文,OpenCV的配置网上一大堆,自己去百度 #include & ...
- 文本分析实例---QQ聊天记录分析
对QQ聊天记录进行分析,由于每天产生的聊天记录比較多,所以选取的是从2月份整月的聊天记录数据.分析要产生的结果有三个,聊天记录中发消息的人前top15.统计24小时时间段那个时间段发贴人最多,还有对消 ...
- iOS 内购遇到的坑
一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 原因: 当使用内购购买过商品后没有把这个交易事件关,所以当我们再次去购 ...
- 自己定义msi安装包的运行过程
有时候我们须要在程序中运行还有一个程序的安装.这就须要我们去自己定义msi安装包的运行过程. 比方我要做一个安装管理程序,能够依据用户的选择安装不同的子产品.当用户选择了三个产品时,假设分别显示这三个 ...
- 使用 fetch 代替 ajax(在不支持的浏览器上使用 XHR); This kind of functionality was previously achieved using XMLHttpRequest.
原生 JS Ajax,GET和POST 请求实例代码_javascript技巧_脚本之家 https://www.jb51.net/article/86157.htm 更新时间:2016年06月08日 ...
- using the flume-ng-sql-source plugin to push data from Mysql DB to Spark
org.apache.flume.EventDeliveryException while running flume and sending data to spark · Issue #21 · ...