Skip to content

Instantly share code, notes, and snippets.

@rverchere
Created June 18, 2025 09:01
Show Gist options
  • Save rverchere/0e191eb6801895b2a8189556c473560a to your computer and use it in GitHub Desktop.
Save rverchere/0e191eb6801895b2a8189556c473560a to your computer and use it in GitHub Desktop.
# Copyright 2018 The Kubernetes Authors.
#
# 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.
#
apiVersion: v1
kind: ServiceAccount
metadata:
name: node-local-dns
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kube-rbac-proxy
rules:
- apiGroups:
- authentication.k8s.io
resources:
- tokenreviews
verbs:
- create
- apiGroups:
- authorization.k8s.io
resources:
- subjectaccessreviews
verbs:
- create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kube-rbac-proxy
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kube-rbac-proxy
subjects:
- kind: ServiceAccount
name: node-local-dns
namespace: kube-system
---
apiVersion: v1
kind: ConfigMap
metadata:
name: node-local-dns-kube-rbac-config
namespace: kube-system
data:
config-file.yaml: |
authorization:
resourceAttributes:
namespace: kube-system
apiVersion: v1
resource: services
subresource: node-local-dns
name: node-local-dns
---
apiVersion: v1
kind: Service
metadata:
name: kube-dns-upstream
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: "KubeDNSUpstream"
spec:
ports:
- name: dns
port: 53
protocol: UDP
targetPort: 53
- name: dns-tcp
port: 53
protocol: TCP
targetPort: 53
selector:
k8s-app: kube-dns
---
apiVersion: v1
kind: ConfigMap
metadata:
name: node-local-dns
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: Reconcile
data:
Corefile: |
cluster.local:53 {
errors
cache {
success 9984 30
denial 9984 5
}
reload
loop
bind 169.254.20.10 10.3.0.10
forward . __PILLAR__CLUSTER__DNS__ {
force_tcp
}
prometheus localhost:8253
health 169.254.20.10:8080
log
}
in-addr.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.10 10.3.0.10
forward . __PILLAR__CLUSTER__DNS__ {
force_tcp
}
prometheus localhost:8253
log
}
ip6.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.10 10.3.0.10
forward . __PILLAR__CLUSTER__DNS__ {
force_tcp
}
prometheus localhost:8253
log
}
company.com:53 {
errors
cache 300
reload
loop
bind 169.254.20.10 10.3.0.10
forward . 1.1.1.1
prometheus localhost:8253
log
}
othercompany.eu:53 {
errors
cache 300
reload
loop
bind 169.254.20.10 10.3.0.10
forward . 1.1.1.1
prometheus localhost:8253
log
}
.:53 {
errors
cache 30
reload
loop
bind 169.254.20.10 10.3.0.10
forward . __PILLAR__UPSTREAM__SERVERS__
prometheus localhost:8253
log
}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-local-dns
namespace: kube-system
labels:
k8s-app: node-local-dns
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
updateStrategy:
rollingUpdate:
maxUnavailable: 10%
selector:
matchLabels:
k8s-app: node-local-dns
template:
metadata:
labels:
k8s-app: node-local-dns
spec:
priorityClassName: system-node-critical
serviceAccountName: node-local-dns
automountServiceAccountToken: true
hostNetwork: true
dnsPolicy: Default # Don't use cluster DNS.
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
- effect: "NoExecute"
operator: "Exists"
- effect: "NoSchedule"
operator: "Exists"
containers:
- name: node-cache
image: registry.k8s.io/dns/k8s-dns-node-cache:1.23.1
resources:
requests:
cpu: 25m
memory: 5Mi
args: [ "-localip", "169.254.20.10,10.3.0.10", "-conf", "/etc/Corefile", "-upstreamsvc", "kube-dns-upstream", "-metrics-listen-address", "127.0.0.1:9353" ]
securityContext:
capabilities:
add:
- NET_ADMIN
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
- containerPort: 8253
name: metrics
protocol: TCP
livenessProbe:
httpGet:
host: 169.254.20.10
path: /health
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
volumeMounts:
- mountPath: /run/xtables.lock
name: xtables-lock
readOnly: false
- name: config-volume
mountPath: /etc/coredns
- name: kube-dns-config
mountPath: /etc/kube-dns
- name: kube-rbac-proxy
image: quay.io/brancz/kube-rbac-proxy:v0.18.0
imagePullPolicy: IfNotPresent
args:
- '--secure-listen-address=:9253'
- '--upstream=http://127.0.0.1:8253/'
- '--proxy-endpoints-port=9080'
- '--config-file=/etc/kube-rbac-proxy-config/config-file.yaml'
ports:
- containerPort: 9253
name: http
protocol: TCP
- containerPort: 9080
name: http-healthz
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 9080
scheme: HTTPS
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/kube-rbac-proxy-config
name: kube-rbac-proxy-config
volumes:
- name: xtables-lock
hostPath:
path: /run/xtables.lock
type: FileOrCreate
- name: kube-dns-config
configMap:
name: kube-dns
optional: true
- name: config-volume
configMap:
name: node-local-dns
items:
- key: Corefile
path: Corefile.base
- configMap:
defaultMode: 420
name: node-local-dns-kube-rbac-config
name: kube-rbac-proxy-config
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: node-local-dns
name: node-local-dns
namespace: kube-system
spec:
clusterIP: None
ports:
- name: metrics
port: 9253
targetPort: 9253
selector:
k8s-app: node-local-dns
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment