使用ingres nginx控制器公开redis

ttisahbt  于 2021-06-10  发布在  Redis
关注(0)|答案(1)|浏览(1023)

你好,当我使用节点端口公开我的redis服务时,它工作正常。我可以访问它。但如果我尝试切换到ingress nginx控制器,它会拒绝连接。。其他应用程序可以很好地处理入口。
这是我的服务:

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

这里是入口:

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

你知道什么是问题吗?
我正在使用此入口控制器:https://github.com/nginxinc/kubernetes-ingress

hs1ihplo

hs1ihplo1#

redis工作于6379,这是一个非http端口(80443)。所以您需要在nginx入口控制器中启用tcp/udp支持。这里的minikube文档展示了如何为redis做这件事。
更新tcp和/或udp服务配置Map
借用有关使用ingres nginx控制器配置tcp和udp服务的教程,我们将需要编辑configmap,在启用minikube ingres插件时默认安装configmap。
有2个配置Map,1个用于tcp服务,1个用于udp服务。默认情况下,它们如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: udp-services
  namespace: ingress-nginx

由于这些配置Map是集中的,并且可能包含配置,因此最好只修补它们,而不是完全覆盖它们。
我们以这个redis部署为例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  namespace: default
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - image: redis
        imagePullPolicy: Always
        name: redis
        ports:
        - containerPort: 6379
          protocol: TCP

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

kubectl apply -f redis-deployment.yaml

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

apiVersion: v1
kind: Service
metadata:
  name: redis-service
  namespace: default
spec:
  selector:
    app: redis
  type: ClusterIP
  ports:
    - name: tcp-port
      port: 6379
      targetPort: 6379
      protocol: TCP

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

kubectl apply -f redis-service.yaml

要向nginx入口控制器添加tcp服务,可以运行以下命令:

kubectl patch configmap tcp-services -n kube-system --patch '{"data":{"6379":"default/redis-service:6379"}}'

哪里: 6379 :服务应该从minikube虚拟机外部侦听的端口 default :安装服务的命名空间 redis-service :服务的名称
我们可以使用以下命令验证资源是否已修补:

kubectl get configmap tcp-services -n kube-system -o yaml

我们应该看到这样的情况:

apiVersion: v1
data:
  "6379": default/redis-service:6379
kind: ConfigMap
metadata:
  creationTimestamp: "2019-10-01T16:19:57Z"
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
  name: tcp-services
  namespace: kube-system
  resourceVersion: "2857"
  selfLink: /api/v1/namespaces/kube-system/configmaps/tcp-services
  uid: 4f7fac22-e467-11e9-b543-080027057910

唯一需要验证的值是,数据属性下有一个如下所示的值:

"6379": default/redis-service:6379

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

spec:
  template:
    spec:
      containers:
      - name: ingress-nginx-controller
        ports:
         - containerPort: 6379
           hostPort: 6379

创建一个名为 ingress-nginx-controller-patch.yaml 并粘贴上面的内容。
接下来使用以下命令应用更改:

kubectl patch deployment ingress-nginx-controller --patch "$(cat ingress-nginx-controller-patch.yaml)" -n kube-system

相关问题