K8s: Ingress对象, 创建Ingress控制器, 创建Ingress资源并暴露服务

linux系统Kubernetes工具ingress暴露服务 阅读详情

Ingress对象


1 )概述

  • Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP
  • Ingress-nginx 本质是网关,当你请求 abc.com/service/a, Ingress 就把对应的地址转发给你,底层运行了一个 nginx
  • 但 K8s 为什么不直接使用 nginx 呢,是因为 K8s 也需要把转发的路由规则纳入它的配置管理
  • 变成 ingress 对象,所有才有 ingress 这个资源对象, Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由
  • 流量路由由 Ingress 资源上定义的规则控制
  • 所以,它的功能类似 Nginx,可以根据域名、路径把请求转发到不同的 Service
  • Ingress 为外部访问集群提供了一个统一入口,避免了对外暴露集群端口,也可以配置 https

2 )示例图

  • 下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例
  • 在 Service 层已经可以对外提供服务了,但是
  • 在后端 Service 安全权限非常高的情况下,直连 Service 层风险非常大
  • 从客户端里,通过Ingress的controller调度到Ingress服务,Ingress 可以理解为一个反向代理服务
  • 这样,避免了直连Service层的风险,所以,Ingress 也类似于网关层,调度到Service之后
  • 再由底层调度到相关的 Pod 中访问对应的服务
  • Ingress 有两种实践方法
    • 一种是, Ingress Nginx 实现,在Nginx官方中有相关说明
    • 另一种就是在 K8s 中的实践
  • 对于典型生产环境来说,有上图这样一套调用链
  • 可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力
  • Ingress控制器通常负责通过负载均衡器来实现 Ingress

3 )最小 Ingress 资源示例

  • 定义 ing-min.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:   # 除了 http 还可以定义其他路由规则
      paths:  # 这个名称意味着可以定义多个 path
        - path: /testpath
          pathType: Prefix
          backend:
            service:
              name: test
              port:
                number: 80
  • 基于以上的配置定义,客户端可以通过比如 xxx.com/testpath 请求
  • 通过这个请求,会被 Ingress 捕获,根据这个请求规则,会匹配后端的 backend service
  • 这个 service 名称就是 k8s 中的 service 名称,下面是对应的端口号
  • 通过这个转发,类似于 nginx,实现路由规则的http转发
  • 关于 Ingress 规则,每个 HTTP 规则都包含以下信息
    • 1 )可选的 host
      • 在此示例中,未指定 host,因此该规则适用于通过指定 IP 地址的所有入站 HTTP 通信
      • 如果提供了 host(例如 foo.bar.com),则 rules 适用于该 host
    • 2 )路径列表 paths(例如,/testpath)
      • 每个路径都有一个由 serviceName 和 servicePort 定义的关联后端
      • 在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容
    • 3 )backend(后端)
      • 是 Service 文档中所述的服务和端口名称的组合
      • 与规则的 host 和 path 匹配的对 Ingress 的 HTTP(和 HTTPS )请求将发送到列出的 backend

4 )Ingress 控制器

  • 关于 Ingress 控制器

    • 为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器
    • 与其他类型的控制器不同,Ingress 控制器不是随集群自动启动的
  • 版本对应

  • 安装 Ingress 控制器

    • 这里创建一个 ing-nginx-ctrl.yaml 文件
    • 和上面官方不同的几点是:
      • 在第一个Service中找到 spec 下

        • externalTrafficPolicy: Local 修改为 externalTrafficPolicy: Cluster
        • 并在这个配置的上面添加一行: clusterIP: 10.1.211.240
        • 在 name: http 下添加一行 nodePort: 31686
        • 在 name: https 下添加一行 ``
        • 找到 type: LoadBalancer 修改为 type: NodePort
      • 替换通用镜像

        • 先找到 image: registry.k8s.io/ingress-nginx/controller:v1.4.0@sha256:34ee929b111ffc7aa426ffd409af44da48e5a0eea1eb2207994d9e0c0882d143
        • 修改为: image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:v1.4.0
        • 再找到 image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343@sha256:39c5b2e3310dc4264d638ad28d9d1d96c4cbb2b2dcfb52368fe4e3c63f61e10f
        • 修改为: image: registry.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.0
        • 注意,这些镜像可以先拉到本地
          • $ sudo docker pull registry.aliyuncs.com/google_containers/nginx-ingress-controller:v1.4.0
          • $ sudo docker pull registry.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.0
      • 修改后的 ing-nginx-ctrl.yaml 文件内容如下

        apiVersion: v1
        kind: Namespace
        metadata:
          labels:
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
          name: ingress-nginx
        ---
        apiVersion: v1
        automountServiceAccountToken: true
        kind: ServiceAccount
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx
          namespace: ingress-nginx
        ---
        apiVersion: v1
        kind: ServiceAccount
        metadata:
          labels:
            app.kubernetes.io/component: admission-webhook
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-admission
          namespace: ingress-nginx
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: Role
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx
          namespace: ingress-nginx
        rules:
        - apiGroups:
          - ""
          resources:
          - namespaces
          verbs:
          - get
        - apiGroups:
          - ""
          resources:
          - configmaps
          - pods
          - secrets
          - endpoints
          verbs:
          - get
          - list
          - watch
        - apiGroups:
          - ""
          resources:
          - services
          verbs:
          - get
          - list
          - watch
        - apiGroups:
          - networking.k8s.io
          resources:
          - ingresses
          verbs:
          - get
          - list
          - watch
        - apiGroups:
          - networking.k8s.io
          resources:
          - ingresses/status
          verbs:
          - update
        - apiGroups:
          - networking.k8s.io
          resources:
          - ingressclasses
          verbs:
          - get
          - list
          - watch
        - apiGroups:
          - ""
          resourceNames:
          - ingress-controller-leader
          resources:
          - configmaps
          verbs:
          - get
          - update
        - apiGroups:
          - ""
          resources:
          - configmaps
          verbs:
          - create
        - apiGroups:
          - coordination.k8s.io
          resourceNames:
          - ingress-controller-leader
          resources:
          - leases
          verbs:
          - get
          - update
        - apiGroups:
          - coordination.k8s.io
          resources:
          - leases
          verbs:
          - create
        - apiGroups:
          - ""
          resources:
          - events
          verbs:
          - create
          - patch
        - apiGroups:
          - discovery.k8s.io
          resources:
          - endpointslices
          verbs:
          - list
          - watch
          - get
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: Role
        metadata:
          labels:
            app.kubernetes.io/component: admission-webhook
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-admission
          namespace: ingress-nginx
        rules:
        - apiGroups:
          - ""
          resources:
          - secrets
          verbs:
          - get
          - create
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRole
        metadata:
          labels:
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx
        rules:
        - apiGroups:
          - ""
          resources:
          - configmaps
          - endpoints
          - nodes
          - pods
          - secrets
          - namespaces
          verbs:
          - list
          - watch
        - apiGroups:
          - coordination.k8s.io
          resources:
          - leases
          verbs:
          - list
          - watch
        - apiGroups:
          - ""
          resources:
          - nodes
          verbs:
          - get
        - apiGroups:
          - ""
          resources:
          - services
          verbs:
          - get
          - list
          - watch
        - apiGroups:
          - networking.k8s.io
          resources:
          - ingresses
          verbs:
          - get
          - list
          - watch
        - apiGroups:
          - ""
          resources:
          - events
          verbs:
          - create
          - patch
        - apiGroups:
          - networking.k8s.io
          resources:
          - ingresses/status
          verbs:
          - update
        - apiGroups:
          - networking.k8s.io
          resources:
          - ingressclasses
          verbs:
          - get
          - list
          - watch
        - apiGroups:
          - discovery.k8s.io
          resources:
          - endpointslices
          verbs:
          - list
          - watch
          - get
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRole
        metadata:
          labels:
            app.kubernetes.io/component: admission-webhook
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-admission
        rules:
        - apiGroups:
          - admissionregistration.k8s.io
          resources:
          - validatingwebhookconfigurations
          verbs:
          - get
          - update
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: RoleBinding
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx
          namespace: ingress-nginx
        roleRef:
          apiGroup: rbac.authorization.k8s.io
          kind: Role
          name: ingress-nginx
        subjects:
        - kind: ServiceAccount
          name: ingress-nginx
          namespace: ingress-nginx
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: RoleBinding
        metadata:
          labels:
            app.kubernetes.io/component: admission-webhook
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-admission
          namespace: ingress-nginx
        roleRef:
          apiGroup: rbac.authorization.k8s.io
          kind: Role
          name: ingress-nginx-admission
        subjects:
        - kind: ServiceAccount
          name: ingress-nginx-admission
          namespace: ingress-nginx
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRoleBinding
        metadata:
          labels:
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx
        roleRef:
          apiGroup: rbac.authorization.k8s.io
          kind: ClusterRole
          name: ingress-nginx
        subjects:
        - kind: ServiceAccount
          name: ingress-nginx
          namespace: ingress-nginx
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRoleBinding
        metadata:
          labels:
            app.kubernetes.io/component: admission-webhook
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-admission
        roleRef:
          apiGroup: rbac.authorization.k8s.io
          kind: ClusterRole
          name: ingress-nginx-admission
        subjects:
        - kind: ServiceAccount
          name: ingress-nginx-admission
          namespace: ingress-nginx
        ---
        apiVersion: v1
        data:
          allow-snippet-annotations: "true"
        kind: ConfigMap
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-controller
          namespace: ingress-nginx
        ---
        apiVersion: v1
        kind: Service
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-controller
          namespace: ingress-nginx
        spec:
          clusterIP: 10.1.211.240
          externalTrafficPolicy: Cluster
          ipFamilies:
          - IPv4
          ipFamilyPolicy: SingleStack
          ports:
          - appProtocol: http
            name: http
            nodePort: 31686
            port: 80
            protocol: TCP
            targetPort: http
          - appProtocol: https
            name: https
            nodePort: 30036
            port: 443
            protocol: TCP
            targetPort: https
          selector:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
          type: NodePort
        ---
        apiVersion: v1
        kind: Service
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-controller-admission
          namespace: ingress-nginx
        spec:
          ports:
          - appProtocol: https
            name: https-webhook
            port: 443
            targetPort: webhook
          selector:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
          type: ClusterIP
        ---
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-controller
          namespace: ingress-nginx
        spec:
          minReadySeconds: 0
          revisionHistoryLimit: 10
          selector:
            matchLabels:
              app.kubernetes.io/component: controller
              app.kubernetes.io/instance: ingress-nginx
              app.kubernetes.io/name: ingress-nginx
          template:
            metadata:
              labels:
                app.kubernetes.io/component: controller
                app.kubernetes.io/instance: ingress-nginx
                app.kubernetes.io/name: ingress-nginx
            spec:
              containers:
              - args:
                - /nginx-ingress-controller
                - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
                - --election-id=ingress-controller-leader
                - --controller-class=k8s.io/ingress-nginx
                - --ingress-class=nginx
                - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
                - --validating-webhook=:8443
                - --validating-webhook-certificate=/usr/local/certificates/cert
                - --validating-webhook-key=/usr/local/certificates/key
                env:
                - name: POD_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.name
                - name: POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                - name: LD_PRELOAD
                  value: /usr/local/lib/libmimalloc.so
                image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:v1.4.0
                imagePullPolicy: IfNotPresent
                lifecycle:
                  preStop:
                    exec:
                      command:
                      - /wait-shutdown
                livenessProbe:
                  failureThreshold: 5
                  httpGet:
                    path: /healthz
                    port: 10254
                    scheme: HTTP
                  initialDelaySeconds: 10
                  periodSeconds: 10
                  successThreshold: 1
                  timeoutSeconds: 1
                name: controller
                ports:
                - containerPort: 80
                  name: http
                  protocol: TCP
                - containerPort: 443
                  name: https
                  protocol: TCP
                - containerPort: 8443
                  name: webhook
                  protocol: TCP
                readinessProbe:
                  failureThreshold: 3
                  httpGet:
                    path: /healthz
                    port: 10254
                    scheme: HTTP
                  initialDelaySeconds: 10
                  periodSeconds: 10
                  successThreshold: 1
                  timeoutSeconds: 1
                resources:
                  requests:
                    cpu: 100m
                    memory: 90Mi
                securityContext:
                  allowPrivilegeEscalation: true
                  capabilities:
                    add:
                    - NET_BIND_SERVICE
                    drop:
                    - ALL
                  runAsUser: 101
                volumeMounts:
                - mountPath: /usr/local/certificates/
                  name: webhook-cert
                  readOnly: true
              dnsPolicy: ClusterFirst
              nodeSelector:
                kubernetes.io/os: linux
              serviceAccountName: ingress-nginx
              terminationGracePeriodSeconds: 300
              volumes:
              - name: webhook-cert
                secret:
                  secretName: ingress-nginx-admission
        ---
        apiVersion: batch/v1
        kind: Job
        metadata:
          labels:
            app.kubernetes.io/component: admission-webhook
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-admission-create
          namespace: ingress-nginx
        spec:
          template:
            metadata:
              labels:
                app.kubernetes.io/component: admission-webhook
                app.kubernetes.io/instance: ingress-nginx
                app.kubernetes.io/name: ingress-nginx
                app.kubernetes.io/part-of: ingress-nginx
                app.kubernetes.io/version: 1.4.0
              name: ingress-nginx-admission-create
            spec:
              containers:
              - args:
                - create
                - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc
                - --namespace=$(POD_NAMESPACE)
                - --secret-name=ingress-nginx-admission
                env:
                - name: POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                image: registry.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.0
                imagePullPolicy: IfNotPresent
                name: create
                securityContext:
                  allowPrivilegeEscalation: false
              nodeSelector:
                kubernetes.io/os: linux
              restartPolicy: OnFailure
              securityContext:
                fsGroup: 2000
                runAsNonRoot: true
                runAsUser: 2000
              serviceAccountName: ingress-nginx-admission
        ---
        apiVersion: batch/v1
        kind: Job
        metadata:
          labels:
            app.kubernetes.io/component: admission-webhook
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-admission-patch
          namespace: ingress-nginx
        spec:
          template:
            metadata:
              labels:
                app.kubernetes.io/component: admission-webhook
                app.kubernetes.io/instance: ingress-nginx
                app.kubernetes.io/name: ingress-nginx
                app.kubernetes.io/part-of: ingress-nginx
                app.kubernetes.io/version: 1.4.0
              name: ingress-nginx-admission-patch
            spec:
              containers:
              - args:
                - patch
                - --webhook-name=ingress-nginx-admission
                - --namespace=$(POD_NAMESPACE)
                - --patch-mutating=false
                - --secret-name=ingress-nginx-admission
                - --patch-failure-policy=Fail
                env:
                - name: POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                image: registry.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.0
                imagePullPolicy: IfNotPresent
                name: patch
                securityContext:
                  allowPrivilegeEscalation: false
              nodeSelector:
                kubernetes.io/os: linux
              restartPolicy: OnFailure
              securityContext:
                fsGroup: 2000
                runAsNonRoot: true
                runAsUser: 2000
              serviceAccountName: ingress-nginx-admission
        ---
        apiVersion: networking.k8s.io/v1
        kind: IngressClass
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: nginx
        spec:
          controller: k8s.io/ingress-nginx
        ---
        apiVersion: admissionregistration.k8s.io/v1
        kind: ValidatingWebhookConfiguration
        metadata:
          labels:
            app.kubernetes.io/component: admission-webhook
            app.kubernetes.io/instance: ingress-nginx
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
            app.kubernetes.io/version: 1.4.0
          name: ingress-nginx-admission
        webhooks:
        - admissionReviewVersions:
          - v1
          clientConfig:
            service:
              name: ingress-nginx-controller-admission
              namespace: ingress-nginx
              path: /networking/v1/ingresses
          failurePolicy: Fail
          matchPolicy: Equivalent
          name: validate.nginx.ingress.kubernetes.io
          rules:
          - apiGroups:
            - networking.k8s.io
            apiVersions:
            - v1
            operations:
            - CREATE
            - UPDATE
            resources:
            - ingresses
          sideEffects: None
        
      • 简单来说 ingress controller 实际在系统里面创建一系列的pod

      • 本质上就是运行在 K8s服务器上的一系列的 pod, 通过 pod 来接管

      • 外部到 K8s work node 上的请求,所以,它就是类似于 nginx 的组件

      • $ kubectl apply -f ing-nginx-ctrl.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
        
      • $ kubectl get all -n ingress-nginx 查看命名空间下的所有信息

          NAME                                            READY   STATUS      RESTARTS   AGE
        pod/ingress-nginx-admission-create--1-8nbrv     0/1     Completed   0          65s
        pod/ingress-nginx-admission-patch--1-2q9x9      0/1     Completed   3          65s
        pod/ingress-nginx-controller-6747799754-v2vhq   1/1     Running     0          65s
        
        NAME                                         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
        service/ingress-nginx-controller             NodePort    10.1.211.240   <none>        80:31686/TCP,443:30036/TCP   65s
        service/ingress-nginx-controller-admission   ClusterIP   10.1.195.73    <none>        443/TCP                      65s
        
        NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
        deployment.apps/ingress-nginx-controller   1/1     1            1           65s
        
        NAME                                                  DESIRED   CURRENT   READY   AGE
        replicaset.apps/ingress-nginx-controller-6747799754   1         1         1       65s
        
        NAME                                       COMPLETIONS   DURATION   AGE
        job.batch/ingress-nginx-admission-create   1/1           21s        65s
        job.batch/ingress-nginx-admission-patch    1/1           44s        65s
        
        • 这里,发现namespace为ingress-nginx的三个pod已经成功完成
        • status为Completed的两个pod为job类型资源,Completed表示job已经成功执行
        • status为Running的pod就是控制器
      • 有了这样的一个组件在K8s平台运行起来之后,可以检查部署版本,粘贴如下

        • $ POD_NAMESPACE=ingress-nginx
        • $ POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l app.kubernetes.io/name=ingress-nginx --field-selector=status.phase=Running -o jsonpath='{.items[0].metadata.name}')
        • $ kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version
          -------------------------------------------------------------------------------
          NGINX Ingress controller
            Release:       v1.4.0
            Build:         50be2bf95fd1ef480420e2aa1d6c5c7c138c95ea
            Repository:    https://github.com/kubernetes/ingress-nginx
            nginx version: nginx/1.19.10
          
          -------------------------------------------------------------------------------
          
      • $ kubectl get svc -n ingress-nginx 查看可用Services

        NAME                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
        ingress-nginx-controller             NodePort    10.1.211.240   <none>        80:31686/TCP,443:30036/TCP   9m49s
        ingress-nginx-controller-admission   ClusterIP   10.1.195.73    <none>        443/TCP                      9m49s
        
      • 到现在为止,服务已经搭建起来了,我们来验证一下

        • $ curl node1.k8s:31686 或 curl node2.k8s:31686
        • 说明: node1.k8s 或 node2.k8s 是可用的work node, 本地配置了 hosts,才可这样访问
        • 如果结果显示如下,则表示服务已经通了
          <html>
          <head><title>404 Not Found</title></head>
          <body>
          <center><h1>404 Not Found</h1></center>
          <hr><center>nginx</center>
          </body>
          </html>
          
      • 综上,ingress 的控制器已经搭建完毕

