סקירה כללית
במאמר הזה מוסבר איך לפרוס DaemonSet עם הרשאות בכל צומת של Google Distributed Cloud כדי לשנות את הפרמטרים של kubelet ולהפעיל יציאות לקריאה בלבד. בגרסה 1.16 ואילך, יציאת kubelet לקריאה בלבד מושבתת כברירת מחדל.
דרישות מוקדמות
לפני שמריצים את סקריפט התיקון הבא, צריך לוודא ש-Google Distributed Cloud תקין. אתם יכולים להשתמש בפתרון הזה כדי לתקן אשכולות אדמין ואשכולות משתמשים בגרסה 1.16 ומעלה.
יצירת קובץ DaemonSet
יוצרים ושומרים קובץ DaemonSet בשם patch.yaml בספרייה הנוכחית, עם התוכן הבא:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: onprem-node-patcher
namespace: kube-system
spec:
selector:
matchLabels:
name: onprem-node-patcher
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
name: onprem-node-patcher
spec:
tolerations:
- operator: Exists
volumes:
- name: host
hostPath:
path: /
hostPID: true
initContainers:
- name: read-only-patcher
image: "ubuntu"
env:
- name: KUBELET_READONLY_PORT
value: "10255"
# Number of 1G hugepages. Update the value as desired.
command:
- /bin/bash
- -c
- |
set -xeuo pipefail
configfile="/host/var/lib/kubelet/config.yaml"
kubeletservice="/host/etc/systemd/system/kubelet.service"
# $1: The read-only port for the kubelet to serve on with no
# authentication/authorization (set to 0 to disable)
function set-readonly-port-in-config() {
[[ "$#" -eq 1 ]] || return
local readonlyport; readonlyport="$1"
local actual; actual="$(grep readOnlyPort "${configfile}")"
if [[ "${actual}" == "" ]]; then
echo "readOnlyPort: ${readonlyport}" >> "${configfile}"
else
sed -E -i 's/readOnlyPort: [0-9]+/readOnlyPort: '"${readonlyport}"'/g' ${configfile}
fi
echo "Successfully append readOnlyPort: ${readonlyport} to ${configfile}"
}
sed -E -i 's/--read-only-port=[0-9]+/--read-only-port='"${KUBELET_READONLY_PORT}"'/g' ${kubeletservice}
[[ -f ${configfile} ]] && set-readonly-port-in-config "${KUBELET_READONLY_PORT}"
echo "Restarting kubelet..."
chroot /host nsenter -a -t1 -- systemctl daemon-reload
chroot /host nsenter -a -t1 -- systemctl restart kubelet.service
echo "Success!"
volumeMounts:
- name: host
mountPath: /host
resources:
requests:
memory: 5Mi
cpu: 5m
securityContext:
privileged: true
containers:
- image: gcr.io/google-containers/pause:3.2
name: pause
# Ensures that the pods will only run on the nodes having the correct
# label.
nodeSelector:
"kubernetes.io/os": "linux"
עדכון מספר היציאה לקריאה בלבד
כדי לשנות את מספר היציאה, צריך לערוך ידנית את משתנה הסביבה
KUBELET_READONLY_PORTבקובץ ה-YAML של DaemonSet.יציאת ברירת המחדל לקריאה בלבד היא
10255, ואסור לבחור ביציאה10250כי היא תתנגש עם היציאה המאובטחת שהוגדרה מראש.
החלת תיקון על אשכול האדמין
kubectl apply -f patch.yaml \
--kubeconfig ADMIN_CLUSTER_KUBECONFIG
תיקון של אשכול המשתמשים
kubectl apply -f patch.yaml \
--kubeconfig USER_CLUSTER_KUBECONFIG
שחזור
כדי להשבית את היציאה לקריאה בלבד, צריך לערוך ידנית את משתנה הסביבה
KUBELET_READONLY_PORTבקובץ ה-YAML של DaemonSet.אחרי ששומרים את השינויים, ה-DaemonSet יופעל מחדש כדי לשנות את kubelet בהתאם.
נקודות שחשוב לדעת
לתיקון הזה יש את אותו מחזור חיים כמו לאפליקציות צד שלישי שהתקנתם. אפשר להריץ אותו בכל שלב כפעולה ביום השני. אבל יכול להיות שהיא לא תישמר אחרי שתיצרו מחדש את האשכול. כדי שהשינוי הזה יישמר, צריך לפרוס את DaemonSet כשלב בפעולה שלאחר האתחול של Google Distributed Cloud.
אחרי ההרצה הראשונה, צריך לשנות את קובץ התצורה של kubelet ולטעון אותו מחדש. אפשר להריץ את הפקודה
kubectl delete -f patch.yamlבבטחה כדי לנקות את משאבי DaemonSet.Google Distributed Cloud שפועל ב-Windows לא תומך בתיקון הזה.
Kubernetes לא מבצעת בדיקות אימות או הרשאה ביציאה הלא מאובטחת הזו
10255. הפעלת ההגדרה הזו תשאיר את נתוני kubelet לא מוגנים וחשופים למשתמשים לא מורשים. ה-kubelet משרת את אותה נקודת קצה ביציאה10250המאובטחת יותר והמאומתת, לכן כדאי להעביר את התעבורה ליציאה המאובטחת הזו.