簡體   English   中英

Kubernetes中按服務名訪問redis

[英]Access redis by service name in Kubernetes

我在kubernetes中創建了一個redis部署和服務,我可以通過服務ip從另一個pod訪問redis,但是我不能通過服務名訪問它

redis yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  namespace: myapp-ns
spec:
  replicas: 1
  selector:
    matchLabels:
      component: redis
  template:
    metadata:
      labels:
        component: redis
    spec:
      containers:
        - name: redis
          image: redis
          ports:
            - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: myapp-ns
spec:
  type: ClusterIP
  selector:
    component: redis
  ports:
    - port: 6379
      targetPort: 6379

我應用了您的文件,並且能夠從同一命名空間和不同的命名空間 ping 和 telnet 到該服務。 為了測試這一點,我在相同的命名空間和不同的命名空間中創建了 pod,並安裝了 telnet 和 ping。 然后我執行了它們並進行了以下測試:

相同的命名空間

kubectl exec -it <same-namespace-pod> /bin/bash
# ping redis
PING redis.<redis-namespace>.svc.cluster.local (172.20.211.84) 56(84) bytes of data.

# telnet redis 6379
Trying 172.20.211.84...
Connected to redis.<redis-namespace>.svc.cluster.local.
Escape character is '^]'.

不同的命名空間

kubectl exec -it <different-namespace-pod> /bin/bash
# ping redis.<redis-namespace>.svc.cluster.local
PING redis.test.svc.cluster.local (172.20.211.84) 56(84) bytes of data.

# telnet redis.<redis-namespace>.svc.cluster.local 6379
Trying 172.20.211.84...
Connected to redis.<redis-namespace>.svc.cluster.local.
Escape character is '^]'.

如果由於 dns 解析問題而無法執行此操作,則可以查看 pod 中的/etc/resolv.conf以確保它具有搜索前綴svc.cluster.localcluster.local

我在kubernetes中創建了一個redis部署和服務,我可以通過服務ip從另一個pod訪問redis,但是我不能通過服務名訪問它

請記住,您只能使用Service名稱訪問它在同一命名空間內公開的后端Pods 查看您的DeploymentService yaml 清單,我們可以看到它們部署在myapp-ns命名空間中 這意味着只有從部署在此命名空間中的Pod ,您才能使用它的名稱訪問您的Service

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  namespace: myapp-ns ### 👈
spec:
  replicas: 1
  selector:
    matchLabels:
      component: redis
  template:
    metadata:
      labels:
        component: redis
    spec:
      containers:
        - name: redis
          image: redis
          ports:
            - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: myapp-ns ### 👈
spec:
  type: ClusterIP
  selector:
    component: redis
  ports:
    - port: 6379
      targetPort: 6379

因此,如果您部署以下Pod

apiVersion: v1
kind: Pod
metadata:
  name: redis-client
  namespace: myapp-ns ### 👈
spec:
  containers:
    - name: redis-client
      image: debian

您將能夠通過其名稱訪問您的Service ,因此以下命令(前提是您已安裝所有必需的工具)將起作用:

redis-cli -h redis
telnet redis 6379

但是,如果您的 redis-cliet Pod部署到完全不同的命名空間,您將需要使用根據此處描述的規則構建的完全限定域名 ( FQDN ):

redis-cli -h redis.myapp-ns.svc.cluster.local
telnet redis.myapp-ns.svc.cluster.local 6379

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM