首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在k8s集群内部前后连接(连接被拒绝)

如何在k8s集群内部前后连接(连接被拒绝)
EN

Stack Overflow用户
提问于 2020-04-02 07:44:33
回答 1查看 1.1K关注 0票数 2

试图将前端web与nodejs速成api服务器连接到kubernetes集群时出错。

可以在浏览器中导航到http:localhost:3000和网站是可以的。

但无法按预期导航到http:localhost:3008 (不应公开)

我的目标是将REACT_APP_API_URL环境变量传递给,以便设置axios baseURL ,并能够在与其api服务器之间建立通信。

deploy-front.yml

代码语言:javascript
复制
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: gbpd-front
spec:
  selector:
    matchLabels:
      app: gbpd-api
      tier: frontend
      track: stable
  replicas: 2
  template:
    metadata:
      labels:
        app: gbpd-api
        tier: frontend
        track: stable
    spec:
      containers:
        - name: react
          image: binomio/gbpd-front:k8s-3
          ports:
            - containerPort: 3000
          resources:
            limits:
              memory: "150Mi"
            requests:
              memory: "100Mi"
          imagePullPolicy: Always

service-front.yaml

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: gbpd-front
spec:
  selector:
    app: gbpd-api
    tier: frontend
  ports:
  - protocol: "TCP"
    port: 3000
    targetPort: 3000
  type: LoadBalancer

Deploy-back.yaml

代码语言:javascript
复制
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: gbpd-api
spec:
  selector:
    matchLabels:
      app: gbpd-api
      tier: backend
      track: stable
  replicas: 3 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: gbpd-api
        tier: backend
        track: stable
    spec:
      containers:
        - name: gbpd-api
          image: binomio/gbpd-back:dev
          ports:
            - name: http
              containerPort: 3008

service-back.yaml

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: gbpd-api
spec:
  selector:
    app: gbpd-api
    tier: backend
  ports:
  - protocol: "TCP"
    port: 3008
    targetPort: http

我尝试了许多组合,也尝试过在后台添加"LoadBalancer“,但是没有.

我可以连接完美到本地主机:3000和使用前端,但前端不能连接到后端服务。

问题1:为了正确传递REACT_APP_API_URL而使用的ip/名称是什么?问题2:为什么curl本地主机:3008不回答?

经过两天的尝试,几乎所有的k8s官方文档.不知道这里发生了什么,所以任何帮助都会很感激的。

kubectl描述svc gbpd响应:

