在上一章《kubeadm搭建kubernetes集群之二:创建master节点》的实战中,我们把kubernetes的master节点搭建好了,本章我们将加入node节点,使得整个环境可以部署应用;


复制文件

如下图所示,cent7是我们上一章操作完成后对应的CentOS7的VMware文件夹,node1、node2都是直接复制cent7文件夹再粘贴生成的;

kubernetes中master节点主要负责 kubernetes增加节点_docker

启动

请参照《kubeadm搭建kubernetes集群之二:创建master节点》中的操作,用VMware将node1文件夹中的虚拟机文件打开,再改名为node1,然后启动虚拟机;

修改hostname再重启node1

等node1启动完毕,进入系统,修改/etc/hostname文件,这里面只有一行内容“localhost.localdomain”,改成"node1",保存后重启node1;

设置kubelet服务自启动

执行以下命令设置kubelet自启动:

systemctl enable kubelet

以node身份加入kubernetes集群

在上一章《kubeadm搭建kubernetes集群之二:创建master节点》的实战中,我们初始化master完成后控制台输出了以下信息:

kubeadm join –token 4fccd2.b0e0f8918bd95d3e 192.168.119.132:6443

如果您不记得上述信息了也没关系,在master上执行命令kubeadm token list,就能看到token参数了,如下图所示:

kubernetes中master节点主要负责 kubernetes增加节点_docker_02

现在我们要将当前的node1加入到master所在的kubernetes集群中,在node1的控制台输入kubeadm join --token=4fccd2.b0e0f8918bd95d3e 192.168.119.132:6443,(注意,这里的参数是–token=,不是控制台提示的-token )控制台显示信息如下:

kubernetes中master节点主要负责 kubernetes增加节点_kubernetes_03

如上图所示,提示连接失败了,在master和node1上依次执行以下命令,把防火墙全部关闭调:

systemctl stop firewalld;systemctl disable firewalld;setenforce 0

再试一次,在node1的控制台输入kubeadm join --token=4fccd2.b0e0f8918bd95d3e 192.168.119.132:6443,控制台显示信息如下:

kubernetes中master节点主要负责 kubernetes增加节点_docker_04

如上图所示,控制台的输出信息提示当前node已经加入到集群中了;

注意kubeadm join命令的格式

在上一章《kubeadm搭建kubernetes集群之二:创建master节点》中,执行完master的init操作后,控制台输出的node加入的提示信息如下:

kubeadm join –token 4fccd2.b0e0f8918bd95d3e 192.168.119.132:6443

此时如果执行上述命令,有可能会提示下面这个错误(我用这个命令的时候,结果node1加入成功,但是node2加入失败了,报错信息就是下面的):

[root@node1 ~]# kubeadm join –token 4fccd2.b0e0f8918bd95d3e 192.168.119.132:6443
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[preflight] Running pre-flight checks
[preflight] WARNING: docker version is greater than the most recently validated version. Docker version: 17.05.0-ce. Max validated version: 1.12
[preflight] WARNING: hostname "node1" could not be reached
[preflight] WARNING: hostname "node1" lookup node1 on 192.168.119.2:53: no such host
[validation] WARNING: kubeadm doesn't fully support multiple API Servers yet
[discovery: Invalid value: "": DiscoveryToken or DiscoveryFile must be set, discovery: Invalid value: "": token [""] was not of form ["^([a-z0-9]{6})\\.([a-z0-9]{16})$"], discovery: Invalid value: "": token must be of form '[a-z0-9]{6}.[a-z0-9]{16}', discovery: Invalid value: "–token": address –token: missing port in address, discovery: Invalid value: "4fccd2.b0e0f8918bd95d3e": address 4fccd2.b0e0f8918bd95d3e: missing port in address]

发生这个问题的时候,执行下面的命令就可以成功了:

kubeadm join --token=4fccd2.b0e0f8918bd95d3e 192.168.119.132:6443

检查node1状态

在master的控制台上,执行以下命令查看所有节点的状态:

kubectl get node

得到的列表信息如下图所示,node1节点的状态是"NotReady":

kubernetes中master节点主要负责 kubernetes增加节点_kubadm_05

这是因为node1节点的docker正在拉取镜像导致的,等待大约十分钟,再次执行kubectl get node看到的状态如下图,node1的状态已经正常了:

kubernetes中master节点主要负责 kubernetes增加节点_docker_06

在node1的控制台上执行命令docker images,可以看到已经pull了一些镜像到本地,如下图:

kubernetes中master节点主要负责 kubernetes增加节点_d3_07

加入node2,node3

重复上面的步骤,将node2和node3也加入进来,加入后状态如下图:

kubernetes中master节点主要负责 kubernetes增加节点_d3_08

部署服务

在master节点上执行以下命令,可以创建了一个名字为tomcat的deploy:

kubectl run tomcat001 --image=tomcat:7.0.82-jre7 --replicas=2 --port=8080

这样就创建了有两个副本的tomcat容器,执行kubectl get pod -o wide,看到下图所示:

kubernetes中master节点主要负责 kubernetes增加节点_docker_09

如上图,两个pod分别被分配到了node2和node3上面,此时的状态是ContainerCreating,下载tomcat镜像是要时间的,所以耐心等待几分钟,再一次执行kubectl get pod -o wide,看到下图所示:

kubernetes中master节点主要负责 kubernetes增加节点_docker_10

如上图所示,状态已经变成了Running,并且每个pod都有了内部ip;

我们能看到tomcat001-1395295392-fg1qd这个pod在kubernetes内部环境中的ip是192.168.104.1;
在node2上执行ip addr,我们看到的所有网卡和ip如下所示:

kubernetes中master节点主要负责 kubernetes增加节点_docker_11

如上图红框所示,node2机器的ip也在pod的所在的192.168.104.xxx网段,所以node2是可以直接访问pod上的tomcat服务的,我们在node2系统中打开CentOS自带的firefox浏览器,输入192.168.104.1:8080,是可以成功访问到tomcat的;

在外网访问

在node2上通过pod的地址访问,能证明pod已经正常运行了,但是来自kubernetes环境之外的请求如何才能到达pod上呢?这就需要通过service的方式将deploy的端口暴露出去,执行以下命令创建基于现有deploy的service:

kubectl expose deploy tomcat001 --type=NodePort --target-port=8080

执行了上述命令,就把tocamt001的8080端口和node2、node3的端口做了绑定,绑定关系可以通过如下命令查看:

kubectl get svc tomcat001

得到信息如下图:

kubernetes中master节点主要负责 kubernetes增加节点_docker_12

上图红框中的8080:32425表示将tomcat001服务的8080端口和node2、node3的32425端口建立了映射关系;

node2的ip是192.168.119.143,因此在windows上打开浏览器,输入
http://192.168.119.143:32425,即可访问到kubernetes集群中的tomcat服务,如下图所示:

kubernetes中master节点主要负责 kubernetes增加节点_d3_13

至此,整个kubeadm搭建kubernetes集群的实战就结束了,希望能对您在部署和体验kubernetes集群的时候提供有用的参考;