
Eu criei um StatefulSet do Kubernetes. Existem três pods no StatefulSet com nomes mysql-0
, mysql-1
e mysql-2
cada um com um único contêiner.
Se eu "logar" no contêiner no pod mysql-1
e digitar, hostname
recebo a resposta mysql-1
. Contudo, o que euquereré para o contêiner pensar que seu nome de host é mysql-1.example.com
. Em outras palavras, force o nome do host a ter o domínio anexado.
Como faço para que o StatefulSet faça isso acontecer?
Responder1
Conformehttp://man7.org/linux/man-pages/man7/hostname.7.html:
Os caracteres válidos para nomes de host são letras ASCII(7) de a a z, os dígitos de 0 a 9 e o hífen (-). Um nome de host não pode começar com um hífen.
Acima também é válido para subdomínios. Aqui está um regex usado para validação:[a-z0-9]([-a-z0-9]*[a-z0-9])?
No entanto, você pode usar campos hostname:
e subdomain:
em uma definição de pod, conforme descritoaqui
Um ReplicaSet com os campos acima ficaria assim:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: test-replica-set
labels:
app: guestbook
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
hostname: my-hostname
subdomain: my-subdomain
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
name: busybox1
env:
- name: HOSTNAME
value: "whathever.domain.com"
Isso funciona assim:
> kubectl exec test-replica-set-pz2kk -it -- hostname
my-hostname
Você também pode recuperar o nome de domínio DNS adicionando a -d
opção ou o nome FQDN usando a -f
opção. Isso produzirá nomes de domínio K8s para seus pods conforme descritoaqui.
Você também pode injetar variáveis ambientais em um pod e colocar suas informações lá, como fiz no exemplo acima.
> kubectl exec test-replica-set-pz2kk -it -- sh
/ # echo $HOSTNAME
whathever.domain.com