阿里云K8S私有Ingress Controller的配置和使用

简介: 阿里云K8S私有Ingress Controller的配置和使用创建集群进入阿里云容器服务控制台,创建一个新的k8s集群,此时集群会自动生成一个公网的Ingress Controller和一个公网的SLB监听着Worker的80和443端口。

阿里云K8S私有Ingress Controller的配置和使用

创建集群

进入阿里云容器服务控制台,创建一个新的k8s集群,此时集群会自动生成一个公网的Ingress Controller和一个公网的SLB监听着Worker的80和443端口。

默认的公网Ingress Controller

默认的公网SLB(SLB名字是自己起的,为了方便看)

创建私有SLB

进入负载均衡控制台创建一个私有SLB,实例规格按实际业务需求。注意:专有网络必须和刚才创建的集群的一样!!!

配置私有Ingress Controller

由于Ingress Controller Pods中的serviceAccountName是引用集群默认创建的,所以在此就不再配置ServiceAccount、ClusterRole和ClusterRoleBinding。

  1. Nginx ConfigMap

        
        apiVersion: v1
        kind: ConfigMap
        metadata:

    name: private-nginx-configuration #名字可以自己改
    namespace: kube-system
    labels:
    app: ingress-nginx

        data:

    proxy-body-size: 20m
    proxy-connect-timeout: "10"
    max-worker-connections: "65536"
    enable-underscores-in-headers: "true"
    reuse-port: "true"
    worker-cpu-affinity: "auto"
    server-tokens: "false"
    ssl-redirect: "false"
    allow-backend-server-header: "true"
    ignore-invalid-headers: "true"
    generate-request-id: "true"
    #forwarded-for-header: "X-Real-IP"
    #compute-full-forwarded-for: "true"
    #hsts: "false"
    #enable-vts-status: "true"
    #use-proxy-protocol: "true"

        ---
        # nginx tcp stream config map
        kind: ConfigMap
        apiVersion: v1
        metadata:

    name: private-tcp-services
    namespace: kube-system

        ---
        # nginx udp stream config map
        kind: ConfigMap
        apiVersion: v1
        metadata:

    name: private-udp-services
    namespace: kube-system

  2. Nginx Ingress Controller Pods

        apiVersion: apps/v1
        kind: Deployment
        metadata:

    name: private-nginx-ingress-controller
    labels:
    app: private-ingress-nginx
    namespace: kube-system
    annotations:
    component.version: '0.22.0'
    component.revision: '5'

        spec:

    replicas: 2
    selector:
    matchLabels:

    app: private-ingress-nginx

    template:
    metadata:

    labels:
      app: private-ingress-nginx
    annotations:
      prometheus.io/port: "10254"
      prometheus.io/scrape: "true"

    spec:

    #tolerations:
    #  - key: node-role.kubernetes.io/master
    #    effect: NoSchedule
    affinity:
      podAntiAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - ingress-nginx
            topologyKey: "kubernetes.io/hostname"
    #use default serviceAccountName
    serviceAccountName: nginx-ingress-controller
    initContainers:
    - name: init-sysctl
      image: registry-vpc.cn-hongkong.aliyuncs.com/acs/busybox:latest
      command:
      - /bin/sh
      - -c
      - |
        sysctl -w net.core.somaxconn=65535
        sysctl -w net.ipv4.ip_local_port_range="1024 65535"
        sysctl -w fs.file-max=1048576
        sysctl -w fs.inotify.max_user_instances=16384
        sysctl -w fs.inotify.max_user_watches=524288
        sysctl -w fs.inotify.max_queued_events=16384
      securityContext:
        privileged: true
    containers:
    - name: nginx-ingress-controller
      image: registry-vpc.cn-hongkong.aliyuncs.com/acs/aliyun-ingress-controller:v0.22.0.5-552e0db-aliyun
      args:
        - /nginx-ingress-controller
        - --configmap=$(POD_NAMESPACE)/private-nginx-configuration
        - --tcp-services-configmap=$(POD_NAMESPACE)/private-tcp-services
        - --udp-services-configmap=$(POD_NAMESPACE)/private-udp-services
        - --annotations-prefix=nginx.ingress.kubernetes.io
        - --publish-service=$(POD_NAMESPACE)/private-nginx-ingress-lb
        - --ingress-class=private #自定义名
        - --v=2
      env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
      ports:
      - name: http
        containerPort: 80
      - name: https
        containerPort: 443
      livenessProbe:
        failureThreshold: 3
        httpGet:
          path: /healthz
          port: 10254
          scheme: HTTP
        initialDelaySeconds: 10
        periodSeconds: 10
        successThreshold: 1
        timeoutSeconds: 1
      readinessProbe:
        failureThreshold: 3
        httpGet:
          path: /healthz
          port: 10254
          scheme: HTTP
        periodSeconds: 10
        successThreshold: 1
        timeoutSeconds: 1
      securityContext:
        capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        runAsUser: 33
      volumeMounts:
      - name: localtime
        mountPath: /etc/localtime
        readOnly: true
    nodeSelector:
      beta.kubernetes.io/os: linux
    volumes:
      - name: localtime
        hostPath:
          path: /etc/localtime
          type: File
  3. Nginx Ingress Service

        apiVersion: v1
        kind: Service
        metadata:

    name: private-nginx-ingress-lb
    namespace: kube-system
    labels:
    app: private-nginx-ingress-lb
    annotations:
    # set loadbalancer to the specified slb id
    service.beta.kubernetes.io/alicloud-loadbalancer-id: lb-xxxx
    # set loadbalancer address type to intranet if using private slb instance
    service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
    service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'

        spec:

    type: LoadBalancer

    do not route traffic to other nodes

    and reserve client ip for upstream

    externalTrafficPolicy: "Local"
    ports:

    • port: 80
      name: http

    targetPort: 80

    • port: 443
      name: https

    targetPort: 443
    selector:
    # select app=private-ingress-nginx pods
    app: private-ingress-nginx

