首页 文章

如何让Kubernetes Ingress Port 80在裸机单节点集群上工作

提问于
浏览
10

我有一个用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上运行的服务) .

我需要知道:

  • 我可以在没有负载均衡器的情况下实现这一目标吗?

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

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

如果提供了样本yaml文件,我们非常感激 .

我是kubernetes世界的新手 . 我得到了样本kubernetes部署(如sock-shop)端到端工作,没有任何问题 . 我尝试使用NodePort来访问该服务,但我不需要在另一个端口上运行它,而是需要在主机上运行它 . 我尝试了许多入口解决方案但没有工作 .

我的设置截图:

2 回答

  • 8

    我最近使用traefik.io配置了一个与您的项目具有类似要求的项目 .

    所以我将展示 traefik 和ingresses的基本解决方案 .

    我专用了一个名为 traefik 的整个命名空间(你可以使用 kube-system ),并创建了一个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
    

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

    看一下kubernetes.io文档,清楚了解kubernetes的概念 . 另外traefik.io也很有用 .

    我希望这可以帮助你 .

  • 2

    除了Nicola Ben的andswer之外,你必须在你的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>
    

    而且您可以定义多于externalIP .

相关问题