Skip to content

Instantly share code, notes, and snippets.

@aojea
Last active January 14, 2025 17:47
Show Gist options
  • Save aojea/56cdfdf251abc4388ead358e1b0a00b4 to your computer and use it in GitHub Desktop.
Save aojea/56cdfdf251abc4388ead358e1b0a00b4 to your computer and use it in GitHub Desktop.
Use kindnet in GKE
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: kindnet
rules:
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- patch
- apiGroups:
- ""
resources:
- nodes/proxy
- nodes/configz
verbs:
- get
- apiGroups:
- ""
resources:
- configmaps
verbs:
- get
- apiGroups:
- ""
resources:
- pods
- namespaces
verbs:
- list
- watch
- apiGroups:
- "networking.k8s.io"
resources:
- networkpolicies
verbs:
- list
- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: kindnet
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kindnet
subjects:
- kind: ServiceAccount
name: kindnet
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: kindnet
namespace: kube-system
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kindnet
namespace: kube-system
labels:
tier: node
app: kindnet
k8s-app: kindnet
spec:
selector:
matchLabels:
app: kindnet
template:
metadata:
labels:
tier: node
app: kindnet
k8s-app: kindnet
spec:
hostNetwork: true
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: kindnet
initContainers:
- name: mount-cni-bin
image: busybox:stable
command:
- /bin/sh
- -c
- |
mkdir -p /tmp/opt/cni
mount --bind /tmp/opt/cni /opt/cni/bin/
# required by containerd but kindnet already provides this functionality
touch /opt/cni/bin/localhost
chmod +x /opt/cni/bin/localhost
rm /etc/cni/net.d/* || true
volumeMounts:
- name: opt-cni
mountPath: /opt/cni/
mountPropagation: Bidirectional
securityContext:
runAsUser: 0
privileged: true
- name: install-cni-bin
image: ghcr.io/aojea/kindnetd:stable
command: ['sh', '-c', 'cat /opt/cni/bin/cni-kindnet > /cni/cni-kindnet ; chmod +x /cni/cni-kindnet']
volumeMounts:
- name: cni-bin
mountPath: /cni
containers:
- name: kindnet-cni
image: ghcr.io/aojea/kindnetd:stable
command:
- /bin/kindnetd
- --hostname-override=$(NODE_NAME)
- --v=4
env:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumeMounts:
- name: cni-cfg
mountPath: /etc/cni/net.d
- name: var-lib-kindnet
mountPath: /var/lib/cni-kindnet
resources:
requests:
cpu: "100m"
memory: "50Mi"
securityContext:
privileged: true
volumes:
- name: opt-cni
hostPath:
path: /opt/cni
type: DirectoryOrCreate
- name: cni-bin
hostPath:
path: /opt/cni/bin
type: DirectoryOrCreate
- name: cni-cfg
hostPath:
path: /etc/cni/net.d
type: DirectoryOrCreate
- name: var-lib-kindnet
hostPath:
path: /var/lib/cni-kindnet
type: DirectoryOrCreate
- name: tmp
hostPath:
path: /tmp
type: DirectoryOrCreate
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: kube-proxy
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: system:kube-proxy
subjects:
- kind: ServiceAccount
name: kube-proxy
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:node-proxier
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
k8s-app: kube-proxy
name: kube-proxy-nft
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: kube-proxy
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 10%
template:
metadata:
labels:
k8s-app: kube-proxy
spec:
priorityClassName: system-node-critical
hostNetwork: true
nodeSelector:
kubernetes.io/os: linux
tolerations:
- operator: "Exists"
effect: "NoExecute"
- operator: "Exists"
effect: "NoSchedule"
containers:
- name: kube-proxy
image: registry.k8s.io/kube-proxy:v1.31.1
resources:
requests:
cpu: "100m"
memory: "50Mi"
command:
- /usr/local/bin/kube-proxy
- --hostname-override=$(NODE_NAME)
- --v=2
- --proxy-mode=nftables
- --detect-local-mode=NodeCIDR
- --conntrack-tcp-be-liberal=true
env:
- name: KUBERNETES_SERVICE_HOST
value: APISERVER_IP_HERE
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
securityContext:
privileged: true
serviceAccountName: kube-proxy
#!/bin/sh
# only for dpv2 clusters
kubectl -n kube-system patch ds anetd --type='json' \
-p='[{"op": "add", "path": "/spec/template/spec/nodeSelector/do-not-run-here", "value": "donotexist"}]'
kubectl -n kube-system patch ds netd --type='json' \
-p='[{"op": "add", "path": "/spec/template/spec/nodeSelector/do-not-run-here", "value": "donotexist"}]'
# cos is not writable
mkdir -p /tmp/opt/cni
mount --bind /tmp/opt/cni /opt/cni/bin/
mount -o remount,exec,rw /opt/cni/bin/
# required by containerd but kindnet already provides this functionality
touch /opt/cni/bin/localhost
chmod +x /opt/cni/bin/localhost
kubectl apply -f kindnet-gke.yaml
# replace the APISERVER_IP_HERE value in the kube-proxy yaml with the IP obtained from
# kubectl get endpoints kubernetes
# NAME ENDPOINTS AGE
# kubernetes 10.128.0.3:443 25d
# use kube-proxy-nft name because there is already a daemonset called kube-proxy
kubectl apply -f kube-proxy.yaml
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment