Integrating NFD Daemonset with KuD 16/94716/10
authorAkhila Kishore <akhila.kishore@intel.com>
Fri, 30 Aug 2019 23:39:00 +0000 (16:39 -0700)
committerAkhila Kishore <akhila.kishore@intel.com>
Wed, 11 Sep 2019 20:53:16 +0000 (13:53 -0700)
Current NFD code in KuD is unused and obsolete.
Integrating NFD as DaemonSet and updating test case for NFD.
Added comments. Addressed comments and changed the
matchExpression to kernel features. Changed operator from "In" to Gt,
and values 4 to 3 better fit broader spectrum of O.S's.
Adding exit conditon in case there's an error status.

Signed-off-by: Akhila Kishore <akhila.kishore@intel.com>
Issue-ID: MULTICLOUD-797
Change-Id: I454fb1998fc84e5f0d566f32b7dcfd85872c5183

kud/deployment_infra/images/nfd-master.yaml [new file with mode: 0644]
kud/deployment_infra/images/nfd-worker.yaml [new file with mode: 0644]
kud/deployment_infra/playbooks/configure-nfd.yml
kud/deployment_infra/playbooks/kud-vars.yml
kud/hosting_providers/vagrant/installer.sh
kud/tests/nfd.sh

diff --git a/kud/deployment_infra/images/nfd-master.yaml b/kud/deployment_infra/images/nfd-master.yaml
new file mode 100644 (file)
index 0000000..846bb75
--- /dev/null
@@ -0,0 +1,86 @@
+# Refernce NFD Master DaemonSet - https://github.com/kubernetes-sigs/node-feature-discovery/blob/master/nfd-master.yaml.template
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: node-feature-discovery # NFD namespace
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: nfd-master
+  namespace: node-feature-discovery
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: nfd-master
+rules:
+- apiGroups:
+  - ""
+  resources:
+  - nodes
+  verbs:
+  - get
+  - patch
+  - update
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: nfd-master
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: nfd-master
+subjects:
+- kind: ServiceAccount
+  name: nfd-master
+  namespace: node-feature-discovery
+---
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+  labels:
+    app: nfd-master
+  name: nfd-master
+  namespace: node-feature-discovery
+spec:
+  selector:
+    matchLabels:
+      app: nfd-master
+  template:
+    metadata:
+      labels:
+        app: nfd-master
+    spec:
+      serviceAccount: nfd-master
+      nodeSelector:
+        node-role.kubernetes.io/master: ""
+      tolerations:
+        - key: "node-role.kubernetes.io/master"
+          operator: "Equal"
+          value: ""
+          effect: "NoSchedule"
+      containers:
+        - env:
+          - name: NODE_NAME
+            valueFrom:
+              fieldRef:
+                fieldPath: spec.nodeName
+          image: quay.io/kubernetes_incubator/node-feature-discovery:v0.4.0
+          name: nfd-master
+          command:
+            - "nfd-master"
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: nfd-master
+  namespace: node-feature-discovery
+spec:
+  selector:
+    app: nfd-master
+  ports:
+  - protocol: TCP
+    port: 8080
+  type: ClusterIP
diff --git a/kud/deployment_infra/images/nfd-worker.yaml b/kud/deployment_infra/images/nfd-worker.yaml
new file mode 100644 (file)
index 0000000..44bec5c
--- /dev/null
@@ -0,0 +1,61 @@
+# Reference to NFD worker DaemonSet - https://github.com/kubernetes-sigs/node-feature-discovery/blob/master/nfd-worker-daemonset.yaml.template
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+  labels:
+    app: nfd-worker
+  name: nfd-worker
+  namespace: node-feature-discovery
+spec:
+  selector:
+    matchLabels:
+      app: nfd-worker
+  template:
+    metadata:
+      labels:
+        app: nfd-worker
+    spec:
+      hostNetwork: true
+      dnsPolicy: ClusterFirstWithHostNet
+      containers:
+        - env:
+          - name: NODE_NAME
+            valueFrom:
+              fieldRef:
+                fieldPath: spec.nodeName
+          image: quay.io/kubernetes_incubator/node-feature-discovery:v0.4.0
+          name: nfd-worker
+          command:
+            - "nfd-worker"
+          args:
+            - "--sleep-interval=60s"
+            - "--server=nfd-master:8080"
+          volumeMounts:
+            - name: host-boot
+              mountPath: "/host-boot"
+              readOnly: true
+            - name: host-os-release
+              mountPath: "/host-etc/os-release"
+              readOnly: true
+            - name: host-sys
+              mountPath: "/host-sys"
+            - name: source-d
+              mountPath: "/etc/kubernetes/node-feature-discovery/source.d/"
+            - name: features-d
+              mountPath: "/etc/kubernetes/node-feature-discovery/features.d/"
+      volumes:
+        - name: host-boot
+          hostPath:
+            path: "/boot"
+        - name: host-os-release
+          hostPath:
+            path: "/etc/os-release"
+        - name: host-sys
+          hostPath:
+            path: "/sys"
+        - name: source-d
+          hostPath:
+            path: "/etc/kubernetes/node-feature-discovery/source.d/"
+        - name: features-d
+          hostPath:
+            path: "/etc/kubernetes/node-feature-discovery/features.d/"
index 590212c..32e7b38 100644 (file)
@@ -7,52 +7,9 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-
-- hosts: kube-node
-  tasks:
-    - name: Load kud variables
-      include_vars:
-        file: kud-vars.yml
-    - name: clone NFD repo
-      git:
-        repo: "{{ nfd_url }}"
-        dest: "{{ nfd_dest }}"
-        version: "{{ nfd_version }}"
-        force: yes
-      when: nfd_source_type == "source"
-    - name: build NFD image
-      become: yes
-      make:
-        chdir: "{{ nfd_dest }}"
-    - name: get NDF image name
-      become: yes
-      shell: "docker images | grep kubernetes_incubator | awk '{printf(\"%s:%s\\n\", $1,$2)}'"
-      register: nfd_image
-    - name: replace NFD image name
-      lineinfile:
-        path: "{{ nfd_dest }}/node-feature-discovery-{{ item }}.json.template"
-        regexp: "\"image\": \"quay.io/kubernetes_incubator.*i"
-        line: "\"image\": \"{{ nfd_image.stdout }}\","
-      with_items:
-        - daemonset
-        - job
-    - name: copying rbac and daemonset files
-      fetch:
-        src: "{{ nfd_dest }}/{{ item }}"
-        dest: "/tmp/"
-        flat: yes
-      with_items:
-        - rbac.yaml
-        - node-feature-discovery-daemonset.json.template
-
 - hosts: localhost
