前言

最新有新的需求,原来的K8S版本(v1.18.1)已经不能满足需求了。因此部署了新的K8S版本—v1.23.5。前期基础部署,dashboard部署,metrics-server部署都可以,但是当部署到Ingress时,发现和原来的不一样了,因此记录一下。

标题

环境说明

K8S:v1.23.5
Docker: 20.10.14
CentOS7.5

关于Ingress

官网地址:https://kubernetes.github.io/ingress-nginx/
1、Ingress是整个Kubernetes的流量如何,他和Service不一样的是,Service的iptables/ipvs是4层调度,而Ingress可以转发7层的数据,实现http/https通信。因此使用Ingress通信更加安全。

2、在访问Pod时Service可以达到负载均衡,但是会有中众多的请求会先访问的Node-IP:Node-Port,这时就需要给节点做负载均衡,就需要负载均衡器,而Ingress就能达到这样的效果。

3、Ingress的实现原理:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

实现Ingress的步骤

1、拉取yaml文件,生成个ingress-nginx-controller的Pod(实际上这个Pod就是Nginx做的),生成个ingress-nginx-controller的svc(用于接收外部流量给Ingress)
2、创建Ingress资源,(因为Ingress在K8S中是个资源对象,因此可以通过写资源清单的方式来创建)
3、创建后端service,Pod测试对象,来检验Ingress的效果

Ingress的安装

官方网址: https://kubernetes.github.io/ingress-nginx/deploy/
说明:在k8sv1.22版本以后,Ingress有个字段不再使用,因此我们需要使用新的YAML文件和新的镜像,这也就是和原来的版本的差异。
1、拉取YAML文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml

2、由于墙的原因,我将YAML文件放在网盘里面,需要自取
链接: https://pan.baidu.com/s/1c781sisldQF1xEd9NBmVog?pwd=nvdz 提取码: nvdz

3、需要注意有几个镜像,需要自己在阿里云上拉取

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.1.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1

然后编辑deploy.yaml文件找到"image"字段,进行修改

4、apply文件

kubectl apply -f deploy.yaml 

5、查看Pod

[root@master ~]# kubectl get pod -n ingress-nginx
NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-ft5f4       0/1     Completed   0          63m
ingress-nginx-admission-patch-pb8hn        0/1     Completed   1          63m
ingress-nginx-controller-64b844d68-f8mpm   1/1     Running     0          63m

发现namespace为ingress-nginx的三个pod已经成功完成,status为completed的两个pod为job类型资源,completed表示job已经成功执行无需管它。
6、编辑Ingress的svc,改为NodePort

kubectl edit svc ingress-nginx-controller -n ingress-nginx
#将type:LoadBalancer   -------->   改为type:NodePort

7、访问Ingress

kubectl get svc -n ingress-nginx
ingress-nginx-controller             NodePort    10.96.236.64   <none>        80:32594/TCP,443:30778/TCP   64m
#80端口后面代表的是http访问,443端口代表是https访问,实际访问:宿主机的IP:32594,或者https://IP:30778

本机效果:
在这里插入图片描述

Ingress的域名访问

apiVersion: networking.k8s.io/v1
kind: Ingress               #写个资源,资源对象是Ingress,就由此Ingress资源对象定义的规则,来配置Ingress转发情况
metadata:
  name: ingress-host-bar    #名称随便写
spec:
  ingressClassName: nginx       #默认就写Nginx
  rules:
  - host: "bo.ff.com"           #服务的域名
    http:
      paths: 
      - pathType: Prefix        #表示以前缀的方式进行匹配
        path: "/"               #前缀必须有个"/",才可以成功匹配
        backend:
          service:              #规定Ingress后端的Service
            name: hello-bo      #后端Service的名称
            port:  
              number: 8000      #后端Service监听的端口
  - host: "demo.bo.com"     #再写一个服务
    http:
      paths:
      - pathType: Prefix    #表示以前缀的方式进行匹配
        path: "/nginx"  # 这里前缀必须指明是"/nginx",之后会把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
        backend:
          service:        #同样规定后端的Service
            name: nginx-bo 
            port:
              number: 8000

Ingress路径重写

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2        #这里加个注解,表示路径重写,重写$2的
  name: ingress-host-bar
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-server
            port:
              number: 8000
  - host: "demo.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/nginx(/|$)(.*)" 
        backend:
          service:
            name: nginx-demo 
            port:
              number: 8000
Logo

开源、云原生的融合云平台

更多推荐