【问题标题】:How to get Kubernetes Ingress Port 80 working on baremetal single node cluster如何让 Kubernetes Ingress Port 80 在裸机单节点集群上工作
【发布时间】:2018-12-23 18:04:04
【问题描述】:

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

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

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

我需要知道:

  1. 如果没有负载均衡器,我能做到这一点吗?

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

  3. 集群需要哪些额外配置? (网络政策等)

    如果提供示例 yaml 文件,将不胜感激。

我是 Kubernetes 世界的新手。我得到了示例 kubernetes 部署(如sock-shop),端到端工作没有任何问题。我尝试使用 NodePort 来访问该服务,但我不需要在不同的端口上运行它,而是需要在主机上的确切端口 80 上运行它。我尝试了许多入口解决方案,但都没有奏效。

我的设置屏幕截图:

【问题讨论】:

  • 您的任务由docker run ... 解决,而您的“稍后的任务”由docker-compose 解决。为什么需要 Kubernetes?
  • 感谢您的建议。这是开始并将在微服务架构中进一步发展。目前正在测试应用程序本地 ubuntu 服务器,并将很快部署在云端。自动伸缩,负载均衡稍后会用到。

标签: kubernetes kubernetes-ingress


【解决方案1】:

除了 Nicola Ben 的回答,你必须在你的 traefik 服务中定义一个 externalIPs,只需按照 Nicola Ben 的步骤,在服务“my-svc-1”中添加一个 externalIPs 部分。

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>

而且你可以定义更多的外部IP。

【讨论】:

    【解决方案2】:

    我最近使用traefik.io 配置了一个与您的需求相似的项目。

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

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

    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 控制器将部署为守护程序集(即根据定义,集群中的每个节点都有一个),并且 Kubernetes 服务专用于控制器:

    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
    

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

    查看kubernetes.io 文档以了解 kubernetes 的概念。 traefik.io 也很有用。

    希望对你有帮助。

    【讨论】:

    • 你能提供我可以运行的剩余 yml image: mydockerhub/sampleweb:latest。所以这个答案将是完整的。
    • 部署应用程序的 yml 并不重要,重要的是管理应用程序的服务。对于您在入口中引用的该服务。我在最后两个代码sn-ps(svc+ing)中描述过
    • 是否有必要在入口运行的同一 traefik 命名空间中运行我的服务/部署?
    • 不,我把入口放在你服务的同一个命名空间中。
    • 我有一个 EKS 和 traefik 入口控制器,当我尝试获取仪表板页面时得到 404。主机值为xxx.elb.amazonaws.com
    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2020-08-05
    • 2019-09-27
    • 2013-04-24
    • 2019-12-26
    • 2021-06-22
    • 2020-04-29
    • 2015-11-13
    相关资源
    最近更新 更多