5 )基于 ingress 控制器创建 ingress 资源,并对外暴露服务

  • 在创建 ingress 资源之前,先部署我们的后端应用服务,这里做最简单的示例
    • $ kubectl create deployment web --image=registry.cn-beijing.aliyuncs.com/qingfeng666/hello-app:1.0 基于 development 维护一个pod
      deployment.apps/web created
      
    • $ kubectl get po -w 监控pod的状态,等待 Running
      NAME                   READY   STATUS    RESTARTS   AGE
      web-6db77f5fdb-qkk6n   1/1     Running   0          7s
      
    • $ kubectl expose deployment web --type=NodePort --port=8080 将 development 服务暴露出来
      service/web exposed
      
    • $ kubectl get svc 获取目前的服务
      NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
      kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP          5d8h
      web          NodePort    10.1.47.34   <none>        8080:32041/TCP   8s
      
    • $ curl node1.k8s:32041 或 curl node2.k8s:32041
       Hello, world!
       Version: 1.0.0
       Hostname: web-6db77f5fdb-65wfv
      
      • 可见,在集群内部,我们的服务已经启动起来了
    • 现在内部pod和Service已经就绪,现在可以进行创建 ingress 资源了
    • $ vi ing-demo.yaml
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: ingress-nginx
        annotations:
          nginx.ingress.kubernetes.io/rewrite-target: /
      spec:
         ingressClassName: nginx
         rules:
         - host: hello-world.info
           http:
             paths:
             - path: /
               pathType: Prefix
               backend:
                 service:
                   name: web
                   port:
                     number: 8080
      
    • $ kubectl apply -f ing-demo.yaml 创建 ingress 资源
      ingress.networking.k8s.io/ingress-nginx created
      
    • $ kubectl get ing 查看 ingress 资源
      NAME            CLASS   HOSTS              ADDRESS        PORTS   AGE
      ingress-nginx   nginx   hello-world.info   10.1.211.240   80      2m13s
      
    • $ sudo vi /etc/hosts 添加一行, 对当前ip进行域名的配置
      10.1.211.240  hello-world.info
      
    • $ curl hello-world.info 访问域名,发现通了
      Hello, world!
      Version: 1.0.0
      Hostname: web-6db77f5fdb-65wfv
      
    • 这样,就完成了集群外的暴露,但是还需要再客户端机器或云服务器的域名解析,这里选择前者
      • 比如,在 我的Mac电脑上连接当前 hello-world服务,这里前提是: Mac电脑和Centos可以连通
      • 在 Mac 上配置某个 Centos 的work node的host, $ sudo vi /etc/hosts
        10.211.55.11  hello-world.info
        
      • 这里的 10.211.55.11 对应 work node 的 ip
    • 在我的 Mac 上浏览器访问: http://hello-world.info:31686,如下
