-
Cree un nuevo espacio de nombres:
Nota: Sustituya example-namespace por el nombre del espacio de nombres.
apiVersion: v1
kind: Namespace
metadata:
name: "example-namespace"
labels:
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/warn: restricted
-
Use la imagen de BusyBox para crear un despliegue de muestra:
Nota: Sustituya example-deployment-name por el nombre de su implementación y example-namespace por el nombre de su espacio de nombres.
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment-name
namespace: example-namespace
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
dnsPolicy: Default
enableServiceLinks: false
automountServiceAccountToken: false
securityContext:
seccompProfile:
type: RuntimeDefault
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
containers:
- name: busybox
image: public.ecr.aws/docker/library/busybox:latest
command: ["/bin/sh"]
args:
- "-c"
- |
echo "<html><body><h1>PodName: $MY_POD_NAME NodeName: $MY_NODE_NAME podIP:$MY_POD_IP</h1></body></html>" > /tmp/index.html;
while true; do
printf 'HTTP/1.1 200 OK\n\n%s\n' $(cat /tmp/index.html) | nc -l -p 8080
done
ports:
- containerPort: 8080
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
resources:
limits:
memory: "128Mi"
cpu: "500m"
requests:
memory: "64Mi"
cpu: "250m"
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
-
Exponga el despliegue como un tipo de servicio ClusterIP y, a continuación, agregue service.kubernetes.io/topology-mode: auto como anotación:
Nota: Sustituya example-service-name por el nombre de su servicio y example-namespace por el nombre de su espacio de nombres. En la versión 1.27 o posterior, la anotación service.kubernetes.io/topology-aware-hints: auto se cambia a service.kubernetes.io/topology-mode: auto.
apiVersion: v1
kind: Service
metadata:
name: example-service-name
namespace: example-namespace
annotations:
service.kubernetes.io/topology-mode: auto
spec:
selector:
app: demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
-
Compruebe si los TAH se han completado en el punto de enlace:
Nota: Sustituya example-namespace por el nombre de su espacio de nombres y example-service-name por el nombre de su servicio.
kubectl get 'endpointslices.discovery.k8s.io' -l kubernetes.io/service-name=example-service-name -n example-namespace -o yaml
Resultado de ejemplo:
endpoints:
- addresses:
- 10.0.21.125
conditions:
ready: true
serving: true
terminating: false
hints:
forZones:
- name: eu-west-1b
nodeName: ip-10-0-17-215.eu-west-1.compute.internal
targetRef:
kind: Pod
name: example-deployment-name-5875bbbb7c-m2j8t
namespace: example-namespace
uid: 4e789648-965e-4caa-91db-bd27d240ea59
zone: eu-west-1b
-
Implemente un pod de prueba para comprobar si el tráfico se dirige a un pod en la misma zona de disponibilidad.
Nota: Sustituya example-node-name por el nombre de su nodo.
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot --overrides='{"spec": { "nodeSelector": {"kubernetes.io/hostname":"example-node-name"}}}'
-
Busque el pod y el nodo a los que se conecta su pod de prueba:
curl example-service-name.example-namespace:80
Resultado de ejemplo:
PodName: 7b7b9bf455-c27z9 HTTP/1.1 200 OK
NodeName: ip-10-0-9-45.eu-west-1.compute.internal
HTTP/1.1 200 OK
podIP: example-10.0.11.140
-
Utilice PodName y NodeName del resultado anterior para comprobar si el tráfico se alinea con la misma zona de disponibilidad en la que está implementado el pod de prueba.
-
Escale el despliegue a cuatro réplicas y, a continuación, inspeccione los valores EndpointSlices:
Nota: Sustituya example-namespace por el nombre de su espacio de nombres y example-deployment-name por el nombre de su despliegue.
kubectl -n example-namespace scale deployments example-deployment-name --replicas=4
Nota: Un despliegue que se escala a cuatro réplicas da como resultado al menos una zona de disponibilidad con una proporción del 50 % de puntos de enlace. Además, se supera el umbral de sobrecarga del 20 % y los TAH no se utilizan para kube-proxy.