《Kubernetes部署篇:Kubernetes部署ingress-nginx-controller服务》

文章目录

  • 一、Ingress简介
  • 二、部署ingress
    • 2.1、下载说明
    • 2.2、版本说明
    • 2.3、官方模板部署单实例ingress
    • 2.4、个人模板部署单实例ingress
    • 2.5、个人模板部署高可用ingress集群
  • 三、测试ingress
    • 3.1、http
    • 3.2、https
  • 总结:整理不易,如果对你有帮助,可否点赞关注一下?


一、Ingress简介

NGINX Ingress Controller
NGINX Ingress Controlle配置注释

Kubernetes对外暴露服务的方式目前有四种:LoadBlancer 、ClusterIp、NodePort 、Ingress。

1、Ingress是什么?

1、使用Ingress时一般会有三个组件:反向代理负载均衡器、Ingress Controller、Ingress
2、反向代理负载均衡器很简单,说白了就是 nginx、apache等中间件,新版k8s已经将Nginx与Ingress Controller合并为一个组件,所以Nginx无需单独部署,只需要部署Ingress Controller即可。在集群中反向代理负载均衡器可以自由部署,可以使用Replication Controller、Deployment、DaemonSet等等方式
3、Ingress Controller实质上可以理解为是个监视器,Ingress Controller通过不断地跟kubernetes API打交道,实时的感知后端service、pod等变化,比如新增和减少pod,service增加与减少等;当得到这些变化信息后,Ingress Controller再结合下文的Ingress生成配置,然后更新反向代理负载均衡器,并刷新其配置,达到服务发现的作用
4、Ingress简单理解就是个规则定义;比如说某个域名对应某个service,即当某个域名的请求进来时转发给某个service;这个规则将与Ingress Controller结合,然后Ingress Controller将其动态写入到负载均衡器配置中,从而实现整体的服务发现和负载均衡

如下图所示:

《Kubernetes部署篇:Kubernetes部署ingress-nginx-controller服务》_第1张图片

2、Ingress作用

Ingress的主要作用是可以利用Nginx,Haproxy,envoy,traefik等负载均衡器来暴露集群内部服务。利用Ingress可以解决内部资源访问外部资源的方式,和四层调度替换为七层调度的问题。解决因为四层iptables/ipvs规则实现调度或加密tsl的方式过于复杂且效率低下的问题,因为四层调度的iptables/ipvs模块无法卸载,所以使用七层负载均衡来替代。

3、常见控制器

1、Kubernetes Ingress作为"官方"控制器,它是由社区基于NGINX Web服务器开发的,并补充了一组用于实现额外功能的Lua插件。
2、NGINX Ingress 这是NGINX开发人员的官方产品,NGINX控制器具有很高的稳定性,持续的向后兼容性,没有任何第三方模块,并且由于消除了Lua代码而保证了较高的速度(与官方控制器相比)
3、Kong Ingress 由Kong Inc开发,并且有两个版本:商业版本和免费版本。Kong Ingress建立在NGINX之上,并增加了扩展其功能的Lua模块。
4、HAProxy Ingress 由HAProxy开发,它提供了“软”配置更新(无流量丢失),基于DNS的服务发现,通过API的动态配置。
5、Traefik 是一个全功能的 ingress 控制器 (Let’s Encrypt,secrets,http2,websocket),并且它也有来自 Containous 的商业支持。
6、Istio 是IBM,Google和Lyft(Envoy的原始作者)的联合项目,它是一个全面的服务网格解决方案。它不仅可以管理所有传入的外部流量(作为Ingress控制器),还可以控制集群内部的所有流量。


二、部署ingress

2.1、下载说明

说明:当前k8s集群版本为1.20.6,这里选择安装ingressv1.1.2版本,即为最新版本。

1、Github官网地址
2、CSDN下载地址

说明:建议从CSDN地址下载,在官方yaml文件模板上增加了default-backend功能,采用NodePort模式且nodePort端口号固定、及将pod指定调度到指定节点,便于DNS解析,适用于生产环境。

说明:官方yaml文件部署没有指定default-backend,会出现报错信息,如下图所示
《Kubernetes部署篇:Kubernetes部署ingress-nginx-controller服务》_第2张图片


2.2、版本说明

说明:根据官方说明,由于当前k8s集群版本为1.20.6,所以这里使用v1.1.2版本,即当前最新版本。
《Kubernetes部署篇:Kubernetes部署ingress-nginx-controller服务》_第3张图片
总结:根据官方版本结合业务实际情况,建议如下:

1、建议将pod调度到指定的node节点,方便DNS解析。
2、大型k8s集群,建议采用hostNetwork模式,如果采用NodePort模式,建议将nodePort端口进行固定。


2.3、官方模板部署单实例ingress

