暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

k8s部署-21-ingress-nginx实现原理和部署,并简单使用

运维家 2022-03-27
599

 

上文我们讲通信方式的时候,最后集群外访问集群内的时候,涉及到了ingress,那么本文我们就详细的来了解下ingress。
Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

 

什么是ingress

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:

Ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。Ingress 控制器通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。


Ingress 不会公开任意端口或协议。将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的 Service。


下载配置文件

    # 创建一个存放ingress-nginx配置文件的目录
    [root@node1 ~]# mkdir ingress-nginx
    [root@node1 ~]# cd ingress-nginx/
    [root@node1 ingress-nginx]


    从公众号后台回复“ingress-nginx配置文件”,即可获取该文件。该文件中的配置就不多看了,主要可以看下新建了一个命名空间为“ingress-nginx”,并下载了哪几个镜像,如下:
      # 查看命名空间
      [root@node1 ingress-nginx]# grep namespace mandatory.yaml -m 1
      namespace: ingress-nginx
      [root@node1 ingress-nginx]#


      # 查看镜像,可以看到都是国内的地址,所以这次就不用翻墙了
      [root@node1 ingress-nginx]# grep image mandatory.yaml
      # Any image is permissible as long as:
      image: mirrorgooglecontainers/defaultbackend-amd64:1.5
      image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.20.0
      [root@node1 ingress-nginx]#


      # 执行该文件
      [root@node1 ingress-nginx]# kubectl apply -f mandatory.yaml


      查看创建结果

      等到pod的状态是running的时候,说明创建成功了;
        [root@node1 ingress-nginx]# kubectl get all -n ingress-nginx
        NAME READY STATUS RESTARTS AGE
        pod/default-http-backend-86dcdf4845-lkpkz 1/1 Running 0 23s


        NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
        service/default-http-backend ClusterIP 10.233.29.22 <none> 80/TCP 23s


        NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
        daemonset.apps/nginx-ingress-controller 0 0 0 0 0 custom/ingress-controller-ready=true 23s


        NAME READY UP-TO-DATE AVAILABLE AGE
        deployment.apps/default-http-backend 1/1 1 1 23s


        NAME DESIRED CURRENT READY AGE
        replicaset.apps/default-http-backend-86dcdf4845 1 1 1 23s
        [root@node1 ingress-nginx]#


        如果pod的状态异常,我们可以使用如下命令来查看具体原因:
          [root@node1 yunweijia]# kubectl -n ingress-nginx describe pod default-http-backend-86dcdf4845-lkpkz
          # 主要观察 Events内容


          暴露一个端口出来访问

          1、node打标签,在这里我们使用node2,也就是192.168.112.131服务器来测试,首先操作如下:
            # 查看node节点名称
            [root@node1 ingress-nginx]# kubectl get node
            NAME STATUS ROLES AGE VERSION
            node2 Ready <none> 7d v1.20.2
            node3 Ready <none> 7d v1.20.2
            [root@node1 ingress-nginx]#


            # 将node2节点打上一个ingress标签
            [root@node1 ingress-nginx]# kubectl label node node2 app=ingress
            node/node2 labeled
            [root@node1 ingress-nginx]#


            2、修改配置文件;
              # 修改的就是我们上面下载的那个文件
              [root@node1 ingress-nginx]# vim mandatory.yaml
              # 找到272行,进行修改如下:
              272 spec:
              273 serviceAccountName: nginx-ingress-serviceaccount
              274 hostNetwork: true
              275 nodeSelector:
              276 #custom/ingress-controller-ready: "true"
              277 app: ingress
              278 containers:
              279 - name: nginx-ingress-controller
              280 image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.20.0
              281 args:
              # 主要是 app: ingress进行了修改,并注释了原内容


              3、重新执行让其生效并检测;
                [root@node1 ingress-nginx]# kubectl apply -f mandatory.yaml
                # 稍等两分钟,会出现两个pod,并且为running的时候,就表示生效了
                [root@node1 ingress-nginx]# kubectl get pod -n ingress-nginx
                NAME READY STATUS RESTARTS AGE
                default-http-backend-86dcdf4845-lkpkz 1/1 Running 0 50m
                nginx-ingress-controller-qsgfk 1/1 Running 0 40m
                [root@node1 ingress-nginx]#


                切换到node2节点上,验证端口号:
                  [root@node2 ~]# netstat -tunlp | grep 80
                  tcp 0 0 0.0.0.0:18080 0.0.0.0:* LISTEN 44694/nginx: master
                  tcp 0 0 192.168.112.131:2380 0.0.0.0:* LISTEN 771/etcd
                  tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 44694/nginx: master
                  tcp6 0 0 :::18080 :::* LISTEN 44694/nginx: master
                  tcp6 0 0 :::80 :::* LISTEN 44694/nginx: master
                  [root@node2 ~]# netstat -tunlp | grep 443
                  tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 44694/nginx: master
                  tcp6 0 0 :::6443 :::* LISTEN 729/kube-apiserver
                  tcp6 0 0 :::443 :::* LISTEN 44694/nginx: master
                  [root@node2 ~]#


                  4、新建一个demo来测试,在这里我们使用tomcat来测试,文件内容如下;
                    [root@node1 ingress-nginx]# vim ingress-demo.yaml
                    #deploy
                    apiVersion: apps/v1
                    kind: Deployment
                    metadata:
                    name: tomcat-demo
                    spec:
                    selector:
                    matchLabels:
                    app: tomcat-demo
                    replicas: 1
                    template:
                    metadata:
                    labels:
                    app: tomcat-demo
                    spec:
                    containers:
                    - name: tomcat-demo
                    image: registry.cn-hangzhou.aliyuncs.com/liuyi01/tomcat:8.0.51-alpine
                    ports:
                    - containerPort: 8080
                    ---
                    #service
                    apiVersion: v1
                    kind: Service
                    metadata:
                    name: tomcat-demo
                    spec:
                    ports:
                    - port: 80
                    protocol: TCP
                    targetPort: 8080
                    selector:
                    app: tomcat-demo


                    ---
                    #ingress
                    apiVersion: extensions/v1beta1
                    kind: Ingress
                    metadata:
                    name: tomcat-demo
                    spec:
                    rules:
                    - host: tomcat.yunweijia.com
                    http:
                    paths:
                    - path:
                    backend:
                    serviceName: tomcat-demo
                    servicePort: 80
                    [root@node1 ingress-nginx]#


                    5、创建该pod;
                      [root@node1 ingress-nginx]# kubectl create -f ingress-demo.yaml

                      PS:此处稍等3分钟,进行如下检测,确保为running状态。
                        [root@node1 ingress-nginx]# kubectl get pod | grep tomcat-demo
                        tomcat-demo-54cbbcffdb-x8qck 1/1 Running 0 27m
                        [root@node1 ingress-nginx]#


                        6、修改本机(windows上的,就是你的客户端)hosts文件,文件最后面新增如下两行内容:
                          192.168.112.131 api.yunweijia.com
                          192.168.112.131 tomcat.yunweijia.com


                          7、浏览器访问

                            http://api.yunweijia.com
                            返回状态如下:

                            为什么返回这个呢,这是因为我们运行的demo中没有定义该名字,所以k8s默认返回了一个backend,就是404,这是正常流程。

                              http://tomcat.yunweijia.com
                              返回状态如下:


                              至此,本文结束。
                              发现从开始到现在,一直没有说过k8s的yaml文件如何编写,格式怎样,下一篇我们就主要介绍该内容。


                              往期推荐

                              三分钟解决centos8停止维护,我们如何下载软件这个问题

                              五分钟学会linux磁盘共享之nfs技术

                              07-docker系列-使用dockerfile构建python、jenkins镜像

                               

                              添加关注,带你高效运维 


                              文章转载自运维家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                              评论