Я создаю небольшие кластеры с ansible, и у меня тоже была эта проблема.
Моим первым решением было именно то, что вы говорите, что не хотите делать ... команда соединения ( Как получить последние две строки из инициализации ansible (register stdout) кластера kubernetes ) Я выбрал другой вариант для простоты, а не для безопасности, так как это было болезненно, потому что мне пришлось изменить разрешения для команды соединения файл после того, как он был скопирован на сервер ansible, чтобы пользователь, которого я запускал playbooks, мог его прочитать ... А если бы я использовал его для второго кластера, команда join изменилась бы, и я бы потерял старый и не могу добавить узлы в предыдущий кластер ... в любом случае.
Мое второе решение, которое мне понравилось больше, таково:
Я создал файл инициализации yml для своих узлов, который включает в себя длинный термин token (не уверен, что у вас возникнут проблемы с долгоживущим токеном), созданный на master. Поэтому, когда я kubeadm init мои узлы, я сначала ansible копия в файле инициализации, а затем init с ним.
ansible фрагменты:
- name: Create the kubernetes init yaml file for worker node
template:
src: kubeadminitworker.yml
dest: /etc/kubernetes/kubeadminitworker.yaml
- name: Join the node to cluster
command: kubeadm join --config /etc/kubernetes/kubeadminitworker.yaml
register: join_output
- debug:
var: join_output.stdout
kubeadmininitworker.yml:
apiVersion: kubeadm.k8s.io/v1beta2
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
file:
kubeConfigPath: /etc/kubernetes/discovery.yml
timeout: 5m0s
tlsBootstrapToken: <token string removed for post>
kind: JoinConfiguration
nodeRegistration:
criSocket: /var/run/dockershim.sock
kubeletExtraArgs:
cloud-provider: external
Где строка токена совпадает с тем, что находится на мастере.
Я также использовал файл инициализации при создании мастера с ansible, который включал мой долгосрочный токен.
master init для справки:
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: <token string removed for post>
ttl: 0s
usages:
- signing
- authentication
nodeRegistration:
kubeletExtraArgs:
cloud-provider: external
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
useHyperKubeImage: false
networking:
serviceSubnet: "10.96.0.0/12"
podSubnet: "172.16.0.0/16"
etcd:
local:
imageRepository: "k8s.gcr.io"
dns:
type: "CoreDNS"
imageRepository: "k8s.gcr.io"
Я делал это некоторое время go - но я считаю, что я просто выполнил команду create token на существующем кластере, скопировал строку токена в два файла init и затем удалил токен из существующего кластера. Пока все хорошо ...