阿里云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访问集群服务结果如下

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
23天前
|
编解码 对象存储
阿里云视频转码转码模板-配置工作流
阿里云视频转码转码模板-配置工作流
14 0
|
29天前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
29天前
|
存储 Kubernetes Docker
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
22天前
|
弹性计算
2024年阿里云服务器不同实例规格与配置实时优惠价格整理与分享
2024年阿里云服务器的优惠价格新鲜出炉,有特惠云服务器也有普通优惠价格,本文为大家整理汇总了2024年阿里云服务器的优惠价格,包含特惠云服务器和其他配置云服务器的优惠价格。以便大家了解自己想购买的云服务器选择不同实例规格和带宽情况下的价格,仅供参考。
2024年阿里云服务器不同实例规格与配置实时优惠价格整理与分享
|
23天前
阿里云配置dcoker镜像仓库
阿里云配置dcoker镜像仓库
72 0
|
4天前
|
存储 弹性计算 安全
阿里云服务器2核2G、2核4G配置最新租用收费标准及活动价格参考
2核2G、2核4G配置是很多个人和企业建站以及部署中小型的web应用等场景时首选的云服务器配置,这些配置的租用价格也是用户非常关心的问题,本文为大家整理汇总了2024年阿里云服务器2核2G、2核4G配置不同实例规格及地域之间的收费标准,同时整理了这些配置最新活动价格,以供大家参考和选择。
阿里云服务器2核2G、2核4G配置最新租用收费标准及活动价格参考
|
7天前
|
域名解析 网络协议 应用服务中间件
阿里云服务器配置免费https服务
阿里云服务器配置免费https服务
|
11天前
|
域名解析 网络协议 应用服务中间件
阿里云SSL证书配置(HTTPS证书配置)
该内容是一个关于如何在阿里云上准备和购买SSL证书,以及如何为网站启用HTTPS的步骤指南。首先,需要注册并实名认证阿里云账号,然后在SSL证书控制台选择证书类型、品牌和时长进行购买。申请证书时填写域名信息,并进行DNS验证,这包括在阿里云域名管理板块添加解析记录。完成验证后提交审核,等待证书审核通过并下载Nginx格式的证书文件。最后,将证书配置到网站服务器以启用HTTPS。整个过程涉及账户注册、实名认证、证书购买、DNS设置和证书下载及安装。
52 0
|
18天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
14 0
|
27天前
|
弹性计算 固态存储 调度
2024年阿里云服务器配置选择指南,新手整理
阿里云服务器配置选择指南:个人用户推荐轻量应用服务器或ECS通用算力型u1,适合小型网站和轻量应用。企业用户应选择企业级独享型如ECS计算型c7、通用型g7,保证高性能计算需求。配置选择要考虑CPU内存比例、公网带宽和系统盘。轻量服务器提供2核2G3M和2核4G4M选项,ECS实例则有多种规格以适应不同业务场景。公网带宽建议至少5M,系统盘可选高效云盘、SSD或ESSD。详细信息见[阿里云服务器产品页](https://www.aliyun.com/product/ecs)。
64 3