kubernetes七层负载Ingress搭建(K8S1.23.5)

首先附上K8S版本及Ingress版本对照

Ingress介绍

NotePort:该方式的缺点是会占用很多集群机器的端口,当集群服务变多时,这个缺点就愈发的明显(srevice变多,需要的端口就需要多)

LoadBalancer:该方式的缺点是每个service都需要一个外部负载均衡设备的支持才可以

基于这种现状,k8s提供了ingress资源对象。

ingress只需要一个NodePort / 一个负载均衡设备就 可以满足暴露多个service的需求

实际上Ingress相当于 一个7层的负载均衡器 (在生产环境中常用的Ingress有Treafik、Nginx、HAProxy、Istio等) ,是k8s对反向代理的一个抽象,它的工作原理类似于Nginx,可以理解成Ingress里建立诸多映射规则Ingress Colltroller 通过 监听这些配置规则 转化成Nginx的 反向代理配置 ,然后对外部提供服务,在这里有两个核心理念:

    • Ingress:k8s中的一个对象,作用是定义请求如何转发到service的规则 定义转发规则
    • Ingress controller:具体实现反向代理负载均衡 的程序,对Ingress定义的规则进行解析

根据配置的规则来实现请求转发,实现方式有很多,比如Nginx,Contour,Haproxy等等

Ingress的工作原理

ingress-controller通过和 kubernetes APIServer 交互,动态的去感知集群中ingress规则变化;

然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置;

再写到nginx-ingress-controller的pod里,这个ingress-controller的pod里运行着一个Nginx服务,控制器会把生成的 nginx配置写入 /etc/nginx.conf文件中;

然后reload一下使配置生效。以此达到域名区分配置和动态更新的作用。

kubernetes + ingress-nginx部署

我这里的K8S版本为1.23.5对应的安装ingress-nginx-1.6.4;

下载对应部署文件deploy.yaml(这一步需要魔法,没有的可以从下链接提取)

同时为了方便后续http和https的分辨,固定端口为31080和31443

未修改版本

https://pan.baidu.com/s/1FJ3ai_5YQYypKi72HhpGqg?pwd=weiy

提取码:weiy

已修改版本

https://pan.baidu.com/s/1CF5UJ8aQy-IDvpv9r2RYuQ?pwd=weiy

提取码:weiy

注意80对应的是HTTP端口,443对应的是HTTPS端口

部署文件上传后,需要注意切换为国内镜像地址(修改成国内可以下载的相同镜像)

一共需要修改三处镜像

具体修改如下:

image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343@sha256:39c5b2e3310dc4264d638ad28d9d1d96c4cbb2b2dcfb52368fe4e3c63f61e10f

将其改为:

复制代码
dyrnq/kube-webhook-certgen:v20220916-gd32f8c343

image: registry.k8s.io/ingress-nginx/controller:v1.6.4@sha256:15be4666c53052484dd2992efacf2f50ea77a78ae8aa21ccd91af6baaa7ea22f

将其修改为:

复制代码
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.6.4

部署Ingress

bash 复制代码
[root@master ~]# mkdir /ingress-controller
bash 复制代码
[root@master ~]# cd /ingress-controller
bash 复制代码
[root@master ~]# ls
bash 复制代码
[root@master ingress-controller]# kubectl apply -f ./

正常为created,我先前已经apply

1、查看ns(会有一个ingress-nginx的名称空间产生)

2、查看ingress-nginx名称空间的pod

bash 复制代码
[root@master ingress-controller]#  kubectl get po -n  ingress-nginx

3、查看service

bash 复制代码
[root@master ingress-controller]# kubectl get svc -n ingress-nginx

4、部署tomcat与nginx的pod,通过tomcat-nginx.yml文件创建

bash 复制代码
[root@k8s-master ~]# cat>tomcat-nginx.yml <<EOF
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.18
        ports:
        - containerPort: 80
      nodeName: node2
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat-pod
  template:
    metadata:
      labels:
        app: tomcat-pod
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5-jre10-slim
        ports:
        - containerPort: 8080
      nodeName: node2
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: dev
spec:
  ports:
    - port: 80
      name: nginx
  clusterIP: None
  selector:
    app: nginx-pod
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
  namespace: dev