【Linux39-4】Ingress简介及部署、创建Ingress(加密、认证、重写) 文章目录1. Ingress1.1 简介1.2 Ingress 规则2. 部署Ingress环境3. 创建Ingress3.1 创建3.2 加密(TLS证书)3.3 认证3.4 重写(rewrite-target)3.5 重写(app root) master端:server2 node端:server3,server4 1. Ingress Ingress官网文档 Ingress控制器官方文档 1.1 简介 Ingress: Ingress 是对集群中服务的外部访问进行管理的 API 对象, 阅读详情

相关推荐

kubernetes(k8s): service 和 ingress

文章目录一 总述1 service 作用2 service资源及实现模型1 service 概述2 虚拟IP和服务代理1 虚拟IP2 代理模型二 service 资源基本应用1 创建service 资源1 使用命令行创建service资源2 使用配置文件创建service2 service 会话粘滞性1 概述2 设置字段解析3 部署实例并验证3 服务发现1 概述2 服务发现实现机制3 服务发现类型4 服务发现4 服务暴露1 service类型三. ingress资源应用1 概述2 ingress 和 ing

weixin_43936969的博客 3901

【kubernetes搭建(四)】搭建Ingress

一、介绍 Ingress 的实现分为两个部分 Ingress Controller 和 Ingress。 Ingress Controller 是流量的入口,是一个实体软件, 一般是Nginx 和 Haproxy(较少使用)。 Ingress 描述具体的路由规则。 Ingress Controller 会监听 api server上的 /ingresses 资源 并实时生效。 Ingerss 描述了一个或者多个 域名的路由规则,以 ingress 资源的形式存在。 简单说: Ingress 描述路由规则,

