# Copyright 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: netd
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
rules:
- apiGroups: [""]
  resources: ["nodes", "pods"]
  verbs: ["get","watch","list"]

---

kind: ServiceAccount
apiVersion: v1
metadata:
  name: netd
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile

---

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: netd
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: netd
subjects:
- kind: ServiceAccount
  name: netd
  namespace: kube-system

---

kind: ConfigMap
apiVersion: v1
metadata:
  name: netd-config
  namespace: kube-system
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
data:
  cni_spec_template: |-
    {
      "name": "gke-pod-network",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "@cniType",
          "mtu": @mtu,
          "ipam": {
              "type": "host-local",
              "ranges": [
              @ipv4Subnet@ipv6SubnetOptional
              ],
              "routes": [
                {"dst": "0.0.0.0/0"}@ipv6RouteOptional
              ]
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }@cniBandwidthPlugin@cniCiliumPlugin@cniIstioPlugin
      ]
    }
  cni_spec_name: "10-gke-ptp.conflist"
  cni_spec_ipv6_route: "{\"dst\": \"::/0\"}"
  enable_policy_routing: "true"
  enable_masquerade: "true"
  enable_calico_network_policy: "false"
  enable_ipv6: "false"
  enable_bandwidth_plugin: "true"
  enable_cilium_plugin: "true"
  master_ip: "10.0.0.1"
  reconcile_interval_seconds: "60s"
  enable_pod_watch: "true"

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: networking-metrics-config
  namespace: kube-system
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
data:
  metrics_collectors: "conntrack,socket,kernel_metrics"
  metrics_address: "localhost:10231"
---

kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: netd
  namespace: kube-system
  labels:
    k8s-app: netd
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  selector:
    matchLabels:
      k8s-app: netd
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 10%
  template:
    metadata:
      labels:
        k8s-app: netd
    spec:
      priorityClassName: system-node-critical
      serviceAccountName: netd
      terminationGracePeriodSeconds: 0
      nodeSelector:
        cloud.google.com/gke-netd-ready: "true"
      tolerations:
      - operator: "Exists"
        effect: "NoExecute"
      - operator: "Exists"
        effect: "NoSchedule"
      hostNetwork: true
      initContainers:
      - image: gcr.io/google-containers/netd-init:latest
        name: netd-init
        env:
          - name: CNI_SPEC_TEMPLATE
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: cni_spec_template
          - name: CNI_SPEC_NAME
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: cni_spec_name
          - name: CNI_SPEC_IPV6_ROUTE
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: cni_spec_ipv6_route
          - name: ENABLE_CALICO_NETWORK_POLICY
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: enable_calico_network_policy
          - name: WRITE_CALICO_CONFIG_FILE
            value: "false"
          - name: ENABLE_IPV6
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: enable_ipv6
          - name: ENABLE_MASQUERADE
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: enable_masquerade
          - name: ENABLE_BANDWIDTH_PLUGIN
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: enable_bandwidth_plugin
          - name: ENABLE_CILIUM_PLUGIN
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: enable_cilium_plugin
          - name: ISTIO_CNI_CONFIG
            valueFrom:
              configMapKeyRef:
                name: istio-cni-plugin-config
                key: cni_network_config
                optional: true
          - name: KUBERNETES_SERVICE_HOST
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: master_ip
        volumeMounts:
        - mountPath: /host/etc/cni/net.d
          name: cni-net-dir
        - mountPath: /host/home/kubernetes/bin
          name: kubernetes-bin
          readOnly: true
      containers:
      - image: gcr.io/google-containers/netd:latest
        name: netd
        imagePullPolicy: Always
        hostPID: true
        securityContext:
          privileged: true
          capabilities:
            add: ["NET_ADMIN"]
        args:
        - --enable-policy-routing=$(ENABLE_POLICY_ROUTING)
        - --logtostderr
        - --enable-pod-watch=$(ENABLE_POD_WATCH)
        - --reconcile-interval-seconds=$(RECONCILE_INTERVAL_SECONDS)
        - --metrics-collectors=$(METRICS_COLLECTORS)
        - --metrics-address=$(METRICS_ADDRESS)
        env:
          - name: CURRENT_NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: ENABLE_POD_WATCH
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: enable_pod_watch
          - name: ENABLE_POLICY_ROUTING
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: enable_policy_routing
          - name: RECONCILE_INTERVAL_SECONDS
            valueFrom:
              configMapKeyRef:
                name: netd-config
                key: reconcile_interval_seconds
          - name: METRICS_COLLECTORS
            valueFrom:
              configMapKeyRef:
                name: networking-metrics-config
                key: metrics_collectors
          - name: METRICS_ADDRESS
            valueFrom:
              configMapKeyRef:
                name: networking-metrics-config
                key: metrics_address
      volumes:
      - name: cni-net-dir
        hostPath:
          path: /etc/cni/net.d
      - name: kubernetes-bin
        hostPath:
          path: /home/kubernetes/bin
          type: Directory