spec:
  selector:
    app: tomcat-pod
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
EOF

这里我固定了调度的node,为node2

5、创建svc与pod

bash 复制代码
[root@master ~]# kubectl create -f tomcat-nginx.yml

6、查看svc信息

bash 复制代码
[root@master ~]# kubectl get svc -n dev

7、查看pod信息

bash 复制代码
[root@master ~]# kubectl get po -n dev

Ingress-HTTP代理

通过ingress代理http服务,创建ingress-http.yml

bash 复制代码
[root@master ~]# vim ingress-http.yml
bash 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-http
  namespace: dev
spec:
  ingressClassName: nginx
  rules:
  - host: www.nginx.com
    http:             #访问的方式是以http的形式
      paths:
      - backend:
          service:
            name: nginx-service  #用户在访问域名的时候,会反向代理给service,也就是后面的pod(service是通过标签去代理的)
            port: 
              number: 80
        path: /
        pathType: ImplementationSpecific
  - host: www.tomcat.com
    http:
      paths:
      - backend:
          service:
            name: tomcat-service
            port: 
              number: 80
        path: /
        pathType: ImplementationSpecific

1、创建ingress

bash 复制代码
[root@master ~]# kubectl create -f ingress-http.yml

2、查看ingress信息

bash 复制代码
[root@master ~]# kubectl get ing ingress-http -n dev

3、查看详细描述

bash 复制代码
[root@master ~]# kubectl describe ing ingress-http -n dev

测试HTTP代理

浏览器访问由于域名无法正常解析,需要在windows内进行解析

C:\Windows\System32\drivers\etc

添加解析:

Ingress-HTTPS代理

1、生成证书

bash 复制代码
[root@master ~]# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=TJ/O=nginx/CN=thinkmo.com"
bash 复制代码
-req是证书请求的子命令
-newkey rsa:2048 -keyout tls.key  -newkey是与-key互斥的
-newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,
-nodes 表示私钥不加密
-out 指定生成的证书请求或者自签名证书名称
-days 365  证书有效期
若执行自动输入,可使用-subj选项:
 -subj------证书相关的用户信息(subject的缩写)

2、创建密钥

bash 复制代码
[root@master ~]# kubectl create secret tls tls-secret --key tls.key --cert tls.crt

创建ingress-https-test.yml

bash 复制代码
[root@master ~]# vim ingress-https-test.yml
复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-https
  namespace: dev
spec:
  tls:
  - hosts:
    - www.nginx.com
    - www.tomcat.com
    secretName: tls-secret
  rules:
  - host: www.nginx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80
  - host: www.tomcat.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tomcat-service
            port:
              number: 8080

3、创建ingress

bash 复制代码
[root@master ~]# kubectl create -f ingress-https-test.yml

ingress.extensions/ingress-https created

bash 复制代码
[root@master ~]#  kubectl get ing ingress-https -n dev

4、查看详细信息

5、访问测试

https://www.nginx.com:31443/

https://www.tomcat.com:31443/

相关推荐
明月_清风17 小时前
K8s 从入门到上手:核心概念+常用工具全解析
后端·kubernetes
阿里云云原生20 小时前
阿里云可观测 2026 年 4 月产品动态
云原生
qq_3643717221 小时前
基于 Docker 容器化环境配置
运维·docker·容器
塔克拉玛攻城狮21 小时前
详解cni插件cilium篇一:它为什么这么快?它还有哪些高级功能?
kubernetes·cilium
阿里云云原生21 小时前
Skills Registry 公测开启:为企业打造私有的 Skill 管理中心
云原生
吃胖点儿1 天前
DevOps与自动化原理
云原生
GentleDevin1 天前
Docker 运维常用命令大全
docker·容器·运维命令
运维全栈笔记1 天前
基于Docker的MinIO单机部署与功能测试指南
运维·docker·容器
阿里云云原生1 天前
HiClaw 发布 v1.1.0,提供 Kubernetes 集群部署实现,支持 Hermes Worker 运行时
kubernetes
心机之蛙qee1 天前
docker的安装(RHEL9)
运维·docker·容器