代码语言:javascript
复制
kubectl describe svc gbpd-api
Name:                     gbpd-api
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"gbpd-api","namespace":"default"},"spec":{"ports":[{"port":3008,"p...
Selector:                 app=gbpd-api,tier=backend
Type:                     LoadBalancer
IP:                       10.107.145.227
LoadBalancer Ingress:     localhost
Port:                     <unset>  3008/TCP
TargetPort:               http/TCP
NodePort:                 <unset>  31464/TCP
Endpoints:                10.1.1.48:3008,10.1.1.49:3008,10.1.1.50:3008
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-02 12:57:22

我测试了您的环境,它在使用Nginx映像时起了作用,让我们回顾一下环境:

  • 前线部署的描述是正确的。
  • 前台服务将其公开为负载平衡器,这意味着您的前端可以从外部访问,非常好。
  • 还正确地描述了回部署。
  • 后端服务保留在as ClusterIP中,以便只从集群内部访问,非常好。

下面我将演示前端和后端之间的通信。

  • 我使用的是您提供的相同的yamls,例如,将映像更改为Nginx,并且由于它是一个http服务器,所以我将容器端口更改为80。

问题1:为了正确传递REACT_APP_API_URL而使用的ip/名称是什么?

  • 我根据请求将ENV变量添加到前面的部署中,并将使用它来演示。您必须使用服务名称来curl,我使用的是短版本,因为我们在同一个名称空间中工作。您还可以使用全名:http://gbpd-api.default.svc.cluster.local:3008

Reproduction:

  • 创建yamls并应用它们:
代码语言:javascript
复制
$ cat deploy-front.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gbpd-front
spec:
  selector:
    matchLabels:
      app: gbpd-api
      tier: frontend
      track: stable
  replicas: 2
  template:
    metadata:
      labels:
        app: gbpd-api
        tier: frontend
        track: stable
    spec:
      containers:
        - name: react
          image: nginx
          env:
            - name: REACT_APP_API_URL
              value: http://gbpd-api:3008
          ports:
            - containerPort: 80
          resources:
            limits:
              memory: "150Mi"
            requests:
              memory: "100Mi"
          imagePullPolicy: Always

$ cat service-front.yaml 
cat: cat: No such file or directory
apiVersion: v1
kind: Service
metadata:
  name: gbpd-front
spec:
  selector:
    app: gbpd-api
    tier: frontend
  ports:
  - protocol: "TCP"
    port: 3000
    targetPort: 80
  type: LoadBalancer

$ cat deploy-back.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gbpd-api
spec:
  selector:
    matchLabels:
      app: gbpd-api
      tier: backend
      track: stable
  replicas: 3
  template:
    metadata:
      labels:
        app: gbpd-api
        tier: backend
        track: stable
    spec:
      containers:
        - name: gbpd-api
          image: nginx
          ports:
            - name: http
              containerPort: 80

$ cat service-back.yaml 
apiVersion: v1
kind: Service
metadata:
  name: gbpd-api
spec:
  selector:
    app: gbpd-api
    tier: backend
  ports:
  - protocol: "TCP"
    port: 3008
    targetPort: http

$ kubectl apply -f deploy-front.yaml 
deployment.apps/gbpd-front created
$ kubectl apply -f service-front.yaml 
service/gbpd-front created
$ kubectl apply -f deploy-back.yaml 
deployment.apps/gbpd-api created
$ kubectl apply -f service-back.yaml 
service/gbpd-api created
  • 请记住,在Kubernetes中,通信是设计要在服务之间进行,因为当部署发生更改或吊舱失败时,始终会重新创建吊舱。
代码语言:javascript
复制
$ kubectl get all
NAME                              READY   STATUS    RESTARTS   AGE
pod/gbpd-api-dc5b4b74b-kktb9      1/1     Running   0          41m
pod/gbpd-api-dc5b4b74b-mzpbg      1/1     Running   0          41m
pod/gbpd-api-dc5b4b74b-t6qxh      1/1     Running   0          41m
pod/gbpd-front-66b48f8b7c-4zstv   1/1     Running   0          30m
pod/gbpd-front-66b48f8b7c-h58ds   1/1     Running   0          31m

NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)          AGE
service/gbpd-api     ClusterIP      10.0.10.166   <none>         3008/TCP         40m
service/gbpd-front   LoadBalancer   10.0.11.78    35.223.4.218   3000:32411/TCP   42m
  • 吊舱是工人,由于它们本质上是可替换的,我们将连接到前端吊舱,以模拟他的行为,并试图连接到后端服务(这是网络层,它将把流量引导到一个后端吊舱)。
  • nginx映像没有预装curl,因此为了演示目的,我必须安装它:
代码语言:javascript
复制
$ kubectl exec -it pod/gbpd-front-66b48f8b7c-4zstv -- /bin/bash
root@gbpd-front-66b48f8b7c-4zstv:/# apt update && apt install curl -y
done.

root@gbpd-front-66b48f8b7c-4zstv:/# curl gbpd-api:3008
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
  • 现在,让我们尝试使用已定义的环境变量:
代码语言:javascript
复制
root@gbpd-front-66b48f8b7c-4zstv:/# printenv | grep REACT
REACT_APP_API_URL=http://gbpd-api:3008
root@gbpd-front-66b48f8b7c-4zstv:/# curl $REACT_APP_API_URL
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

Considerations:

问题2:为什么卷曲的本地主机:3008没有回答?

  • 由于正确地描述了所有的yaml,所以您必须检查image: binomio/gbpd-back:dev是否按照预期在端口3008上正确地服务。
  • 因为它不是一个公共映像,所以我无法测试它,所以我将给出故障排除步骤:
    • 就像我们登录在前端吊舱中一样,您必须登录到这个后端吊舱并测试curl localhost:3008
    • 如果它基于带有apt-get的linux发行版,您可以像我在演示中所做的那样运行命令:
    • 从后端部署中获取荚名(例如:gbpd-api-6676c7695c-6bs5n)
    • 运行kubectl exec -it pod/<POD_NAME> -- /bin/bash
    • 然后运行apt update && apt install curl -y
    • 和测试curl localhost:3008
    • 如果没有答案,运行“apt更新&& apt安装网络工具”
    • 并测试netstat -nlpt,它必须向您显示正在运行的服务的输出和相应的端口,例如:

代码语言:javascript
复制
root@gbpd-api-585df9cb4d-xr6nk:/# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx: master pro 
  • 即使在这种方法中,如果pod不返回任何内容,则必须检查映像中的代码。

在那之后如果你需要帮助,请告诉我!

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

https://stackoverflow.com/questions/60986557

复制
相关文章

相似问题

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