Kubeadm: no hay forma programática de obtener el token de descubrimiento ca hash

Creado en 12 ene. 2018  ·  11Comentarios  ·  Fuente: kubernetes/kubeadm

Si está creando un token, a través de kubeadm token create ... o cualquier otro mecanismo, no hay forma de obtener el hash del certificado de token ca fuera de intentar analizar la salida legible por humanos (y por lo tanto no estable) de kubeadm init. Debería haber una forma legible por máquina de crear tokens con ca hashes, de lo contrario, uno se ve obligado a usar --discovery-token-unsafe-skip-ca-verify incluso si se desea hacer lo correcto (tm). Atm, las alternativas son analizar la salida de lectura humana que probablemente cambiará de kubeadm init o volver a implementar el cálculo hash de kubeadm sobre el ca. el último no sería tan malo si no requiriera leer la fuente, ya que no es tan simple, es decir, ninguna de las salidas de cd / etc / kubernetes / pki && sha256sum * muestra el mismo sha que la salida de kubeadm init.

kinfeature prioritbacklog

Comentario más útil

¿Ha probado la versión reciente de kubeadm?

# kubeadm token create --print-join-command
kubeadm join --token 5d2dc8.3e93f8449167639b 10.0.2.66:6443 --discovery-token-ca-cert-hash sha256:44a68d4a2c2a86e05cc0d4ee8c9c6b64352c54e450021331c483561e45b34388

Todos 11 comentarios

¿Ha probado la versión reciente de kubeadm?

# kubeadm token create --print-join-command
kubeadm join --token 5d2dc8.3e93f8449167639b 10.0.2.66:6443 --discovery-token-ca-cert-hash sha256:44a68d4a2c2a86e05cc0d4ee8c9c6b64352c54e450021331c483561e45b34388

todavía no es genial: cualquiera que intente usar esto programáticamente tendrá que analizar el comando para extraer tanto el token como el hash del token de descubrimiento. Sería mejor si pudiéramos especificar un formulario de salida como json para que podamos analizarlo de forma segura

gracias, no me di cuenta de que había un comando nuevo / separado para esto. Estoy de acuerdo, sería mejor tener esto en json. mi flujo de trabajo anterior para 1.6 y 1.7, era kubeadm token generate, y luego reutilizaba ese valor al iniciar y unirse, el kubeadm token generate era una línea de valor único legible por máquina delimitada, pero ahora es efectivamente un comando muerto ya que carece de cert hash (y no extensible per se debido a ese formato). Por qué es legible por máquina, tengo parámetros adicionales para pasar por la combinación y algunos que necesito reemplazar como dns para la ip.

Sí, tuve que volcar el comando join-command en un archivo, y luego usar sed para agregar un indicador de ignorar-pre-vuelo-errores, no horrible pero tampoco particularmente amigable.

Por lo tanto, hay un esfuerzo continuo para recortar las fases para hacerlo más programático y eliminar las banderas, esta es solo una historia de usuario. @fabriziopandini , ¿tienes un problema con los padres por esto en alguna parte?

@timothysc
El problema para las fases de graduación es el # 454, pero está un poco desactualizado y podría tener sentido comenzar con uno nuevo tan pronto como se apruebe el próximo KEP.

Sin embargo, con respecto a este problema, en mi opinión deberíamos abrir un problema de paraguas dedicado para abordar la demanda de salida legible por máquina de una manera consistente en todos los comandos, porque la solicitud se extiende desde kubeadm init/phases a kubeadm token y también kubeadm upgrade (ver # 494).

WDYT? si está bien para usted, abriré el nuevo número de paraguas ...

Acabo de abordar este problema yo mismo. Pude calcular el sha256sum de la clave pública de ca cert usando lo siguiente:

$ openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -pubkey | openssl rsa -pubin -outform DER 2>/dev/null | sha256sum | cut -d' ' -f1

No es bonito...

Utilizo las expresiones regulares. Probé con Ansible.

- hosts: localhost
  tasks:
    - shell: kubeadm token create --print-join-command
      register: results
    - debug:
        var: results.stdout
    - set_fact:
        token: "{{ results.stdout | regex_search(regexp, '\\2') | first }}"
      vars:
        regexp: '([^\s]+\s){4}([^\s]+)'
    - debug:
        var: token
    - set_fact:
        hash: "{{ results.stdout | regex_search(regexp, '\\2') | first }}"
      vars:
        regexp: '([^\s]+\s){6}([^\s]+)'
    - debug:
        var: hash

Resultado:

TASK [debug] *******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "results.stdout": "kubeadm join 192.168.1.2:6443 --token 3a0fje.octau87o6x30dz8i --discovery-token-ca-cert-hash sha256:1fd18093fb89b364879d5667b7ec84fd24171c30de0070deb6a3801b54a0f85c"
}

TASK [set_fact] ****************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] *******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "token": "3a0fje.octau87o6x30dz8i"
}

TASK [set_fact] ****************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] *******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "hash": "sha256:1fd18093fb89b364879d5667b7ec84fd24171c30de0070deb6a3801b54a0f85c"
}

Cerrando ya que hay varias soluciones.

Esto no se recomienda, pero en https://github.com/cablespaghetti/kubeadm-aws/blob/master/worker.sh#L45 --discovery-token-unsafe-skip-ca-verification también funciona

en Azure, usando etiquetas para recursos de trabajadores y maestros:
rg es una variable con el nombre RG

masterPrivateIp = $ (az network nic list -g $ rg --query "[? tags.module == 'k8smasters']. ipConfigurations [0] .privateIpAddress" -o tsv)
tokenId = $ (ssh $ masterIp "lista de tokens kubeadm | grep -v TOKEN | cut -d '' -f1")
tokenSHA = $ (ssh $ masterIp "openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -pubkey | openssl rsa -pubin -outform DER 2> / dev / null | sha256sum | cut -d '' -f1 ")

joinCommand = "kubeadm join $ master PrivateIp: 6443 --token $ tokenId --discovery-token-ca-cert-hash sha256: $ tokenSHA"

para ip en $ (az network public-ip list -g $ rg --query [? tags.module == 'k8sworkers']. ipAddress -o tsv)
hacer
ssh $ ip $ joinCommand
hecho

¿Fue útil esta página
0 / 5 - 0 calificaciones