跳到主要内容

第9章 Ingress服务

1.NodePort缺点

1.没有ingress之前,pod对外提供服务只能通过NodeIP:NodePort的形式,但是这种形式有缺点,一个节点上的PORT不能重复利用。比如某个服务占用了80,那么其他服务就不能在用这个端口了。
2.NodePort是4层代理,不能解析7层的http,不能通过域名区分流量
3.为了解决这个问题,我们需要用到资源控制器叫Ingress,工作在7层,作用就是提供一个统一的访问入口并且解析HTTP请求。
4.虽然我们可以使用nginx/haproxy来实现类似的效果,但是传统部署不能动态的发现我们新创建的资源,必须手动修改配置文件并重启。
5.而Ingress控制器简单理解就是运行在k8s里的反向代理/负载均衡,可以解析外部7层流量,识别用户访问的域名并转发到k8s内部的Pod中。

访问流程图:

1725237342609-38a74ed2-fc1a-4a18-8b53-844b543f16b0.png

2.安装部署nginx-ingress

官方的Nginx-ingress对k8s是有版本要求的,注意选择适合你的版本:

https://github.com/kubernetes/ingress-nginx

我们可以直接使用kubernetes官方自带的nginx-ingress控制清单来部署

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/kind/deploy.yaml -O nginx-ingress-v1.3.1.yaml

访问不了的话:
wget https://github.com/kubernetes/ingress-nginx/archive/refs/tags/controller-v1.3.1.tar.gz

阿里云镜像搜索

https://cr.console.aliyun.com/cn-hangzhou/instances/images

3.修改资源配置文件

这里我们主要修改四个地方

1.Deployment类型修改为Demoset类型

2.注释掉Deployment的参数

3.镜像地址修改为阿里云

387 kind: DaemonSet
-------------------
405 # strategy:
406 # rollingUpdate:
407 # maxUnavailable: 1
408 # type: RollingUpdate
--------------------
439 image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.0@sha256:d1707ca76d3 b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5
-------------------
546 image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af 206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660

3.应用资源配置

 kubectl apply -f nginx-ingrss.yml

注意:记得给节点打标签,不然会绑定不了Node节点

kubectl label nodes node-01 ingress-ready=true
kubectl label nodes node-02 ingress-ready=true

4.查看创建的资源

[root@master ingress]# kubectl -n ingress-nginx get all
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-admission-create-7d9j2 0/1 Completed 0 14m
pod/ingress-nginx-admission-patch-bv72v 0/1 Completed 1 14m
pod/ingress-nginx-controller-7jvrc 1/1 Running 0 14m
pod/ingress-nginx-controller-99vm2 1/1 Running 0 14m

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller NodePort 10.1.202.227 <none> 80:32026/TCP,443:30382/TCP 14m
service/ingress-nginx-controller-admission ClusterIP 10.1.135.122 <none> 443/TCP 14m

NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/ingress-nginx-controller 2 2 2 2 2 kubernetes.io/os=linux 14m

NAME COMPLETIONS DURATION AGE
job.batch/ingress-nginx-admission-create 1/1 1s 14m
job.batch/ingress-nginx-admission-patch 1/1 2s 14m

5.创建测试的服务

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
app: my-nginx
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
app: my-nginx
spec:
ports:
- port: 80
protocol: TCP
name: http
selector:
app: my-nginx

6.创建Ingress规则

资源配置清单:

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-nginx
namespace: default
spec:
ingressClassName: nginx
rules:
- host: nginx.k8s.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: my-nginx
port:
number: 80

规则解释:

spec:
ingressClassName: nginx #匹配ingress类型为nginx
rules: #转发规则
- host: nginx.k8s.com #匹配的域名
http: #基于http协议解析
paths: #基于路径进行匹配
- path: / #匹配/路径
pathType: ImplementationSpecific #路径类型
backend: #匹配后跳转的后端服务
service: #设置后端跳转到Service的配置
name:my-nginx #跳转到名为my-nginx的ClusterIP
port: #跳转到的端口
number: 80 #Service端口号

pathType路径类型支持的类型:

ImplementationSpecific  系统默认,由IngressClass控制器提供
Exact 精确匹配URL路径,区分大小写
Prefix 匹配URL路径的前缀,区分大小写

7.访问测试

在windows上配置hosts解析:
nginx.k8s.com

更新: 2024-09-03 08:56:10