Kubernetes ingress基础:修订间差异
无编辑摘要 |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
==pre== | ==pre== | ||
二、核心组成 | |||
Ingress 功能的实现依赖「两大核心组件」,缺一不可: | |||
组件 作用 | |||
Ingress 资源(Resource) 用 YAML/JSON 定义的「路由规则」,仅声明 “要转发什么请求到哪个服务”,无执行能力; | |||
Ingress 控制器(Controller) 实现路由规则的「守护进程」(如 Pod 运行),监听 Ingress 资源变化,转发实际请求; | |||
常见 Ingress 控制器: | 常见 Ingress 控制器: | ||
| 第12行: | 第19行: | ||
ngress是Kubernetes集群对外暴露服务的一种推荐方法,Ingress封装了nginx,背后还是nginx在发挥作用,Ingress的作用是不断检测pod的IP变化,然后将变化更新到nginx的配置中。从而当集群中有pod重启时,可以做到不用重启nginx | ngress是Kubernetes集群对外暴露服务的一种推荐方法,Ingress封装了nginx,背后还是nginx在发挥作用,Ingress的作用是不断检测pod的IP变化,然后将变化更新到nginx的配置中。从而当集群中有pod重启时,可以做到不用重启nginx | ||
三、工作流程 | |||
以 Nginx Ingress Controller 为例,完整请求链路: | |||
客户端发起 HTTP/HTTPS 请求(如 https://api.example.com/user); | |||
请求先到达集群的「入口节点」(云厂商 LoadBalancer / 节点的 NodePort); | |||
Ingress 控制器(Nginx Pod)接收请求,解析 Ingress 资源定义的规则; | |||
控制器根据规则(如域名 api.example.com + 路径 /user),将请求转发到集群内对应的 Service; | |||
Service 将请求路由到后端 Pod,处理后返回响应,经控制器回传给客户端。 | |||
==with Helm== | ==with Helm== | ||
2025年12月8日 (一) 15:43的版本
pre
二、核心组成 Ingress 功能的实现依赖「两大核心组件」,缺一不可: 组件 作用 Ingress 资源(Resource) 用 YAML/JSON 定义的「路由规则」,仅声明 “要转发什么请求到哪个服务”,无执行能力; Ingress 控制器(Controller) 实现路由规则的「守护进程」(如 Pod 运行),监听 Ingress 资源变化,转发实际请求;
常见 Ingress 控制器:
Nginx Ingress Controller(最主流):基于 Nginx 实现,功能全面、稳定; Traefik:轻量、原生支持 K8s,自动配置刷新; HAProxy Ingress:基于 HAProxy,性能优异; Istio Ingress Gateway:服务网格场景下的网关方案。
Nginx ingress 使用ConfigMap来管理Nginx配置,nginx是大家熟知的代理和负载均衡软件,比起Traefik来说功能更加强大.
ngress是Kubernetes集群对外暴露服务的一种推荐方法,Ingress封装了nginx,背后还是nginx在发挥作用,Ingress的作用是不断检测pod的IP变化,然后将变化更新到nginx的配置中。从而当集群中有pod重启时,可以做到不用重启nginx
三、工作流程 以 Nginx Ingress Controller 为例,完整请求链路:
客户端发起 HTTP/HTTPS 请求(如 https://api.example.com/user); 请求先到达集群的「入口节点」(云厂商 LoadBalancer / 节点的 NodePort); Ingress 控制器(Nginx Pod)接收请求,解析 Ingress 资源定义的规则; 控制器根据规则(如域名 api.example.com + 路径 /user),将请求转发到集群内对应的 Service; Service 将请求路由到后端 Pod,处理后返回响应,经控制器回传给客户端。
with Helm
#use helm 正常情况下如次 要FQ helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx --create-namespace Release "ingress-nginx" does not exist. Installing it now. Error: failed to download "https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.1.4/ingress-nginx-4.1.4.tgz"
install 2024
#images 换成自己在vps 推到自己的ali 1.直接下载我已替换镜像地址 https://github.com/evan886/k8s-install/blob/main/deploy-v1.11.2.yaml registry.cn-hangzhou.aliyuncs.com/evan886/my_k8s_containers:controllerv1.11.2 registry.cn-hangzhou.aliyuncs.com/evan886/my_k8s_containers:kube-webhook-certgenv1.4.3
install(现在用kuboard 2022)
部署Ingress 控制器
https://kubernetes.github.io/ingress-nginx/deploy/
#2022 ok 首先,需要匹配Ingress-nginx版本和kubernetes版本。 在https://github.com/kubernetes/ingress-nginx可以找到 Supported Versions table 1.直接下载我已替换镜像地址 https://github.com/evan886/k8s-install/blob/main/deploy-v1.3.1.yaml 2.官方 下载 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml 查看该文件用到了哪些镜像: cat deploy.yaml | grep image 总之 registry.k8s.io 全换成https://dockerproxy.com 切记,不要替换少了 https://dockerproxy.com/docs 真是好东西 感谢 添加内容 暴露controller 端口,不行可能 404 ,ln 496就是添加的内容 494 kubernetes.io/os: linux 495 serviceAccountName: ingress-nginx 496 hostNetwork: true optimize suggestion优化建议 deploy.yaml中默认 controller副本为1 可以改大replicas 提升性能 kubectl apply -f deploy.yaml # or deploy-v1.3.1.yaml 查看结果 : root@ubuntu-200470-1:~/ingress# kubectl get pods -n ingress-nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ingress-nginx-admission-create-dbgqr 0/1 Completed 0 83m 10.234.253.158 work2 <none> <none> ingress-nginx-admission-patch-mnsq9 0/1 Completed 3 83m 10.234.11.241 work1 <none> <none> ingress-nginx-controller-5dc549b98b-6nnsh 1/1 Running 0 83m 192.168.10.82 work1 <none> <none> root@ubuntu-200470-1:~/ingress# root@ubuntu-200470-1:~/ingress# curl 192.168.10.82 <html> <head><title>404 Not Found</title></head> <body> <center><h1>404 Not Found</h1></center> <hr><center>nginx</center> </body> </html 成功 nuc k8s root@ubuntu-200430-1:~/ingress# kubectl get pods -n ingress-nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ingress-nginx-admission-create-c87dq 0/1 Completed 0 50s 10.234.10.73 work1 <none> <none> ingress-nginx-admission-patch-7jwbn 0/1 Completed 0 50s 10.234.228.242 work3 <none> <none> ingress-nginx-controller-5dc549b98b-927zt 0/1 Running 0 50s 192.168.10.34 work3 <none> <none>
部署svc
#2024不用独立安装这个了 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml service/ingress-nginx created [root@master ingress]# kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx LoadBalancer 10.99.141.156 <pending> 80:31279/TCP,443:30847/TCP 2m43s
usage
最简单的使用例子
run
##前提是已安装 ingress controller -- Ingress-Nginx kubectl apply -f apple-deployment-and-service.yaml kubectl apply -f banana-deployment-and-service.yaml kubectl apply -f ingress.yaml
files
cat /root/apple-deployment-and-service.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: apple
spec:
selector:
matchLabels:
app: apple
replicas: 2
template:
metadata:
labels:
app: apple
spec:
containers:
- name: apple
image: jxlwqq/http-echo
args:
- "--text=apple"
ports:
- containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
name: apple-svc
spec:
selector:
app: apple
ports:
- port: 8080
targetPort: 8080
cat /root/banana-deployment-and-service.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: banana
spec:
selector:
matchLabels:
app: banana
replicas: 2
template:
metadata:
labels:
app: banana
spec:
containers:
- name: banana
image: jxlwqq/http-echo
args:
- "--text=banana"
ports:
- containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
name: banana-svc
spec:
selector:
app: banana
ports:
- port: 8080
targetPort: 8080
cat /root/ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: fruit-ing
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: aa.com
http:
paths:
- path: /apple
pathType: Prefix
backend:
service:
name: apple-svc
port:
number: 8080
- path: /banana
pathType: Prefix
backend:
service:
name: banana-svc
port:
number: 8080
ingressClassName: nginx
test
kubectl get pod -n ingress-nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ingress-nginx-admission-create-dbgqr 0/1 Completed 0 28m 10.234.253.158 work2 <none> <none> ingress-nginx-admission-patch-mnsq9 0/1 Completed 3 28m 10.234.11.241 work1 <none> <none> ingress-nginx-controller-5dc549b98b-6nnsh 1/1 Running 0 28m 192.168.10.82 work1 <none> <none> 得知 ingress-nginx-controller 在节点2机器上ip 为192.168.10.82 cat /etc/hosts | grep aa.com 192.168.10.82 aa.com ➜ ~
简单的使用例子 old
** 创建一个空间
cat testing-namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
name: testing
labels:
env: testing
** 创建 tomcat-deploy
cat tomcat-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
namespace: testing
spec:
replicas: 2
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8.0.50-jre8-alpine
ports:
- containerPort: 8080
name: httpport
- containerPort: 8009
name: ajpport
** 创建 tomcat svc
cat tomcat-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
namespace: testing
labels:
app: tomcat-svc
spec:
selector:
app: tomcat
ports:
- name: httpport
port: 80
targetPort: 8080
protocol: TCP
** 创建 tomcat-ingress
#前提 先在 kuboard 先创建个ingress 叫 tt
cat tomcat-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tomcat
namespace: testing
annotations:
kubernetes.io/ingress.class: "tt"
#kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: tt.com
#- host: tomcat.ikubernetes.io
http:
paths:
- path:
backend:
serviceName: tomcat-svc
servicePort: 80
** visa
host master ip http://tt.com:32136/
ingress https
see also
K8s部署tomcat mysql 与ingress暴露服务
references
https://zhuanlan.zhihu.com/p/644289145
k8s集群中部署tomcat,访问方式使用Ingress,高可用 和NodePort方式
k8s ingress及ingress controller
K8S 部署 ingress-nginx (一) 原理及搭建
解决kubernetes中ingress-nginx配置问题
Kubernetes - nginx-ingress 配置跳坑指南