【问题标题】:I need help understanding kubernetes architecture best practices我需要帮助了解 Kubernetes 架构最佳实践
【发布时间】:2020-01-23 09:28:50
【问题描述】:

我在 Kubernetes 集群中的 GCP 上有 2 个节点。我在 GCP 中也有一个负载均衡器。这是一个常规集群(不是 GCK)。我正在尝试向世界公开我的前端服务。我正在尝试 nginx-ingress type:nodePort 作为解决方案。我的负载均衡器应该指向哪里?这是一种好的架构方法吗?

世界 --> GCP-LB --> nginx-ingress-resource(GCP k8s 集群) --> 服务(pods)

要访问我的站点,我必须将 LB 指向运行 nginx pod 的 worker-node-IP。这是不好的做法。我是这个主题的新手,并试图理解。 谢谢

部署服务:

apiVersion: v1
kind: Service
metadata:
  name: mycha-service
  labels:
    run: mycha-app
spec:
  ports:
  - port: 80
    targetPort: 3000
    protocol: TCP
  selector:
    app: mycha-app

nginx服务:

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress
  labels:
    app: nginx-ingress
spec:
  type: NodePort 
  ports: 
  - nodePort: 31000
    port: 80
    targetPort: 80
    protocol: TCP
    name: http
  - port: 443
    targetPort: 443
    protocol: TCP
    name: https
  selector:
    name: nginx-ingress
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress
      labels:
        run: nginx-ingress
    spec:
      type: NodePort
      ports:
      - nodePort: 31000
        port: 80
        targetPort: 3000
        protocol: TCP
      selector:
        app: nginx-ingress

nginx-资源:

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: mycha-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
        - path: /
          backend:
            serviceName: mycha-service
            servicePort: 80

此配置无效。

【问题讨论】:

  • 什么不起作用?你有什么错误?

标签: nginx kubernetes architecture


【解决方案1】:

当您在工作负载 pod 前面使用入口时,工作负载 pod 的服务类型将始终为 clusterIP 类型,因为您不会直接在集群外部公开 pod。 但是您需要使用 NodePort 类型的服务或使用 Load Balancer 类型的服务在集群外部公开入口控制器,并且对于生产,建议使用 Loadbalancer 类型的服务。

这是推荐的模式。

Client -> LoadBalancer -> Ingress Controller -> Kubernetes Pods

入口控制器避免使用 kube-proxy 和 kube-proxy 提供的负载平衡。您可以在 Ingress 本身中配置第 7 层负载均衡。

【讨论】:

  • 这没有意义?你无缘无故地创造了一个额外的希望?我可能错了,但服务不应该是 clusterIP 并且入口是客户端流量的直接摄取者吗?
  • kubernetes 服务类型将是 pod 的 clusterip...对于入口控制器,您需要创建一个服务以便在集群外部访问它...该服务可以是 nodeport 或负载均衡器
  • 如何设置自己的 LoadBalancer。我有自己的 LB 的 ip。如何将我的入口与我的 LB 连接起来?当我输入:LoadBalancer for nginx-ingress 时。外部 ip 正在等待,但我认为它不应该处于等待状态,但不知何故我需要将我的 LB IP 传递给入口。
  • 您是使用 GKE 还是 kubernetes 由您管理?您现有的负载均衡器是 TCP/UDP 还是 HTTP?
  • 您是否尝试过将 TCP/UDP 负载平衡器配置为指向运行 nginx 入口控制器的工作虚拟机?
【解决方案2】:

公开应用程序的最佳做法是:

World > LoadBalancer/NodePort (for connecting to the cluster) > Ingress (Mostly to redirect traffic) > Service

如果您使用的是 Google Cloud Platform,我会使用 GKE,因为它针对容器进行了优化,并为您自动配置了很多东西。

关于您的问题,我也无法获取 LB <Pending> 状态的 IP 地址,但是您可以使用 NodePort 和虚拟机 IP 公开您的应用程序。我将尝试其他一些配置来获取ExternalIP 并编辑答案。

以下是如何在GCE 上使用Kubeadm 公开您的应用的示例之一。

在 GCE 上,您的 VM 已经有 ExternalIP。这样您就可以将ServiceNodePortIngress 一起使用,将流量重定向到正确的services

使用 Helm 3 部署 Nginx Ingress,因为不再需要分蘖 ($ helm install nginx stable/nginx-ingress)。

默认情况下,它将使用LoadBalancer 类型部署服务,但它不会获得外部IP,它将停留在<Pending> 状态。您必须将其更改为 NodePort 并应用更改。

$ kubectl edit svc nginx-nginx-ingress-controller

默认会打开Vi 编辑器。如果你想要其他你需要指定它

$ KUBE_EDITOR="nano" kubectl edit svc nginx-nginx-ingress-controller

现在您可以部署服务、部署和入口。

apiVersion: v1
kind: Service
metadata:
  name: fs
spec:
  selector:
    key: app
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fd
spec:
  replicas: 1
  selector:
    matchLabels:
      key: app
  template:
    metadata:
      labels:
        key: app
    spec:
      containers:
      - name: hello1
        image: gcr.io/google-samples/hello-app:1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
---
apiVersion: apps/v1
kind:  Deployment
metadata:
  name: mycha-deploy
  labels:
    app: mycha-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mycha-app
  template:
    metadata:
      labels:
        app: mycha-app
    spec:
      containers:
        - name: mycha-container
          image: nginx
          ports:
          - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: mycha-service
  labels:
    app: mycha-app
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: mycha-app
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my.pod.svc
    http:
      paths:
      - path: /mycha
        backend:
          serviceName: mycha-service
          servicePort: 80
      - path: /hello
        backend:
          serviceName: fs
          servicePort: 80

service/fs created
deployment.apps/fd created
deployment.apps/mycha-deploy created
service/mycha-service created
ingress.extensions/two-svc-ingress created

$ kubectl get svc nginx-nginx-ingress-controller
NAME                             TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
nginx-nginx-ingress-controller   NodePort   10.105.247.148   <none>        80:31143/TCP,443:32224/TCP   97m

现在您应该将您的 VM ExternalIP(从属 VM)与来自 NodePort 服务的 port 一起使用。我的虚拟机外部IP:35.228.133.12,服务:80:31143/TCP,443:32224/TCP

重要

如果你用端口卷曲你的虚拟机,你会得到响应:

$ curl 35.228.235.99:31143
curl: (7) Failed to connect to 35.228.235.99 port 31143: Connection timed out

当您手动执行此操作时,您还需要添加Firewall rule 以允许来自此特定端口或范围的外部流量

有关创建Firewall Rules 的信息可以在here 找到。

如果您设置正确的值(打开端口、设置 IP 范围 (0.0.0.0/0) 等),您将能够从您的机器获得服务。

我本地机器上的卷曲:

$ curl -H "HOST: my.pod.svc" http://35.228.235.99:31143/mycha
<!DOCTYPE html>
...
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

$ curl -H "HOST: my.pod.svc" http://35.228.235.99:31143/hello
Hello, world!
Version: 1.0.0
Hostname: fd-c6d79cdf8-dq2d6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2010-12-14
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2013-02-24
    • 2011-09-13
    • 2013-01-04
    相关资源
    最近更新 更多