Kubernetes集群服务暴露之Nginx Ingress Controller

前提条件:有一套K8S集群,快速部署参考
使用sealos部署kubernetes集群并实现集群管理

一、Nginx Ingress Controller

1.1 nginx ingress controller位置

在这里插入图片描述
参考链接:https://www.f5.com/products/nginx/nginx-ingress-controller

1.2 nginx ingress controller部署

[root@k8s-master1 ~]#  curl -k https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml  -o deploy.yaml


# 应用资源清单文件
[root@k8s-master1 ~]# 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

# 验证部署结果
# 注意镜像较大,可提前下载至集群node节点
[root@k8s-master01 ~]# kubectl get pods -n ingress-nginx
NAME                                              READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-nginx-rhftv        0/1     Completed   0          55m
ingress-nginx-admission-patch-nginx-7w9zd         0/1     Completed   1          55m
ingress-nginx-controller-nginx-84d5995659-95phs   1/1     Running     0          55m

[root@k8s-master01 ~]# kubectl get all -n ingress-nginx
NAME                                                  READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-nginx-rhftv        0/1     Completed   0          55m
pod/ingress-nginx-admission-patch-nginx-7w9zd         0/1     Completed   1          55m
pod/ingress-nginx-controller-nginx-84d5995659-95phs   1/1     Running     0          55m

NAME                                               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller-admission-nginx   ClusterIP   10.96.2.210   <none>        443/TCP                      55m
service/ingress-nginx-controller-nginx             NodePort    10.96.0.214   <none>        80:32067/TCP,443:32076/TCP   55m


NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller-nginx   1/1     1            1           55m

NAME                                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-nginx-84d5995659   1         1         1       55m

NAME                                             COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create-nginx   1/1           8s         55m
job.batch/ingress-nginx-admission-patch-nginx    1/1           10s        55m

1.3 ingress对象应用案例

1.3 1 ingress-http案例

基于名称的负载均衡

1.3.1.1 创建deployment控制器类型应用
[root@k8s-master1 ~]# vim nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: ingress-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: c1
        image: nginx:1.15-alpine
        imagePullPolicy: IfNotPresent
[root@k8s-master1 ~]# kubectl apply -f nginx.yml
deployment.extensions/nginx created

[root@k8s-master1 ~]# kubectl get pods -n ingress-nginx
[root@k8s-master01 ~]# kubectl get pods -n ingress-nginx
NAME                                              READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-nginx-rhftv        0/1     Completed   0          61m
ingress-nginx-admission-patch-nginx-7w9zd         0/1     Completed   1          61m
ingress-nginx-controller-nginx-84d5995659-95phs   1/1     Running     0          61m
nginx-65c749f4dc-6zccn                            1/1     Running     0          55m
nginx-65c749f4dc-wvrbq                            1/1     Running     0          55m

1.3.1.2 创建service
[root@k8s-master1 ~]# vim nginx-service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: ingress-nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

应用YAML

[root@k8s-master1 ~]# kubectl apply -f nginx-service.yml
service/nginx-service created

验证service

[root@k8s-master1 ~]# kubectl get svc -n ingress-nginx
NAME                                       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller-admission-nginx   ClusterIP   10.96.2.210   <none>        443/TCP                      62m
ingress-nginx-controller-nginx             NodePort    10.96.0.214   <none>        80:32067/TCP,443:32076/TCP   62m
nginx-service                              ClusterIP   10.96.2.69    <none>        80/TCP                       55m
1.3.1.3 创建ingress对象
[root@k8s-master1 ~]# vim ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-nginx                    #自定义ingress名称
  namespace: ingress-nginx
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: www.mytest.com                   # 自定义域名
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: nginx-service     # 对应上面创建的service名称
            port:
              number: 80

应用YAML

[root@k8s-master1 ~]# kubectl apply -f ingress-nginx.yaml
ingress.extensions/ingress-nginx created

验证ingress

[root@k8s-master1 ~]# kubectl get ingress -n ingress-nginx
NAME            CLASS    HOSTS             ADDRESS         PORTS   AGE
ingress-nginx   <none>   www.mytest.com    192.168.10.12   80      113s

描述查看ingress信息

[root@k8s-master1 ~]# kubectl describe ingress ingress-nginx -n ingress-nginx
Name:             ingress-nginx
Labels:           <none>
Namespace:        ingress-nginx
Address:          192.168.95.145
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host             Path  Backends
  ----             ----  --------
  www.mytest.com
                   /   nginx-service:80 (100.119.84.73:80,100.119.84.74:80)
Annotations:       ingressclass.kubernetes.io/is-default-class: true
                   kubernetes.io/ingress.class: nginx
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  Sync    54m (x2 over 55m)  nginx-ingress-controller  Scheduled for sync
[root@k8s-master1 ~]# kubectl get pods -o wide -n ingress-nginx
NAME                                              READY   STATUS      RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES

nginx-65c749f4dc-6zccn                            1/1     Running     0          58m   100.119.84.74   k8s-worker01   <none>           <none>
nginx-65c749f4dc-wvrbq                            1/1     Running     0          58m   100.119.84.73   k8s-worker01   <none>           <none>
可以看到两个pod的IP 100.119.84.74 100.119.84.73 正好对应ingress域名 www.mytest.com对应的IP
2.3.1.4 模拟客户端访问

1, 确认nginx-ingress-controller的podIP, 下面命令查询的结果为192.168.10.91

[root@k8s-master1 ~]# kubectl get svc -n ingress-nginx  |grep ingress
ingress-nginx-controller-admission-nginx   ClusterIP   10.96.2.210   <none>        443/TCP                      72m
ingress-nginx-controller-nginx             NodePort    10.96.0.214   <none>        80:32067/TCP,443:32076/TCP   72m
                   11m

