k8s笔记18--快速入门ingress和ingress controller

k8s笔记18--快速入门ingress和ingress controller

1 介绍

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
在这里插入图片描述
Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的 Service。

为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。当controller运行后,每次新增一个 ingress 资源,都会在cotroller 的nginx 配置 nginx.conf 中新增记录,告诉nginx 将请求转发指定的服务中。
当前有很多中ingress controller, 很多云厂商也会定制 一些自己的控制器,本文基于最经典的 ingress-nginx controller 来做相关实验,具体包括部署controller、测试ingress 实例,以及解决常见注意事项。

2 部署 ingress-nginx controller

github.com/kubernetes/ingress-nginx/tree/main/deploy/static/provider/baremetal 中找到自己需要的版本,然后 kubectl apply 即可。

$ kubectl apply -f deploy.yaml 
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created

部署成功后,会拉起一个controller的pod和对应的 svc,如下所示:
xghome:~/.kube$ kubectl -n ingress-nginx get deploy,svc
NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           3h36m

NAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.108.105.39   <none>        80:30080/TCP,443:30443/TCP   3h36m
service/ingress-nginx-controller-admission   ClusterIP   10.105.5.181    <none>        443/TCP                      3h36m

此外还会创建一个 IngressClass, 后续新建ingress 的时候需要指定 ingressClassName
xghome:~/.kube$ kubectl get IngressClass
NAME    CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       3h51m

3 测试

  1. 准备一个基础镜像 py:hostname
    Dockerfile
    FROM python:3.8-slim
    RUN pip3 install Flask==2.1.2
    RUN mkdir -p /home
    WORKDIR /home
    USER nobody
    COPY app.py /home/
    CMD python3 -u app.py
    
    app.py
    from flask import Flask
    
    app = Flask(__name__)
    
    
    def get_hostname():
        hostname = ''
        with open('/etc/hostname', 'r') as f:
            line = f.readline()
            hostname = line.replace('\n', '')
        return hostname
    
    
    @app.route('/')
    @app.route('/<service>')
    def hello_world(service=None):  # put application's code here
        hostname = get_hostname()
        if service is None:
            return f'Hello {hostname}\n'
        else:
            return f'Hello {hostname}, from {service}\n'
    
    
    if __name__ == '__main__':
        app.run(port=80, host="0.0.0.0")
    
    打包镜像
    docker build -t py:hostname .
    
  2. 部署服务test01 和 test02
    test01.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: test01
      name: test01
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test01
      template:
        metadata:
          labels:
            app: test01
        spec:
          containers:
          - image: py:hostname
            name: test01
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: test01
      name: test01
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: test01
    
    test02.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: test02
      name: test02
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test02
      template:
        metadata:
          labels:
            app: test02
        spec:
          containers:
          - image: py:hostname
            name: test02
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: test02
      name: test02
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: test02
    
  3. 部署 ingress
    test-ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test
    spec:
      ingressClassName: nginx
      rules:
      - host: "test.xg.com"
        http:
          paths:
          - pathType: Prefix
            path: "/test01"
            backend:
              service:
                name: test01
                port:
                  number: 80
      - host: "test.xg.com"
        http:
          paths:
          - pathType: Prefix
            path: "/test02"
            backend:
              service:
                name: test02
                port:
                  number: 80
    
    在这里插入图片描述
  4. 前端测试
    如下图, test01 刚好进入到test01 的pod中,/test02 刚好进入到test02 的pod中,测试符合预期
    在这里插入图片描述
    注意:
    这里配置 nginx-ingress-controller 的 80端口为30080, 因此此处需要加上30080, 若在ingress controller 的外层加一个lb, 那么直接访问lb的ip即可。
    此时 test.xg.com 直接指向nginx controller的ip。若需要实现局域网|PC虚拟机之间的dns,可以参考ubuntu小技巧27–基于dnsmasq快速搭建局域网dns服务器

4 注意事项

  1. 笔者自己的服务器上没有专用的 lb, 因此直接将服务的域名指向 controller 的 ip; 实际项目中一般都会有专用 lb,lb 会对接到ingress controller 的多个节点,配置域名的时候直接指向 lb 的 ip 即可。

  2. 指定ingress | 设置默认ingress
    方法1:创建ingress的时候需要指定 spec.ingressClassName: nginx
    方法2: 配置默认ingress

     1)  在ingress-controller 中加参数 --watch-ingress-without-class=true
     2)  配置默认的 IngressClass, 在 annotations 中新增  ingressclass.kubernetes.io/is-default-class: "true"
    
  3. 解决无法拉国外镜像的问题

    若拉不下来,更改为阿里云的镜像即可(按需更改前缀即可,截至2023-08已经可以使用1.8.1了)
    registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.8.1
    registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v20230407
    

5 说明

软件环境:
ubuntu server 18.04
k8s 1.23.6
ingress controller v1.2.0
参考文档:
Kubernetes 文档/概念/服务、负载均衡和联网/Ingress
Kubernetes 文档/概念/服务、负载均衡和联网/Ingress控制器
ngress-nginx/master/deploy/static/mandatory.yaml
nginx-0.30.0/deploy/static/mandatory.yaml
github ingress
kubernetes 创建ingress不生效
ubuntu小技巧27–基于dnsmasq快速搭建局域网dns服务器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要部署 k8s 中的 ingress-controller v1.1.0,可以按照以下步骤进行操作: 1. 首先,确保 Kubernetes 集群已经可用并且已经正确设置。 2. 下载 ingress-controller v1.1.0 的安装文件。可以通过访问官方仓库或者 GitHub 并找到相关的发布版本进行下载。 3. 解压并配置 ingress-controller。通常可以通过编辑 YAML 文件来配置 ingress-controller,在其中指定一些关键参数,如使用的 ingress 类型、负载均衡器类型等。 4. 部署 ingress-controller。通过使用 kubectl 命令行工具,执行 `kubectl apply -f <配置文件>` 来完成 ingress-controller 的部署。 5. 确认 ingress-controller 已经成功部署。可以使用 `kubectl get pods -n <命名空间>` 命令来确认 ingress-controller 的运行状态。 6. 配置 ingress 规则。根据实际需求,编辑定义 ingress 规则的 YAML 文件并部署到 Kubernetes 中。 7. 确认 ingress 规则已经生效。可以通过 `kubectl get ingress -n <命名空间>` 命令来查看已部署的 ingress 规则,并确认其状态为 "RUNNING"。 8. 测试 ingress-controller。通过访问 ingress 规则中指定的域名或路径来确认 ingress-controller 是否成功地将请求转发到相应的服务。 这些步骤可以帮助您在 Kubernetes 中部署 ingress-controller v1.1.0,并通过 ingress 规则进行请求转发。在部署过程中,记得根据实际需求进行必要的配置和调整,以确保 ingress-controller 能够正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕光xg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值