sumengnan的博客 3057

Kubernetes Ingress 简介

创建一个 Ingress 资源来定义外部访问的规则。这些规则包括主机名、路径、目标服务等。metadata:spec:rules:http:paths:- path: /backend:service:port:number: 80在这个示例中,Ingress 定义了将主机名下的路径的请求路由到名为的 Service 的 80 端口。本文主要讲解了 ingress 的基本介绍和使用 demo,最后将工作原理总如如下六大部分。定义 Ingress 资源:定义外部访问规则。

欲望以提升热忱 毅力以磨平高山 3257

kubernetes部署Ingress并创建规则(K8s)

文章目录一、Ingress介绍二、Ingress文件获取1.1 、说明1.2 、文件内容三、k8s应用 ingress-controller.yaml四、创建Ingress规则五、应用文件六、访问 一、Ingress介绍 Ingress由两部分组成:Ingress controller和Ingress服务 通过 Service 发现 Pod 进行关联。基于域名访问 通过 Ingress Controller 实现 Pod 负载均衡 支持 TCP/UDP 4 层负载均衡和 HTTP 7 层负载均衡 底层实

suqinyi的博客 7215

k8s学习--ingress详细解释与应用(nginx ingress controller))

Ingress 是 Kubernetes 中用于管理集群内服务暴露的 API 资源。它提供了 HTTP 和 HTTPS 路由功能,使外部流量能够访问集群内部的服务。通过定义 Ingress 资源,可以控制哪些外部请求能够访问集群中的哪些服务,以及如何路由这些请求。