-  pre_tasks:
-    - name: Load kud variables
-      include_vars:
-        file: kud-vars.yml
   tasks:
-    - name: create service accounts
-      command: "/usr/local/bin/kubectl apply -f /tmp/{{ item }}"
-      with_items:
-        - rbac.yaml
-        - node-feature-discovery-daemonset.json.template
+    - name: Apply NFD Master Daemonset
+      command: "/usr/local/bin/kubectl apply -f {{ playbook_dir }}/../images/nfd-master.yaml"
+    - name: Apply NFD Worker Daemonset
+      command: "/usr/local/bin/kubectl apply -f {{ playbook_dir }}/../images/nfd-worker.yaml"
index 15e24ef..a9910f8 100644 (file)
@@ -33,10 +33,6 @@ virtlet_url: "https://github.com/Mirantis/virtlet/releases/download/v{{ virtlet_
 #virtlet_version: 68e11b8f1db2c78b063126899f0e60910700975d
 #virtlet_url: "https://github.com/Mirantis/virtlet"
 
-nfd_dest: "{{ base_dest }}/nfd"
-nfd_source_type: "source"
-nfd_version: 175305b1ad73be7301ac94add475cec6fef797a9
-nfd_url: "https://github.com/kubernetes-incubator/node-feature-discovery"
 
 istio_dest: "{{ base_dest }}/istio"
 istio_source_type: "tarball"
index 51ca22e..41b21f6 100755 (executable)
@@ -150,7 +150,7 @@ function install_addons {
     sudo ansible-galaxy install $verbose -r $kud_infra_folder/galaxy-requirements.yml --ignore-errors
 
     ansible-playbook $verbose -i $kud_inventory $kud_playbooks/configure-kud.yml | sudo tee $log_folder/setup-kud.log
-    for addon in ${KUD_ADDONS:-virtlet ovn4nfv}; do
+    for addon in ${KUD_ADDONS:-virtlet ovn4nfv nfd}; do
         echo "Deploying $addon using configure-$addon.yml playbook.."
         ansible-playbook $verbose -i $kud_inventory $kud_playbooks/configure-${addon}.yml | sudo tee $log_folder/setup-${addon}.log
         if [[ "${testing_enabled}" == "true" ]]; then
index b7e1f3e..abf9f92 100755 (executable)
@@ -15,40 +15,40 @@ set -o pipefail
 source _common_test.sh
 
 rm -f $HOME/*.yaml
-
 pod_name=nfd-pod
 
 install_deps
 cat << POD > $HOME/$pod_name.yaml
-apiVersion:
- v1
+apiVersion: v1
 kind: Pod
 metadata:
   name: $pod_name
-  labels:
-    env: test
 spec:
+  affinity:
+    nodeAffinity:
+      requiredDuringSchedulingIgnoredDuringExecution:
+        nodeSelectorTerms:
+        - matchExpressions:
+          - key: "feature.node.kubernetes.io/kernel-version.major"
+            operator: Gt
+            values:
+            - '3'
   containers:
-  - name: nginx
-    image: nginx
-nodeSelector:
-  node.alpha.kubernetes-incubator.io/nfd-network-SRIOV: true
+  - name: with-node-affinity
+    image: gcr.io/google_containers/pause:2.0
 POD
-
 if $(kubectl version &>/dev/null); then
     labels=$(kubectl get nodes -o json | jq .items[].metadata.labels)
 
     echo $labels
-    if [[ $labels != *"node.alpha.kubernetes-incubator.io"* ]]; then
+    if [[ $labels != *"kubernetes.io"* ]]; then
         exit 1
     fi
-
     kubectl delete pod $pod_name --ignore-not-found=true --now
     while kubectl get pod $pod_name &>/dev/null; do
         sleep 5
     done
     kubectl create -f $HOME/$pod_name.yaml --validate=false
-
     for pod in $pod_name; do
         status_phase=""
         while [[ $status_phase != "Running" ]]; do
@@ -57,9 +57,17 @@ if $(kubectl version &>/dev/null); then
                 echo "$(date +%H:%M:%S) - $pod : $new_phase"
                 status_phase=$new_phase
             fi
+
+            if [[ $new_phase == "Running" ]]; then
+                echo " Test is complete.."
+            fi
             if [[ $new_phase == "Err"* ]]; then
                 exit 1
             fi
         done
     done
+    kubectl delete pod $pod_name
+    while kubectl get pod $pod_name &>/dev/null; do
+        sleep 5
+    done
 fi