kubernetes - 使入口部署为监听树莓派kubernetes集群上的端口80的必要条件

标签 kubernetes raspberry-pi kubernetes-ingress

您好kubernetes专家,

我有一个在docker 18.04ce和kubernetes 1.9.7的4个树莓pi上运行的kubernetes集群。

我部署了一项服务,可以通过群集IP从群集内部访问此服务。
我还按照https://docs.traefik.io/user-guide/kubernetes/How to get Kubernetes Ingress Port 80 working on baremetal single node cluster中的DaemonSet部署了一个基于入口 Controller 服务的入口。 DaemonSet还具有NET_BIND_SERVICE设置,该设置应确保主机正在侦听与服务相同的端口。

一切都像描述的那样工作,但是我的入口未在主机端口80上监听。以某种方式设置NET_BIND_SERVICE无法按预期工作。
有谁知道该如何解决?

如果我将入口 Controller 作为具有NodePort的部署而不是作为DaemonSet进行部署,则它可以工作,但这将我限制为kubernetes允许为NodePorts分配端口。

https://hackernoon.com/kubernetes-ingress-controllers-and-traefik-a32648a4ae95告诉我,入口DaemonSet的hostPort不能与CNI网络插件一起使用(我已经用法兰绒和编织进行了测试),但是Kubernetes @ RaspberryPI网站(例如https://blog.hypriot.com/post/setup-kubernetes-raspberry-pi-cluster/)告诉它可以工作,因此应该解决此问题。

提前致谢
亨氏

最佳答案

我找到了一个配置,基于traefik的入口如何在具有docker 18.04CE,kubernetes 1.9.7和2018-06-27-raspbian-stretch-lite.img的Raspberry Pi群集上工作:

使用https://docs.traefik.io/user-guide/kubernetes/中的DaemonSet定义,尤其是使用Yaml文件https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-ds.yaml


你必须添加
hostNetwork:符合DaemonSet的规范

类型:根据服务规格的ClusterIP。

我的工作Yaml如下:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  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
      hostNetwork: true
      containers:
      - image: traefik
        name: traefik-ingress-lb
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8080
          hostPort: 8080
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=DEBUG
---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  type: ClusterIP
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin

根据kubernetes文档,ClusterIP是服务类型的默认值。但是,只有在我明确添加类型:ClusterIP到支持入口 Controller 的服务时,我的示例才起作用。

我还检查了是否仅将“hostNetwork:true”添加到DeamonSet的spec.template.spec或将“type:ClusterIP”添加到服务的规范是否有效,但是仅当我将两者都添加时,它才有效。

关于kubernetes - 使入口部署为监听树莓派kubernetes集群上的端口80的必要条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52066340/

相关文章:

kubernetes - 禁止在 apiGroups 中添加角色.rbac.authorization.k8s.io

docker - 在运行时将 (Docker) 环境变量传递到 Vue/Quasar 应用程序

android - 通过服务器从树莓派到移动设备(Android 或 iOS)的 HLS

kubernetes - Kubernetes端点为空,我可以重新启动Pod吗?

kubernetes - 使用 hostNetwork : true 运行 Ingress Controller

amazon-web-services - 按标签 AGE 删除 kubernetes pvc 的自动化脚本

docker - kubernetes minions 之间的网络

php - 一种用python上传远程数据库数据的想法

PHP 不从网页执行 [但在 Raspberry Pi 上可以从 PHP-CLI 执行]

kubernetes - GCE入口多路径通配符问题