m0_74823683的博客 1764

K8S 快速入门(十七)实战篇:Ingress

一、为什么引入Ingress? 我们说k8s 的服务(service)时说暴露了service的三种方式ClusterIP、NodePort与LoadBalance,这几种方式都是在service的维度提供的,service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制,对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问。但是,单独用service暴露服务的方式,在实际生产环境中不太合适: Cluste

语雀同名:犬豪 yuque.com/qhao 4807

ingress的安装、资源讲解、为什么需要ingress资源

前言 环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6 本篇来讲解k8s中service资源。 什么是ingress资源,为什么需要ingress资源 在 Kubernetes 中,为了使外部的应用能够访问集群内的service,最为常用的是使用 NodePort 和 LoadBalancer 两种类型的service,但它们在使用上还是有一些限制:如,对外提供访问时,NodePort 类型需要在外部搭建额外的负载均衡,比如F5或nginx反

MssGuo的博客 6342

Kubernetes核心组件Ingress详解

在Kubernetes集群中,Ingress作为集群内服务对外暴露的访问接入点,几乎承载着集群内服务访问的所有流量。Ingress是Kubernetes中的一个资源对象,用来管理集群外部访问集群内部服务的方式。您可以通过Ingress资源来配置不同的转发规则,从而实现根据不同的规则设置访问集群内不同的Service所对应的后端Pod。 Ingress资源仅支持配置HTTP流量的规则,无法配置一些高级特性,例如负载均衡的算法、Sessions Affinity等,这些高级特性都需要在Ingress Cont

