第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