在 Kubernetes 的世界中,Ingress 是一种神奇的存在,它像一个智能门卫,控制着外部流量如何访问集群内的微服务。Ingress 不仅简化了服务的暴露过程,还提供了负载均衡、SSL 证书管理等实用功能。本文将带你快速了解 Kubernetes Ingress 的基本概念和配置方法,让你的服务部署更加得心应手
Ingress 专注于处理外部流量,提供更丰富的路由和安全特性
现在我们来安装配置一下ingress-controller
k8s-master |
192.168.8.128 |
k8s-node1 | 192.168.8.129 |
k8s-node2 | 192.168.8.130 |
harbor | 192.168.8.99 |
一: 准备ingress controller和kube-webhook-certgen镜像
注意: 大家如果没有搭建harbor的话就直接在node节点导入镜像就可以了,然后在yaml文件中就直接写导入后的镜像的名字即可
containerd 容器运行时导入镜像命令 : ctr -n k8s.io image import 镜像
docker 容器运行时导入镜像命名: docker load -i 镜像
从阿里云的镜像仓库上面拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.1.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.0 #webhook镜像
在 Kubernetes Ingress 的使用场景中,尤其是使用 Ingress-Nginx 作为 Ingress Controller 时,kube-webhook-certgen
工具被用来创建和更新用于 TLS 认证的证书。这些证书被用于确保 Webhook 与 Kubernetes API 服务器之间的通信是安全的。

给拉下来的镜像打标签推送到harbor上面
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.1.0 192.168.8.99/k8s-ingress/nginxingress-controller:v1.1.0 #打标签
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.0 192.168.8.99/k8s-ingress/kube-webhook-certgen:v1.1.0
docker push 192.168.8.99/k8s-ingress/nginxingress-controller:v1.1.0
docker push 192.168.8.99/k8s-ingress/kube-webhook-certgen:v1.1.1
#推送到harbor中的k8s-ingress项目中
登录harbor查看
可以看到确实已经有了
二: 创建ingress controller
拉取v1.1.0版本的yaml文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/baremetal/deploy.yaml
vim deploy.yaml
327行改成ingressnginx-controller的镜像
608,660行改成webhook的镜像
kubectl apply -f deploy.yaml
kubectl get pod -n ingress-nginx
看到这里就表示创建成功了
curl 请求了一下是404的页面这是正常的因为没有后端代理的pod,后面创建完ingress规则之后就可以了
三:测试
3.1 创建测试deploy和service
vim test.yaml #caddy 网页
apiVersion: v1
kind: Service
metadata:
name: caddy
namespace: default
spec:
selector:
app: caddy
ports:
- name: http
targetPort: 80
port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: caddy-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: caddy
template:
metadata:
labels:
app: caddy
spec:
containers:
- name: caddy
image: caddy:v1 #这个镜像我的node节点上面有所以就直接写上就可以了
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
kubectl apply -f test.yaml
vim test1.yaml #nginx 网页
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
selector:
app: nginx
ports:
- name: http
targetPort: 80
port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: sjl-nginx:v1 #这个镜像我的node节点上面有所以就直接写上就可以了
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
kubectl apply -f test1.yaml
kubectl get pod
kubectl get svc
可以看到已经成功创建出来了
3.2 创建一个ingress规则
vim ingress-test.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myapp
namespace: default
spec:
ingressClassName: nginx #指定ingress控制器
rules:
- host: sjl.caddy.com #域名
http:
paths:
- backend:
service:
name: caddy
port:
number: 80
path: /
pathType: Prefix #根据url的/前缀进行匹配
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myapp1
namespace: default
spec:
ingressClassName: nginx #指定ingress控制器
rules:
- host: sjl.nginx.com #域名
http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: Prefix #根据url的/前缀进行匹配
kubectl apply -f ingress-test.yaml
已经成功创建出来了
3.3,在windows中C:\Windows\System32\drivers\etc 目录下编辑hosts文件
192.168.8.128 sjl.caddy.com sjl.nginx.com
浏览器访问
可以看到访问不同的域名就可以通过ingress-nginx控制器请求到后端的pod
31575端口是 ingress-nginx-controller的service映射的端口
访问流程
Internet #外网
↓
Ingress Controller 控制器
↓
Ingress #ingress规则
↓
Service #代理pod的service
↓
Pods