部署私有Ingress Controller

kubectl apply -f private-ingress-controller.yml
  1. Private Ingress Pod
  2. Private Ingress LB Service

更新Clusterrole:nginx-ingress-controller

由于在配置私有Ingress Controller Pod时是引用集群默认的ServiceAccount,新生成的ingress-controller-leader-private配置项没有更新到默认的ClusterRole所以导致Service启动时会报没权限,此时我们需要在默认的ClusterRole中的resourceNames下添加ingress-controller-leader-private


kubectl edit clusterrole nginx-ingress-controller -o yaml

使用阿里云DNS PrivateZone绑定SLB IP

  1. 进入云解析DNS控制台,开通PrivateZone并添加域名。
  2. 关联vpc
  3. 添加域名解析,绑定私有SLB IP

部署测试服务

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: '1'
  generation: 1
  labels:
    app: demo
  name: demo
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: demo
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - image: >-
            registry-vpc.cn-hongkong.aliyuncs.com/xxxx/demo:1.0.6-1
          imagePullPolicy: Always
          name: demo
          resources:
            limits:
              cpu: 2048m
              memory: 4Gi
            requests:
              cpu: 2048m
              memory: 4Gi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          livenessProbe:
            httpGet:
              path: /v1/health
              port: 80
            initialDelaySeconds: 180
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /v1/health
              port: 80
            initialDelaySeconds: 180
            periodSeconds: 10
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 300
      
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: private
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  generation: 1
  name: private-demo-ingress
  namespace: default
spec:
  tls:
  - hosts:
    - k8s-test.internal.abc.com
    # 配置TLS证书
    secretName: abc.com
  rules:
  - host: k8s-test.internal.abc.com
    http:
      paths:
      - backend:
          serviceName: demo-svc
          servicePort: 80
        path: /abc(/|$)(.*)
        
---
apiVersion: v1
kind: Service
metadata:
  name: demo-svc
  namespace: default
spec:
  clusterIP: None
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: demo
  sessionAffinity: None
  type: ClusterIP
  

测试结果

在同一个VPC下的ECS访问集群服务结果如下

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
10月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
995 3
|
12月前
|
人工智能 缓存 Kubernetes
ACK GIE配置建议
Gateway with Inference Extension是基于Kubernetes社区Gateway API及其扩展规范实现的增强型组件,支持四层/七层路由服务,并面向生成式AI推理场景提供负载均衡优化、服务管理简化等能力,适用于AI推理服务的高可用部署与性能优化。在不同的场景使用ACK Gateway with Inference Extension时,可能需要根据业务需求和高可用需要对网关和推理扩展进行不同的配置调整。本文主要介绍在实际业务场景中针对ACK GIE的配置建议,以获得更好的使用效果。
841 23
|
Prometheus Kubernetes 监控
Kubernetes监控:Prometheus与AlertManager结合,配置邮件告警。
完成这些步骤之后,您就拥有了一个可以用邮件通知你的Kubernetes监控解决方案了。当然,所有的这些配置都需要相互照应,还要对你的Kubernetes集群状况有深入的了解。希望这份指南能帮助你创建出适合自己场景的监控系统,让你在首次发现问题时就能做出响应。
846 22
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
495 10
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
Kubernetes 持续交付 开发工具
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
1055 2
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
524 0
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
弹性计算 监控 持续交付
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
435 0
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
397 0

推荐镜像

更多