weixin_72583321的博客 2251

K8S 创建 Ingress

1、下载 mkdir ingress wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.0/deploy/static/mandatory.yaml # 上面可能无法下载:所以用国内的 gitee wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.25.0/deploy/static/mandatory.yaml 2、修改manda..

一直被模仿,从未被超越 6966

【K8S系列】第十三讲:Ingress详解

NotePortIngressNodePort方式:最大的缺点是会占用很多集群机器的端口,而且需要在外部搭建额外的负载均衡;LB方式:最大的缺点则是每个service一个LB,有点浪费,并且需要k8s之外的支持,【eg:cloud provider】;ingress: Ingress就是为了解决1,2两种方式的限制,只需要一个NodePort或者一个LB就可以满足所有service对外服务的需求。

颜淡慕潇 2万+

Hadoop与Kafka集群部署与优化实践指南

分布式系统是现代大数据处理的核心架构,其中Hadoop作为分布式存储与计算框架,Kafka作为分布式消息队列系统,共同构成了实时数据处理的基础设施。通过HDFS实现海量数据存储,结合YARN进行资源调度,而Kafka则保障了数据流的实时传输与高吞吐。这种技术组合在电商用户行为分析、物联网数据采集等场景中表现卓越。部署过程中需关注硬件资源配置、关键参数调优以及集群监控方案,例如通过调整HDFS块大小和Kafka partition数量来优化性能。合理运用Flume、Spark Streaming等工具可实现系

weixin_29061997的博客 362

使用 Kubernetes Ingress 对外暴露服务

本文主要介绍如何通过 Kubernetes Ingress 资源对象实现从外部对 k8s 集群中服务的访问,介绍了 k8s 对外暴露服务的多种方法、Ingress 及 Ingress Controller 的概念。涉及到的话题有: k8s 对外暴露服务的方法; Ingress 及 Ingress Controller 简介; helm 裸机部署 Nginx Ingress Controller;...

qhh0205 1万+

数据库崩溃恢复机制:REDO日志与UNDO日志详解

在数据库管理系统中,事务的持久性和一致性是至关重要的。为了保证在系统崩溃或发生故障时数据不会丢失,数据库引入了恢复机制。其中,REDO日志和UNDO日志是两种关键的恢复技术。本文将详细描述这两种日志的作用、工作原理以及它们在数据库崩溃恢复中的应用。

My_wife_QBL的博客 1413

Kubernetes 服务暴露:Nginx Ingress Controller 深度解析

Kubernetes集群服务暴露主要通过Ingress控制器实现,其中Nginx Ingress Controller是最常用的解决方案之一。本文介绍了Ingress控制器的作用及多种实现方案,重点分析了Nginx Ingress Controller的部署方法。Ingress控制器作为集群外部访问内部Pod的代理,支持全局访问和流量路由。除Nginx官方方案外,还列举了Kong、Traefik、HAProxy等多种控制器特性,比较了它们在性能、功能和适用场景上的差异。

qq_62935472的博客 1140

保姆级教程:在Windows 10/11上安装配置KNIME 5.8.0(含中文文本库更新)

本文提供在Windows 10/11系统上安装配置KNIME 5.8.0的详细指南,包括中文文本库更新和性能优化方案。从环境准备、安装流程到中文文本处理能力强化,逐步指导用户搭建高效的数据分析环境,特别针对国内网络环境和中文用户需求提供实用解决方案。

weixin_29081101的博客 671

《MPDIoU:边界框回归的高效革新与YOLOv8集成实战指南》

摘要: MPDIoU(多优先级距离IoU)通过引入中心距离、形状差异和尺度变化的三步优化策略,解决了传统IoU在目标检测中的尺度敏感、收敛低效和场景局限问题。相较于GIoU、DIoU等主流方法,MPDIoU在精度、速度和鲁棒性上实现全面提升,尤其在复杂场景和小目标检测中表现突出。通过代码集成和训练优化,MPDIoU在YOLOv8中显著提升COCO数据集AP指标,并在智能安防(密集行人检测)和工业质检(微小缺陷定位)等垂直领域验证了其应用价值。未来研究方向包括动态权重调整和多模态融合,进一步拓展边界框回归的精

m0_64661770的博客 159

K8S中的ingress

Kubernetes暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress;这一片主要聊聊Ingress。

L2111533547的博客 2万+

