首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Ingress控制器公开Redis

用Ingress控制器公开Redis
EN

Stack Overflow用户
提问于 2020-07-16 17:01:40
回答 2查看 7.3K关注 0票数 5

你好,当我使用节点端口公开我的redis服务时,它工作得很好。我可以访问它。但是,如果我尝试切换到Nginx控制器,它就会拒绝连接。其他的应用程序可以很好的通过入口。

这是我的服务:

代码语言:javascript
复制
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

这里是入口:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2020-07-16 17:40:49

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

更新TCP和/或UDP服务configmap

借鉴有关使用ingress控制器配置TCP和UDP服务的教程,我们将需要编辑configmap,这是默认情况下在启用minikube入口插件时安装的。

有两个configmap,一个用于TCP服务,一个用于UDP服务。默认情况下,它们看起来如下:

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: udp-services
  namespace: ingress-nginx

由于这些configmap是集中式的,并且可能包含配置,所以最好只对它们进行修补,而不是完全覆盖它们。

让我们以这个redis部署为例:

代码语言:javascript
复制
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部署:

代码语言:javascript
复制
kubectl apply -f redis-deployment.yaml

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

代码语言:javascript
复制
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服务:

代码语言:javascript
复制
kubectl apply -f redis-service.yaml

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

代码语言:javascript
复制
kubectl patch configmap tcp-services -n kube-system --patch '{"data":{"6379":"default/redis-service:6379"}}'

其中:

6379:您的服务应该从小型虚拟机外部监听端口

default:安装服务的命名空间

redis-service:服务的名称

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

代码语言:javascript
复制
kubectl get configmap tcp-services -n kube-system -o yaml

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
"6379": default/redis-service:6379

修补入口-nginx-控制器

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

代码语言:javascript
复制
spec:
  template:
    spec:
      containers:
      - name: ingress-nginx-controller
        ports:
         - containerPort: 6379
           hostPort: 6379

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

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

代码语言:javascript
复制
kubectl patch deployment ingress-nginx-controller --patch "$(cat ingress-nginx-controller-patch.yaml)" -n kube-system
票数 4
EN

Stack Overflow用户

发布于 2022-03-09 15:48:28

我让它工作的方法是在nginx入口控制器上启用ssl-通过。一旦我的nginx入口控制器被修补,我就能连接。

ingress.yaml

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: redis-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-passthrough: 'true'
spec:
  tls:
    - hosts:
      - <host_address>
      secretName: <k8s_secret_name>
  rules:
    - host: <host_address>
      http:
        paths:
          - path: "/"
            pathType: Prefix
            backend:
              service:
                name: redis-service
                port:
                  number: 6380

连接python片段

代码语言:javascript
复制
import redis

r = redis.StrictRedis(host='<host_address>',
                port=443, db=0, ssl=True,
                ssl_ca_certs='server.pem')

print(r.ping())

在我的例子中,我确实使用了redistls

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62939846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档