解决阿里云ECS下kubeadm部署k8s没法指定公网IP

背景

通常状况下,"kubeadm"部署集群时指定"--apiserver-advertise-address=<public_ip>"参数,便可在其余机器上,经过公网ip join到本机器,然而,阿里云ecs里没配置公网ip,etcd会没法启动,致使初始化失败。node

环境、工具

阿里云ECS学生机、ECS对应的公网ip、kubeadm1.15.四、kubelet1.15.四、kubectl1.15.四、ubuntu18.04.三、linux4.15.0-66-generic、docker18.9.7linux

步骤

准备

该实现须要在kubeadm初始化过程当中对etcd进行修改,而kubeadm初始化是阻塞的,所以,须要创建两个ssh对话,即用ssh工具新建两个标签,一个用来初始化节点,另外一个在初始化过程当中修改配置文件。注意是初始化过程当中,每次运行kubeadm init,kubeadm都会生成etcd的配置文件,若是提早修改了配置文件,在运行kubeadm init时会把修改的结果覆盖,那么也就没有做用了。
docker

运行kubeadm

输入命令"kubeadm init --kubernetes-version=<your_versin> --apiserver-advertise-address=<public_ip>"

此时会卡在ubuntu

[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.

修改etcd.yaml

在输入上述命令后,kubeadm即开始了master节点的初始化,可是因为etcd配置文件不正确,因此etcd没法启动,要对该文件进行修改。
文件路径"/etc/kubernetes/manifests/etcd.yaml"。api

修改前

修改后

此处"xxx"为公网ip,要关注的是"--listen-client-urls"和"--listen-peer-urls"。须要把"--listen-client-urls"后面的公网ip删除,把"--listen-peer-urls"改成本地的地址。bash

链接master节点

稍等片刻以后,master节点就初始化好了

拷贝"root"后面的链接token,在其余服务器,如腾讯云或阿里云ecs上就能够join这台master。

此时再安装好网络插件便可
服务器

过程记录

  1. 当指定"--apiserver-advertise-address"为公网ip时,kubeadm会在"[kubelet-check] Initial timeout of 40s passed."后卡很长时间,而后提示说初始化失败:
    网络

  2. 查看kubelet日志,未发现有价值的错误提示。因而进行了第二次尝试,并新建了一个ssh对话,用来查看在初始化的时候docker容器的状态。ssh

  3. 发现etcd的容器处于退出状态:
  4. 因而对该容器打个log:

    显示没法指定ip,ip为公网ip
  5. 查看kubeadm生成的etcd配置文件,"xxx"为个人公网ip:

    发现kubeadm自动把"--listen-peer-urls"改成了kubeadm初始化时指定的"--apiserver-advertise-address",即公网ip,并且"--listen-client-urls=",后面也加上了公网ip。这两个参数大概意思是指定要监听的ip地址,而阿里云学生机ecs的网卡没有配置公网ip,所以就没法指定该ip,致使etcd没法正常启动。对其进行修改便可,经测试,worker node 能够经过指定的公网ip join到master node,能够完成项目部署。
    工具

相关文章
相关标签/搜索