Kubernetes theory
March 24, 2023

Pod hostname, subdomain

При создании пода, в hostname контейнера прописывается имя пода. Но не всегда это удобно. Название пода может подчиняться одной политике, а hostname другой. Поэтому при создании пода есть возможность указать hostname напрямую.

hostname.

Создадим простой под.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostname1
  namespace: default
spec:
  containers:
  - name: pod-hostnamebb
    image: nginx:latest
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
EOF

И посмотрим что у него в hostname.

kubectl exec --tty --stdin pod-hostname1 — /bin/bash
hostname
pod-hostname1

Имя точно такое же, как и у пода.

Во втором примере укажем кастомный hostname.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostname2
  namespace: default
spec:
  containers:
  - name: pod-hostnamedd
    image: nginx:latest
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
  hostname: mynginx
EOF
kubectl exec --tty --stdin pod-hostname2 — /bin/bash
hostname
mynginx

В выводе hostname то имя, которое мы ему передали.

subdomain.

К подам и сервисам можно обратиться с помощью FQDN.

Стандартная схема записи у пода: "hostname.namespace.pod.cluster.local"
С использованием сабдомена: "hostname.subdmain.namespace.pod.cluster.local"

Стандартная схема записи у сервиса: "hostname.namespace.svc.cluster.local"
С использованием сабдомена: "hostname.subdmain.namespace.svc.cluster.local"

Сабдомен позволяет разграничить поды с помощью FQDN.

Пример. Создадим три пода.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cam-nginx
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
  hostname: mynginx
  subdomain: web
EOF
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cam-redis
  namespace: default
  labels:
    app: redis
spec:
  containers:
  - name: redis
    image: redis:latest
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
  hostname: myredis
  subdomain: db
EOF
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cam-redis2
  namespace: default
  labels:
    app: redis
spec:
  containers:
  - name: redis2
    image: redis:latest
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
  hostname: myredis2
EOF

Как это работает?

kubectl exec --tty --stdin cam-nginx -- /bin/bash
cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.11.0.22	mynginx.web.default.svc.cluster.local	mynginx
kubectl exec --tty --stdin cam-redis -- /bin/bash
cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.11.0.155	myredis.db.default.svc.cluster.local	myredis
#В этом поде не был указан сабдомен
kubectl exec --tty --stdin cam-redis2 -- /bin/bash
cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.11.0.48	myredis2