2, 在集群之外任一主机中添加上述域名与k8s 任一节点IP地址解析(模拟公网DNS)
我这里配的k8s-master01的IP

[root@otherhost ~]# vim /etc/hosts
192.168.95.142 www.mytest.com

3, 准备pod内容器运行的web主页

[root@k8s-master1 ~]# kubectl get pods  -n ingress-nginx 
nginx-65c749f4dc-6zccn                            1/1     Running     0          79m
nginx-65c749f4dc-wvrbq                            1/1     Running     0          79m



[root@k8s-master1 ~]# kubectl exec -it nginx-65c749f4dc-6zccn -n ingress-nginx  -- /bin/sh
/ # echo "ingress web1" > /usr/share/nginx/html/index.html
/ # exit

[root@k8s-master1 ~]# kubectl exec -it nginx-65c749f4dc-wvrbq -n ingress-nginx -- /bin/sh
/ # echo "ingress web2" > /usr/share/nginx/html/index.html
/ # exit

4, 访问及结果展示

[root@otherhost ~]# curl www.mytest.com::32067
ingress web1
[root@otherhost ~]# curl www.mytest.com:32067
ingress web2

1.4 访问流程图

在这里插入图片描述
我们进入到容器内查看ingress-nginx-controller-nginx的nginx.conf


[root@k8s-master01 ~]# kubectl exec -it ingress-nginx-controller-nginx-84d5995659-95phs  -n ingress-nginx -- sh
/etc/nginx $ cat nginx.conf

### 这是创建Ingress对象后自动创建出的一段配置,其实原理也还是通过nginx做的反向代理来实现
        ## start server www.mytest.com
        server {
                server_name www.mytest.com ;

                listen 80  ;
                listen [::]:80  ;
                listen 443  ssl http2 ;
                listen [::]:443  ssl http2 ;

                set $proxy_upstream_name "-";

                ssl_certificate_by_lua_block {
                        certificate.call()
                }

                location / {

                        set $namespace      "ingress-nginx";
                        set $ingress_name   "ingress-nginx";
                        set $service_name   "nginx-service";
                        set $service_port   "80";
                        set $location_path  "/";
                        set $global_rate_limit_exceeding n;

                        rewrite_by_lua_block {
                                lua_ingress.rewrite({
                                        force_ssl_redirect = false,
                                        ssl_redirect = true,
                                        force_no_ssl_redirect = false,
                                        preserve_trailing_slash = false,
                                        use_port_in_redirects = false,
                                        global_throttle = { namespace = "", limit = 0, window_size = 0, key = { }, ignored_cidrs = { } },
                                })
                                balancer.rewrite()
                                plugins.run()
                        }

                        # be careful with `access_by_lua_block` and `satisfy any` directives as satisfy any
                        # will always succeed when there's `access_by_lua_block` that does not have any lua code doing `ngx.exit(ngx.DECLINED)`
                        # other authentication method such as basic auth or external auth useless - all requests will be allowed.
                        #access_by_lua_block {
                        #}

                        header_filter_by_lua_block {
                                lua_ingress.header()
                                plugins.run()
                        }

                        body_filter_by_lua_block {
                                plugins.run()
                        }

                        log_by_lua_block {
                                balancer.log()

                                monitor.call()

                                plugins.run()
                        }

                        port_in_redirect off;

                        set $balancer_ewma_score -1;
                        set $proxy_upstream_name "ingress-nginx-nginx-service-80";
                        set $proxy_host          $proxy_upstream_name;
                        set $pass_access_scheme  $scheme;

                        set $pass_server_port    $server_port;

                        set $best_http_host      $http_host;
                        set $pass_port           $pass_server_port;

                        set $proxy_alternative_upstream_name "";

                        client_max_body_size                    1m;

                        proxy_set_header Host                   $best_http_host;

                        # Pass the extracted client certificate to the backend

                        # Allow websocket connections
                        proxy_set_header                        Upgrade           $http_upgrade;

                        proxy_set_header                        Connection        $connection_upgrade;

                        proxy_set_header X-Request-ID           $req_id;
                        proxy_set_header X-Real-IP              $remote_addr;

                        proxy_set_header X-Forwarded-For        $remote_addr;

                        proxy_set_header X-Forwarded-Host       $best_http_host;
                        proxy_set_header X-Forwarded-Port       $pass_port;
                        proxy_set_header X-Forwarded-Proto      $pass_access_scheme;
                        proxy_set_header X-Forwarded-Scheme     $pass_access_scheme;

                        proxy_set_header X-Scheme               $pass_access_scheme;

                        # Pass the original X-Forwarded-For
                        proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;

                        # mitigate HTTPoxy Vulnerability
                        # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
                        proxy_set_header Proxy                  "";

                        # Custom headers to proxied server

                        proxy_connect_timeout                   5s;
                        proxy_send_timeout                      60s;
                        proxy_read_timeout                      60s;

                        proxy_buffering                         off;
                        proxy_buffer_size                       4k;
                        proxy_buffers                           4 4k;

                        proxy_max_temp_file_size                1024m;

                        proxy_request_buffering                 on;
                        proxy_http_version                      1.1;

                        proxy_cookie_domain                     off;
                        proxy_cookie_path                       off;

                        # In case of errors try the next upstream server before returning an error
                        proxy_next_upstream                     error timeout;
                        proxy_next_upstream_timeout             0;
                        proxy_next_upstream_tries               3;

                        proxy_pass http://upstream_balancer;

                        proxy_redirect                          off;

                }

        }
        ## end server www.mytest.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值