当前位置: 首页 > 知识库问答 >
问题:

如何让库伯内特斯入口端口80在裸机单节点集群上工作

东方飞捷
2023-03-14

我有一个用kubeadm创建的裸机kubernetes(v1.11.0)集群,工作正常,没有任何问题。并使用kubectl-taint-nodes命令使其成为单节点集群。(要求单节点)。

我需要在主机端口80上运行mydockerhub/sampleweb静态网站图像。假设运行这个kubernetes的ubuntu服务器的IP地址是192.168.8.10。

如何使我的静态网站在192.168.8.10:80上可用,或在本地DNS服务器上映射到它的主机名?(示例:frontend.sampleweb.local:80)。稍后,我需要在映射到另一子域的不同端口上运行其他服务。(例如:后端.sampleweb.local:80,路由到端口8080上运行的服务)。

我需要知道:

>

  • 没有负载平衡器我能做到这一点吗?

    创建需要哪些资源?(入口、部署等)

    集群上需要哪些其他配置?(网络策略等)

    如果提供示例yaml文件,非常感谢。

    我对库伯内特的世界还不熟悉。我得到了kubernetes部署示例(如sock shop),可以端到端工作,没有任何问题。我尝试了NodePort来访问该服务,但我没有在其他端口上运行它,而是需要在主机上的端口80上运行它。我尝试了许多入口解决方案,但都没有成功。


  • 共有2个答案

    钱浩荡
    2023-03-14

    除了Nicola Ben的andswer之外,您还必须在traefik服务中定义externalIPs,只需遵循Nicola Ben的步骤并将externalIPs部分添加到服务“my-svc-1”中即可。

    apiVersion: v1
    kind: Service
    metadata:
      namespace: traefik
      name: my-svc-1
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
      - port: 80 
        targetPort: 8080
      externalIPs:
      - <IP_OF_A_NODE>
    

    您可以定义的不仅仅是externalIP。

    庄浩言
    2023-03-14

    我最近使用了traefik。io来配置具有与您类似需求的项目。

    所以我将展示一个带有traefik和入口的基本解决方案。

    我专用了一个完整的命名空间(您可以使用库贝-system),称为traefik,并创建了一个kubernetes serviceUser:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: traefik
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      namespace: traefik
      name: traefik-ingress-controller
    

    由入口规则调用的traefik控制器需要ClusterRole及其绑定:

    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: traefik-ingress-controller
    rules:
      - apiGroups:
          - ""
        resources:
          - services
          - endpoints
          - secrets
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - extensions
        resources:
          - ingresses
        verbs:
          - get
          - list
          - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: traefik-ingress-controller
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: traefik-ingress-controller
    subjects:
    - kind: ServiceAccount
      namespace: traefik
      name: traefik-ingress-controller
    

    traefin控制器将部署为守护集(即根据定义,集群中的每个节点都有一个守护集),库伯内特斯服务专用于控制器:

    kind: DaemonSet
    apiVersion: extensions/v1beta1
    metadata:
      name: traefik-ingress-controller
      namespace: traefik
      labels:
        k8s-app: traefik-ingress-lb
    spec:
      template:
        metadata:
          labels:
            k8s-app: traefik-ingress-lb
            name: traefik-ingress-lb
        spec:
          serviceAccountName: traefik-ingress-controller
          terminationGracePeriodSeconds: 60
          containers:
          - name: traefik-ingress-lb
            image: traefik
            ports:
            - name: http
              containerPort: 80
              hostPort: 80
            - name: admin
              containerPort: 8080
            securityContext:
              capabilities:
                drop:
                - ALL
                add:
                - NET_BIND_SERVICE
            args:
            - --api
            - --kubernetes
            - --logLevel=INFO
    ---
    kind: Service
    apiVersion: v1
    metadata:
      namespace: traefik
      name: traefik-ingress-service
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
        - protocol: TCP
          port: 80
          name: web
        - protocol: TCP
          port: 8080
          name: admin
    

    最后一部分要求您为项目中的每个微服务创建一个服务,下面是一个示例:

    apiVersion: v1
    kind: Service
    metadata:
      namespace: traefik
      name: my-svc-1
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
      - port: 80 
        targetPort: 8080
    

    以及将请求转发到适当服务的入口(一组规则):

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      namespace: traefik
      name: ingress-ms-1
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      rules:
      - host: my-address-url
        http:
          paths:
          - backend:
              serviceName: my-svc-1
              servicePort: 80
    

    在这个入口中,我写了一个主机URL,这将是集群中的切入点,因此您需要将名称解析为主K8S节点。如果您有更多的节点可以是master,那么建议使用负载均衡器(在这种情况下,主机URL将是LB)。

    看看库伯内特斯。io文档,以明确kubernetes的概念。还有traefik。io很有用。

    我希望这对你有帮助。

     类似资料:
    • 所以我已经使用库伯内特斯在Google云上设置了我的应用程序。我有一个Pod,我想从需要TCP请求的集群中公开它。 我通过ingress nginx了解到这是可能的,并对此进行了研究。如本文所述,可以通过如下方式设置configMap来完成: ,但它的完整用法没有明确描述,也没有在文档中找到完整的示例。 我已经安装了《安装指南》中提到的ingress nginx,但我不确定下一步将如何暴露我的Po

    • 具体来说,当我按照谷歌网站上的指示在GKE上设置nginx ingress时,为什么最终会有两个外部IP地址? 这两个IP地址用于LoadBalancer类型的入口资源和服务资源: 以下是我的想法: 这基本上就是我链接到的教程页面上的图表。因此,我希望负载平衡器是L4类型的,并且有一个外部IP(并且不需要花费任何金钱来使用!)。我希望入口(尽管其名称)没有外部IP,因为我用注释标记了它 谷歌应该承

    • 我怎样才能使用入口呢?我尝试使用NodePort和--Target etPort=1001,我在servicePort中添加了80在。 kubectl公开部署测试--Target-port=1001--type=NodePort 我得到了错误 找不到后端-404 我使用的是正确的方法还是需要遵循其他方法?

    • 我试图设置Kubernetes入口,将外部http流量路由到前端pod(路径/)和后端pod(路径/rest/*),但我总是得到400错误,而不是主nginx索引。html。 所以我在第https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer页尝试了谷歌库伯内特斯的例子,但我总是得到400个错误。有什么想法吗?

    • 我是库伯内特斯的新手。我正在为K8S使用GKE托管服务。有2个部署nginx、httpd,并为这2个部署创建了NodePort服务。 我正在尝试为服务创建入口规则。nginx入口控制器是通过helm安装的。我有一个来自freenom的域,并将Google云DNS设置为使用静态公共IP。当我尝试点击入口URL(domain/nginx)时,它会给出: "默认后端-404" 部署: 服务: 与http

    • 新来的。我想知道是否有人可以帮助我区分我可以用来识别入口控制器和通过YAML和服务识别入口的特征。我有一个预先存在的集群,我认为入口控制器可能是通过helm安装的,但我不确定。有没有办法了解helm在安装nginx ingress控制器时使用的yaml?