一,暴露方法
     1、hostNetwork:true    在pod中使用该配置,在这种Pod中运行的应用程序可以直接看到pod启动的主机的网络接口。
     2、hostPort:直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过主机的IP来访问Pod了。
     3、NodePort:是K8s里一个广泛应用的服务暴露方式。K8s中的service默认情况都是使用Cluster IP这种类型,会产生一个只能在内部访问的Cluster IP,如果想能够直接访问service,需要将service type修改为nodePort。同时给改service指定一个nodeport值(30000-32767),
     4、​LoadBalancer:只能在service上定义,是公有云提供的负载均衡器。
     5、​Ingress:ingress controller是由K8s管理的负载均衡容器,它的镜像包含一个nginx或HAProxy负载均衡器和一个控制器守护进程。
二,ingress部署
    0. 概念:
        通常情况下,Service 和 Pod 的 IP 仅可在集群内部访问, Ingress 就是为进入集群的请求提供路由规则的集合,ingress处于多个服务的前端,相当于智能路由或者集群入口。它允许你基于路径或者子域名来路由流量到后端服务。
        ingress 控制器类型: Google Cloud Load Balance, Nginx , Contour , Istio等。
        ingress 控制器插件: cert-manager
        方法:如果想要应用这些规则,集群管理员需要部署一个ingress Controller,它监听Ingress和Service的变化,并根据规则配置负载均衡并提供访问入口。
    1. 功能:
        定义规则来允许进入集群的请求被转发到集群中对应服务上,从来实现服务暴漏。把集群内 Service 配置成外网能够访问的 URL。
    2. ingress组成
        1). Nginx 反向代理负载均衡器
        2). Ingress Controller
            跟 Kubernetes API 交互,实时获取后端 Service、Pod 等的变化,结合 Ingress 定义的规则生成配置,
            更新上边的 Nginx 负载均衡器,并刷新使配置生效,来达到服务自动发现的作用。
        3). Ingress
            定义规则,通过它定义某个域名的请求过来之后转发到集群中指定的 Service。
            可以通过 Yaml 文件定义,给一个或多个 Service 定义一个或多个 Ingress 规则。
    3. 步骤
        a. 创建ingress 控制器 ingress-nginx
            wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/mandatory.yaml
            wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/provider/baremetal/service-nodeport.yaml
            docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2 [下载比较慢,我的是国外服务器提前下载]
            docker save quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2 >  nginx-ingress-controller.tar
            传到k8s集群服务器
            docker load < nginx-ingress-controller.tar
            docker tag quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2 192.168.89.132:5000/nginx-ingress-controller:0.26.2
            docker push 192.168.89.132:5000/nginx-ingress-controller:0.26.2
            vim mandatory.yaml
                image: 192.168.89.132:5000/nginx-ingress-controller:0.26.2 # 只需要修改image位置
            kubectl create -f mandatory.yaml
                namespace/ingress-nginx created
                configmap/nginx-configuration created
                configmap/tcp-services created
                configmap/udp-services created
                serviceaccount/nginx-ingress-serviceaccount created
                clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
                role.rbac.authorization.k8s.io/nginx-ingress-role created
                rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
                clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
                deployment.apps/nginx-ingress-controller created
                limitrange/ingress-nginx created
            kubectl create -f service-nodeport.yaml
                service/ingress-nginx created
            kubectl describe svc ingress-nginx -n ingress-nginx
                Name:                     ingress-nginx
                Namespace:                ingress-nginx
                Labels:                   app.kubernetes.io/name=ingress-nginx
                                          app.kubernetes.io/part-of=ingress-nginx
                Annotations:              <none>
                Selector:                 app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx
                Type:                     NodePort
                IP:                       169.169.129.128
                Port:                     http  80/TCP
                TargetPort:               80/TCP
                NodePort:                 http  63867/TCP
                Endpoints:                10.1.70.6:80
                Port:                     https  443/TCP
                TargetPort:               443/TCP
                NodePort:                 https  2609/TCP
                Endpoints:                10.1.70.6:443
                Session Affinity:         None
                External Traffic Policy:  Cluster
                Events:                   <none>
        b. 验证ingress-nginx
            kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx --watch
            POD_NAMESPACE=ingress-nginx
            POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}')
            kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version
                -------------------------------------------------------------------------------
                NGINX Ingress controller
                  Release:       0.26.2
                  Build:         git-bde101c57
                  Repository:    https://github.com/aledbf/ingress-nginx
                  nginx version: openresty/1.15.8.2
                -------------------------------------------------------------------------------
        c. 创建tomcat.yaml
            vim tomcat.yaml
                apiVersion: apps/v1
                kind: Deployment
                metadata:
                  name: tomcat-app
                spec:
                  replicas: 2
                  selector:
                    matchLabels:
                      app: tomcat
                  template:
                    metadata:
                      labels:
                        app: tomcat
                    spec:
                      containers:
                      - name: tomcat
                        image: '192.168.89.132:5000/tomcat:v3'
                        ports:
                        - containerPort: 8080
                ---
                apiVersion: v1
                kind: Service
                metadata:
                  name: tomcat-http
                spec:
                  ports:
                    - port: 8080
                      targetPort: 8080
                  type: LoadBalancer
                  selector:
                    app: tomcat
            kubectl create -f tomcat.yaml
                deployment.apps/tomcat-app created
                service/tomcat-http created
        d. 部署Ingress
            vim ingress.yaml
                apiVersion: networking.k8s.io/v1beta1
                kind: Ingress
                metadata:
                  name: nginx-web
                  annotations:
                    # 指定 Ingress Controller 的类型
                    kubernetes.io/ingress.class: "nginx"
                    # 指定我们的 rules 的 path 可以使用正则表达式
                    nginx.ingress.kubernetes.io/use-regex: "true"
                    # 连接超时时间,默认为 5s
                    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
                    # 后端服务器回转数据超时时间,默认为 60s
                    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
                    # 后端服务器响应超时时间,默认为 60s
                    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
                    # 客户端上传文件,最大大小,默认为 20m
                    nginx.ingress.kubernetes.io/proxy-body-size: "10m"
                    # URL 重写
                    nginx.ingress.kubernetes.io/rewrite-target: /
                spec:
                  # 路由规则
                  rules:
                  # 主机名,只能是域名,修改为你自己的
                  - host: k8s.web.com
                    http:
                      paths:
                      - path:
                        backend:
                          # 后台部署的 Service Name,与上面部署的 Tomcat 对应
                          serviceName: tomcat-http
                          # 后台部署的 Service Port,与上面部署的 Tomcat 对应
                          servicePort: 8080
            create -f ingress.yaml
                ingress.networking.k8s.io/nginx-web created
            kubectl get deployment
                NAME         READY   UP-TO-DATE   AVAILABLE   AGE
                nginx-app    3/3     3            3           23h
                tomcat-app   2/2     2            2           9m17s
            kubectl get ingress
                NAME        HOSTS         ADDRESS           PORTS   AGE
                nginx-web   k8s.web.com   169.169.129.128   80      2m8s
            kubectl get pods -n ingress-nginx -o wide [nginx-ingress代理地址]
                NAME                                        READY   STATUS    RESTARTS   AGE   IP          NODE             NOMINATED NODE   READINESS GATES
                nginx-ingress-controller-6d96ccd6f4-g2d6b   1/1     Running   0          62m   10.1.70.6   192.168.89.133   <none>           <none>
        e. 设置switchhosts,将192.168.89.133  k8s.web.com加入到本地dns服务域名解析中
            dnsserver:
                k8s.web.com 是 web.com的子域名,所以只需要添加前缀配置即可
                vim /var/named/web.com.zone
                    # 结尾追加
                    k8s       A  192.168.89.133
                systemctl restart named
                nslookup k8s.web.com
                    Server:       192.168.89.128
                    Address:   192.168.89.128#53
                    Name:  k8s.web.com
                    Address: 192.168.89.133
                能够解析到,说明本地dns添加解析成功。
        f. 测试访问
            访问不到,有问题,后期排错













Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