Python爬虫实战:抓取统计数据并生成年度对比图表详解

国家统计局网站(静态HTML页面Excel文件JSON接口(部分新版API)我们将重点演示从统计公报页面抓取数据,结合解析Excel文件,实现多种数据格式爬取处理。本文从零开始搭建了一个爬取国家统计数据并制作年度对比图表的完整流程。读者可以根据实际需求调整爬取目标,丰富数据分析维度,甚至结合机器学习模型预测未来趋势。欢迎你在评论区留言分享你的爬虫实践,或提出改进建议!

2201_76125261的博客 1001

k8s之Ingress服务接入控制器

ingress官方:https://kubernetes.github.io/ingress-nginx/deploy/Kubernetes 暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress 这个负载均衡是基于nginx七层反向代理来实现的,ingress工作原理如下图:外部客户端通过访问负载均衡器,然后调度到service上,然后在调度到IngressController,IngressController通过Ingress规则(域

soso678的博客 1116

YOLOv8 | 损失函数改进,最新提出的Shape-IoU,有效涨点

作为检测器定位分支的重要组成,边框回归损失在目标检测任务中发挥巨大作用。现有的边框回归方法,通常考虑了GT框与预测框之间的几何关系,通过使用边框间的相对位置与相对形状等计算损失,而忽略了边框其自身的形状与尺度等固有属性对边框回归的影响。为了弥补现有研究的不足,本文提出聚焦边框自身形状与尺度的边框回归方法。首先我们对边框回归特性进行分析,得出边框自身形状因素与尺度因素会对回归结果产生影响。

kay_545 1915

一文看懂EMMC原理及工作过程

CMD:用于设备初始化和命令传输的双向通道, CMD信号有2种工作模式:1#:漏极开路--->用于初始化模式2#:推拉--->用于快速命令传输其中命令从eMMC主机控制器发送到eMMC设备,响应从设备发送到主机。DAT [7:0]:双向数据信号,模式包括:1(DAT0);默认情况下,通电或重置后,只有DAT0用于数据传输。DAT信号在推挽模式下工作,eMMC设备包括数据线DAT1-DAT7的内部上拉。进入4位模式后,设备立即断开线路DAT1、DAT2和DAT3的内部上拉;

Airer_00的博客 2036

【kubernetes】k8s对外服务之Ingress

K8S集群外部的客户端访问K8S集群内部的方案基于Service实现:NodePort、LoadBalancer、externalIPs 只能支持四层代理转发,如果K8S集群规模较大运行的业务服务较多,NodePort端口/externalIPs管理成本会很高基于Ingress实现:支持七层代理转发,可自定义规则根据用户请求的域名或URL路径转发给指定的Service端点实现Pod的代理访问一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。dae

qq_54188720的博客 6863

YOLOv12改进策略【独家融合改进】| SPD-Conv+PPA 再次提升模型针对小目标的特征提取能力

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1030

K8s中配置使用ingress

前面也提到,Ingress资源要正常工作,集群必须有一个正在运行的 Ingress 控制器, Ingress 控制器不是随集群自动启动的,目前k8s项目中,支持和维护 AWS、 GCE 和 Nginx Ingress 控制器;当然也有一起其他三方的控制器可使用;注意:配置文件中除了镜像的地址改后,ingress-nginx-controller的Service默认的type、ingress-nginx-controller的Deployment的配置中的hostNetwork也按照需求改一下。

tonglei111的博客 1526

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

第12关 精通K8s下的Ingress-Nginx控制器:生产环境实战配置指南

博哥带您深入浅出地理解和实践2023年Kubernetes最具实战价值的课程,聚焦生产环境下的流量入口Ingress-nginx-controller,帮助您更好地理解和使用Kubernetes。

博哥爱运维 7736

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【一起来学kubernetes】7、k8s中的ingress详解

通常情况下,Ingress部署在所有的Node节点上,可以配置提供服务外部访问的URL、负载均衡、终止SSL,并提供基于域名的虚拟主机,但它不会暴露任意端口或协议。需要注意的是,Nginx类型的Ingress实现可以通过扩展Nginx Ingress Controller来实现更多的功能,比如认证、限流、重定向等。需要注意的是,Ingress的实现方案可能会因所选的Ingress控制器而有所不同。需要注意的是,Istio类型的Ingress实现具有强大的流量管理和安全功能,但也需要更多的配置和维护工作。

技术人集结地 5318

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: K8s: 从集群外部访问Service
下一篇: K8s: 部署 kubernetes dashboard
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Wang's Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值