k8s学习-Ingress
4.5、Ingress
Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginxIngress-Nginx
官方网站:https://kubernetes.github.io/ingress-nginx/
通常情况下,Service 和 Pod 的 IP 仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到 Service 在 Node 上暴露的 NodePort 上,然后再由 kube-proxy 通过边缘路由器 (edge router) 将其转发给相关的 Pod 或者丢弃。而 Ingress 就是为进入集群的请求提供路由规则的集合。
Ingress 可以给 Service 提供集群外部访问的 URL、负载均衡、SSL 终止、HTTP 路由等。为了配置这些 Ingress 规则,集群管理员需要部署一个 Ingress Controller,它监听 Ingress 和 Service 的变化,并根据规则配置负载均衡并提供访问入口。
4.5.1、安装ingress-nginx
mkdir -p /usr/local/docker/kubernetes/plugins/test/ingress
cd /usr/local/docker/kubernetes/plugins/test/ingress
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
# 创建 deployment
kubectl apply -f mandatory.yaml
kubectl get deploy -n ingress-nginx
kubectl get pod -n ingress-nginx
# 查看描述pod修改为你自己的pod名字
kubectl describe pod nginx-ingress-controller-7fcf8df75d-5fbc6 -n ingress-nginx
# 创建 service
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
kubectl apply -f service-nodeport.yaml
# 查看 svc
[root@k8s-master ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.100.49.226 <none> 80:30197/TCP,443:31898/TCP 28s
例子
官方文档: https://kubernetes.github.io/ingress-nginx/examples
http代理
有nginx-svc-http代理两个nginx 的 pod,通过ingress-nginx代理使得www.nginx-svc-http.com代理到nginx-svc-http
vim svc-http.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 2
template:
metadata:
labels:
app: nginx-http
spec:
containers:
- name: nginx
image: habor-repo.com/library/nginx:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc-http
spec:
selector: # 这里的labels匹配上面的 matchLabels 用来发现deployment
app: nginx-http
ports:
- port: 8090 # 暴露的svc外部端口
targetPort: 80 # 容器内部端口
protocol: TCP
---
apiVersion: extensions/v1beta1
kind: Ingress # 注意类型
metadata:
name: nginx-ingress-http
spec:
rules:
- host: www.nginx-svc-http.com # 主机域名
http:
paths:
- path: /
backend:
serviceName: nginx-svc-http # 上面的 service 的 metadata.name
servicePort: 8090 # 上面service 的端口
配置访问端域名解析:
kubectl apply -f svc-http.yml
kubectl get ingress
# 查看ingress
[root@k8s-master ingress]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
nginx-ingress-http www.nginx-svc-http.com 80 6s
# 查看 ingress 的暴露端口
[root@k8s-master ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.100.49.226 <none> 80:30197/TCP,443:31898/TCP 28s
# 浏览器访问 使用 http 端口 30197
http://www.nginx-svc-http.com:30197/
https代理
# 先创建 https 证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
vim svc-https.yaml
apiVersion: extensions/v1beta1
kind: Ingress # 注意类型
metadata:
name: nginx-ingress-https
spec:
tls:
- hosts:
- www.nginx-svc-https.com
secretName: tls-secret # 和上面生成证书 中的 tls-secret 保持一致
rules:
- host: www.nginx-svc-https.com # 主机域名
http:
paths:
- path: /
backend:
serviceName: nginx-svc-http # 上面的 service 的 metadata.name
servicePort: 8090 # 上面service 的端口
kubectl apply -f svc-https.yml
# 查看ingress
[root@k8s-master https]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
nginx-ingress-http www.nginx-svc-http.com 10.100.49.226 80 37m
nginx-ingress-https www.nginx-svc-https.com 80, 443 12s
# 查看 ingress 的暴露端口
[root@k8s-master ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.100.49.226 <none> 80:30197/TCP,443:31898/TCP 28s
# 浏览器访问 使用 https 端口 31898
https://www.nginx-svc-https.com:31898/
basic auth
yum install -y httpd
htpasswd -c auth foo # 用户名 foo ,输入两次密码: 123456
kubectl create secret generic basic-auth --from-file=auth
vim basic-auth.yml
apiVersion: extensions/v1beta1
kind: Ingress # 注意类型
metadata:
name: nginx-basic-auth
annotations:
# type of authentication
nginx.ingress.kubernetes.io/auth-type: basic
# name of the secret that contains the user/password definitions
nginx.ingress.kubernetes.io/auth-secret: basic-auth
# message to display with an appropriate context why the authentication is required
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
spec:
rules:
- host: www.nginx-basic-auth.com # 主机域名
http:
paths:
- path: /
backend:
serviceName: nginx-svc-http # 上面的 service 的 metadata.name
servicePort: 8090 # 上面service 的端口
kubectl apply -f basic-auth.yml
# 查看ingress
[root@k8s-master https]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
nginx-basic-auth www.nginx-basic-auth.com 80 7s
nginx-ingress-http www.nginx-svc-http.com 10.100.49.226 80 54m
nginx-ingress-https www.nginx-svc-https.com 10.100.49.226 80, 443 17m
# 查看 ingress 的暴露端口
[root@k8s-master ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.100.49.226 <none> 80:30197/TCP,443:31898/TCP 28s
# 浏览器访问 使用 http 端口 30197
http://www.nginx-basic-auth.com:30197/
# 使用 https 端口 31898
https://www.nginx-basic-auth.com:31898/
# 输入用户名/密码 : foo/123456
转发
名称 | 描述 | 值 |
---|---|---|
nginx.ingress.kubernetes.io/rewrite-target | 必须重定向流量的目标URI | 串 |
nginx.ingress.kubernetes.io/ssl-redirect | 指示位置部分是否仅可访问SSL(当Ingress包含证书时默认为True) | 布尔 |
nginx.ingress.kubernetes.io/force-ssl-redirect | 即使Ingress未启用TLS,也强制重定向到HTTPS | 布尔 |
nginx.ingress.kubernetes.io/app-root | 定义Controller必须重定向的应用程序根,如果它在'/'上下文中 | 串 |
nginx.ingress.kubernetes.io/use-regex | 指示Ingress上定义的路径是否使用正则表达式 | 布尔 |
vim rewrite.yml
apiVersion: extensions/v1beta1
kind: Ingress # 注意类型
metadata:
name: nginx-rewrite
annotations:
# 跳转的目标域名
nginx.ingress.kubernetes.io/rewrite-target: www.nginx-basic-auth.com:30197
spec:
rules:
- host: www.jump.com # 拦截的域名
http:
paths:
- path: /
backend:
serviceName: nginx-svc-http # 上面的 service 的 metadata.name
servicePort: 8090 # 上面service 的端口
kubectl apply -f rewrite.yml
# 查看ingress
[root@k8s-master https]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
nginx-basic-auth www.nginx-basic-auth.com 10.100.49.226 80 23m
nginx-ingress-http www.nginx-svc-http.com 10.100.49.226 80 77m
nginx-ingress-https www.nginx-svc-https.com 10.100.49.226 80, 443 40m
nginx-rewrite www.nginx-basic-auth.com 80 5s
# 查看 ingress 的暴露端口
[root@k8s-master ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.100.49.226 <none> 80:30197/TCP,443:31898/TCP 28s
# 浏览器访问 使用 http 端口 会自动跳转到 basic-auth 页面
http://www.jump.com:30197
k8s学习-Ingress的更多相关文章
- ASP.NET Core on K8S学习之旅(12)Ingress
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Ingress Kubernetes对外暴露Service主要有三种方 ...
- ASP.NET Core on K8S学习之旅(14)Ingress灰度发布
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 之前一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和 ...
- ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览
在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NET Core API到K8S ...
- ASP.NET Core on K8S学习之旅(13)Ocelot API网关接入
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使 ...
- Kubernetes K8S之Ingress详解与示例
K8S之Ingress概述与说明,并详解Ingress常用示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...
- ASP.NET Core on K8S学习初探(1)K8S单节点环境搭建
当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务+工具服务)已经很多了,而我司目前没有专业的运维人员,发现运维的成本逐渐开始上来,所以容器编排也就需要提上议程.因此我决定 ...
- ASP.NET Core on K8S学习初探(3)部署API到K8S
在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...
- k8s学习 - API
k8s学习 - API 之前对k8s并没有很深入的了解,最近想把手头一个项目全部放到k8s上,以方便部署,需要研究.这里记录一下自己研究过程中头脑中的理解. k8s 和 docker 首先,需要先理解 ...
- k8s学习 - 概念 - master/node
k8s学习 - 概念 - master/node 在k8s中,有各种各样的概念和术语.这些概念是必须要学习和掌握的.我们先罗列下所有概念,然后再一个个看具体实例. 大概说一下这些概念: Master: ...
随机推荐
- 八个开源的 Spring Boot 前后端分离项目,一定要收藏!
八个开源的 Spring Boot 前后端分离项目 最近前后端分离已经在慢慢走进各公司的技术栈,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,我们也非常建议大家学习一下前 ...
- 5.5 Go defer
5.5 Go defer 程序开发中经常要创建资源(数据库初始化连接,文件句柄,锁等),在程序执行完毕都必须得释放资源,Go提供了defer(延时机制)更方便.更及时的释放资源. 1.内置关键字def ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型
上一篇文章(https://www.cnblogs.com/meowv/p/12916613.html)使用自定义仓储完成了简单的增删改查案例,有心的同学可以看出,我们的返回参数一塌糊涂,显得很不友好 ...
- Netty框架问题记录1--多线程下批量发送消息导致消息被覆盖
业务背景 项目是基于Netty实现的实时课堂项目,课堂中老师需要对试卷进行讲解,则老师向服务器发送一个打开试卷信息的请求,服务器获取试卷信息,将试卷信息发送给所有的客户端(学生和老师). 发送给学生的 ...
- 浙工大新生赛莫队处理+区间DP+KMP+分析题
题目描述 读入一个长度为n的整数数列a1,a2,…,an,以及一个整数K. q组询问. 每组询问包含一个二元组(l, r), 其中1≤l≤r≤ n, 求所有满足以下条件的二元组(l2, r2)的数目: ...
- 自动网络搜索(NAS)在语义分割上的应用(二)
前言: 本文将介绍如何基于ProxylessNAS搜索semantic segmentation模型,最终搜索得到的模型结构可在CPU上达到36 fps的测试结果,展示自动网络搜索(NAS)在语义分割 ...
- Active MQ未授权访问
ActiveMQ是一款流行的开源消息服务器.默认情况下,ActiveMQ服务是没有配置安全参数.恶意人员可以利用默认配置弱点发动远程命令执行攻击,获取服务器权限,从而导致数据泄露. 一.未授权访问 默 ...
- PYTHON 黑帽子第二章总结
基于python3编写 import sys, socket, getopt, threading, argparse, subprocess # globals options listen = F ...
- 最好用的FTP工具,最好用的FTP工具推荐!
IIS7服务器管理工具是一个良好的FTP的客户端,可以进行FTP的操作!同时,还可以作为VNC的客户端进行VNC的相关操作!它还能连接Windows和Linux的服务器和PC,并对他们的连接状态进行实 ...
- jchdl - GSL实例 - Mux4(使用Mux)
https://mp.weixin.qq.com/s/GrYJ4KXEFRoLLmLnAGoMSA 原理图 参考链接 https://github.com/wjcdx/jchdl/blob/ma ...