1、进入ingress-nginx-controller-v1.1.2/deploy/static/provider/baremetal/1.20目录,执行yaml文件,如下图所示:
《Kubernetes部署篇:Kubernetes部署ingress-nginx-controller服务》_第4张图片
2、查看pod及svc,如下图所示:
在这里插入图片描述
说明:其中35899为80映射端口,即http端口,33572为443映射端口,即https端口。


2.4、个人模板部署单实例ingress

1、进入iingress-controller目录,执行yaml文件,如下图所示:
《Kubernetes部署篇:Kubernetes部署ingress-nginx-controller服务》_第5张图片
2、查看pod及svc,如下图所示:
在这里插入图片描述
说明:

1、经测试default-backend.yaml文件中的namespace字段值必须设置为kube-system,否则还是会出现报错信息。
2、deploy.yaml文件中如下字段根据实际情况修改,如下所示

修改内容如下所示:

283行
nodePort: 35899 #新增字段,将nodePort端口固定,端口需在服务端口范围之内,根据实际情况填写

288行
port: 443  #新增字段,将nodePort端口固定,端口需在服务端口范围之内,根据实际情况填写

326行   
nodeName: k8s-worker-135 #新增字段,将pod调度指定节点,方便DNS解析,根据实际情况填写

2.5、个人模板部署高可用ingress集群


三、测试ingress

3.1、http

1、创建一个ingress

vim myapp-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-myapp
  namespace: default #必须与service的名称空间一致
  annotations:
    kubernetes.io/ingress.class: "nginx"  
spec:
  rules:
  - host: "myapp.lolaage.com"
    http:
      paths:
      - path: "/"
        pathType: Exact
        backend:
          service: 
            name: myapp #service名称 
            port: 
              number: 80 #service端口

2、创建一个nginx yaml文件

vim myapp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: v1
      env: test
  template:
    metadata:
      labels:
        app: myapp
        release: v1
        env: test
    spec:
      containers:
      - name: myapp
        image: nginx 
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  type: ClusterIP   #默认类型
  selector:
    app: myapp
    release: v1
    env: test
  ports:
  - name: http
    port: 80
    targetPort: 80

3、执行yaml文件
在这里插入图片描述
4、通过命令kubectl get pods,svc -n ingress-nginx -o wide查看,ingress-nginx-controller调度掉k8s-worker-135主机上,即ip地址为192.168.1.135,在Linux服务器上或windows电脑,添加hosts解析记录,如下所示:

192.168.1.135 myapp.lolaage.com

4、测试ingress,如下图所示:
《Kubernetes部署篇:Kubernetes部署ingress-nginx-controller服务》_第6张图片
或在浏览器上输入http://myapp.lolaage.com:35899/
在这里插入图片描述


3.2、https

1、创建证书及将证书文件保存到Secret,如下所示

[root@k8s-master-227 ssl]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout tls.key -x509 -out tls.crt -subj /C=CN/ST=BJ/L=BJ/O=DEVOPS/CN=k9sdjw.com -days 3650
[root@k8s-master-227 ssl]# kubectl create secret tls tls-secret --key=tls.key --cert tls.crt

如下图所示
在这里插入图片描述
说明:如果这里只适用单个域名进行测试,则可以写成指定的域名,如tomcat.k9sdjw.com,如果需要进行多个域名配置,可以写成k9sdjw.com来生成证书文件。

2、创建一个ingress

vim nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-nginx-https
  namespace: default #必须与service的名称空间一致
spec:
  ingressClassName: nginx #指定ingressclassname,需与ingress-controller.yaml文件中定义IngressClass中的name: nginx保持一致
  tls:
  - hosts:
    - nginx.k9sdjw.com
    secretName: tls-secret
  rules:
  - host: "nginx.k9sdjw.com"
    http:
      paths:
      - path: "/"
        pathType: Exact
        backend:
          service: 
            name: nginx-service #service名称 
            port: 
              number: 8080 #service端口

3、创建一个nginx yaml文件

vim nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx-pod
  type: ClusterIP
  ports:
  - port: 8080
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

4、执行yaml文件
在这里插入图片描述
5、通过命令kubectl get pods,svc -n ingress-nginx -o wide查看,ingress-nginx-controller调度掉k8s-worker-135主机上,即ip地址为192.168.1.135,在Linux服务器上或windows电脑,添加hosts解析记录,如下所示:

192.168.1.135 nginx.k9sdjw.com

6、测试ingress,在浏览器上输入https://nginx.k9sdjw.com:33572/如下图所示:

《Kubernetes部署篇:Kubernetes部署ingress-nginx-controller服务》_第7张图片


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

你可能感兴趣的:(《企业级K8s集群运维实战》,kubernetes,nginx,python)