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

时间:2018-08-28 21:19:06

标签: kubernetes raspberry-pi kubernetes-ingress

您好kubernetes专家

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

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

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

如果我将入口控制器作为带有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/)告诉我们它可以正常工作所以这个问题应该解决。

预先感谢 亨氏

1 个答案:

答案 0 :(得分:1)

我找到了一个配置,基于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到支持入口控制器的服务时,我的示例才起作用。

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