使用 Ingress Nginx 控制器公开 Redis

Vla*_*kic 7 redis kubernetes nginx-ingress

你好,当我使用节点端口公开我的 redis 服务时,它工作正常。我能够访问它。但如果我尝试切换到 Ingress Nginx 控制器,它会拒绝连接。其他应用程序可以与 Ingress 配合使用。

这是我的服务:

apiVersion: v1
kind: Service
metadata:
  name: redis-svc
spec:
#  type: NodePort
  ports:
    - name: http
      port: 6379
      targetPort: 6379
      protocol: TCP
#      nodePort: 30007
  selector:
    app: redis
Run Code Online (Sandbox Code Playgroud)

这是入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: redis-ing
  annotations:
     kubernetes.io/ingress.class: "nginx"
     ingress.kubernetes.io/ssl-redirect: "true"
     nginx.ingress.kubernetes.io/ssl-redirect: "true"
     nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
     cert-manager.io/cluster-issuer: "letsencrypt-prod"
    #  nginx.ingress.kubernetes.io/enable-cors: "true"
    #  nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
    #  nginx.ingress.kubernetes.io/cors-allow-origin: "https://test.hefest.io"
    #  nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
spec:
  tls:
  - secretName: letsencrypt-prod
    hosts:
      - redis-dev.domain.com
  rules:
  - host: redis-dev.domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: redis-svc
          servicePort: 6379
Run Code Online (Sandbox Code Playgroud)

知道会出现什么问题吗?

我正在使用这个入口控制器: https: //github.com/nginxinc/kubernetes-ingress

Arg*_*dhu 6

Redis 工作在 6379 上,它不是 HTTP 端口(80,443)。因此,您需要在 nginx 入口控制器中启用TCP/UDP 支持这里的minikube 文档展示了如何为 redis 执行此操作。

\n

更新 TCP 和/或 UDP 服务配置映射

\n

借用有关使用 ingress nginx 控制器配置 TCP 和 UDP 服务的教程,我们需要编辑启用 minikube ingress 插件时默认安装的 configmap。

\n

有 2 个配置映射,1 个用于 TCP 服务,1 个用于 UDP 服务。默认情况下,它们看起来像这样:

\n
apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: tcp-services\n  namespace: ingress-nginx\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: udp-services\n  namespace: ingress-nginx\n
Run Code Online (Sandbox Code Playgroud)\n

由于这些配置映射是集中的并且可能包含配置,因此最好我们只修补它们而不是完全覆盖它们。

\n

让\xe2\x80\x99s以此redis部署为例:

\n
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: redis-deployment\n  namespace: default\n  labels:\n    app: redis\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: redis\n  template:\n    metadata:\n      labels:\n        app: redis\n    spec:\n      containers:\n      - image: redis\n        imagePullPolicy: Always\n        name: redis\n        ports:\n        - containerPort: 6379\n          protocol: TCP\n
Run Code Online (Sandbox Code Playgroud)\n

创建一个文件redis-deployment.yaml并粘贴上面的内容。然后使用以下命令安装redis部署:

\n
kubectl apply -f redis-deployment.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

接下来我们需要创建一个可以将流量路由到我们的 Pod 的服务:

\n
apiVersion: v1\nkind: Service\nmetadata:\n  name: redis-service\n  namespace: default\nspec:\n  selector:\n    app: redis\n  type: ClusterIP\n  ports:\n    - name: tcp-port\n      port: 6379\n      targetPort: 6379\n      protocol: TCP\n
Run Code Online (Sandbox Code Playgroud)\n

创建一个文件redis-service.yaml并粘贴上面的内容。然后使用以下命令安装redis服务:

\n
kubectl apply -f redis-service.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

要将 TCP 服务添加到 nginx 入口控制器,您可以运行以下命令:

\n
kubectl patch configmap tcp-services -n kube-system --patch \'{"data":{"6379":"default/redis-service:6379"}}\'\n
Run Code Online (Sandbox Code Playgroud)\n

在哪里:

\n

6379:您的服务应从 minikube 虚拟机外部侦听的端口

\n

default:您的服务安装的命名空间

\n

redis-service: 服务名称

\n

我们可以使用以下命令验证我们的资源是否已修补:

\n
kubectl get configmap tcp-services -n kube-system -o yaml\n
Run Code Online (Sandbox Code Playgroud)\n

我们应该看到这样的东西:

\n
apiVersion: v1\ndata:\n  "6379": default/redis-service:6379\nkind: ConfigMap\nmetadata:\n  creationTimestamp: "2019-10-01T16:19:57Z"\n  labels:\n    addonmanager.kubernetes.io/mode: EnsureExists\n  name: tcp-services\n  namespace: kube-system\n  resourceVersion: "2857"\n  selfLink: /api/v1/namespaces/kube-system/configmaps/tcp-services\n  uid: 4f7fac22-e467-11e9-b543-080027057910\n
Run Code Online (Sandbox Code Playgroud)\n

您需要验证的唯一值是 data 属性下有一个如下所示的值:

\n
"6379": default/redis-service:6379\n
Run Code Online (Sandbox Code Playgroud)\n

修补 ingress-nginx-controller

\n

为了从外部集群获得连接,必须完成最后一步。我们需要修补 nginx 控制器,以便它侦听端口 6379 并可以将流量路由到您的服务。为此,我们需要创建一个补丁文件。

\n
spec:\n  template:\n    spec:\n      containers:\n      - name: ingress-nginx-controller\n        ports:\n         - containerPort: 6379\n           hostPort: 6379\n
Run Code Online (Sandbox Code Playgroud)\n

创建一个名为的文件ingress-nginx-controller-patch.yaml并粘贴上面的内容。

\n

接下来使用以下命令应用更改:

\n
kubectl patch deployment ingress-nginx-controller --patch "$(cat ingress-nginx-controller-patch.yaml)" -n kube-system\n
Run Code Online (Sandbox Code Playgroud)\n