第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中。
访问流程图:
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