随着Kubernetes在公司内的应用日益广泛,我也不得不赶快补充一下相关知识,否则将会面临无法应对日常工作的窘境。 前些日子算是完成了自学的第一步,在CentOS7 虚拟机上搭建了个最简单的Kubernetes Cluster, 包含一个Master node和两个Worker node。现在将我的搭建经历分享给大家。
基础环境说明
- 主机: MacBookPro
- 虚拟机软件:VirtualBox
- 虚拟机: 1 CPU + 2GB 内存 + 20GB 硬盘空间
- 虚拟机 OS: CentOS-7-x86_64-Minimal-1804.iso
初始化虚拟机
按以上配置创建三个虚拟机,每个虚拟机配置两个网络,一个NAT,一个Host-Only,以便同时支持虚拟机之间的互通,主机与虚拟机之间的互通,以及虚拟机通过主机连接Internet。再从 https://www.centos.org/download/ 下载CentOS 7 的最小安装镜像。启动虚拟机安装CentOS 7,在安装完成后重启。
默认情况下虚拟机网络是Disconnected状态,可使用"nmcli d" 查看:
使用“nmtui”开启网络,并重启虚拟机。之后再使用"nmcli d" 查看,可以看到网络已开启:
此时使用 “ip addr show” 也就可以看到IP地址了。使用 "hostnamectl set-hostname <host name>" 为三个虚拟机设置所需要的机器名。我将其命名为kub-master, kub-node01, kub-node02。
至此,安装操作系统的准备工作就结束了。接下来就可以使用Terminal或者Iterm2等客户端SSH登陆虚拟机了。
安装Kubernetes之前的准备工作
永久关闭Swap。"vi /etc/fstab", 注释掉“/dev/mapper/centos-swap swap”,保存并重启虚拟机。使用 “free -h“, 显示swap都为 0 就对了。
关闭Selinux。 "vi /etc/sysconfig/selinux", 设置“SELINUX=disabled”
使用如下命令关闭防火墙:
systemctl disable firewalld
systemctl stop firewalld”
编辑 /etc/sysctl.conf, 加一行:net.bridge.bridge-nf-call-iptables = 1. 运行"modprobe br_netfilter" 和 “sysctl -p”,输出“net.bridge.bridge-nf-call-iptables = 1”就对了。
运行 "yum install -y docker" 和 “systemctl enable docker && systemctl start docker”安装并启动Docker. 运行“systemctl status docker”查看一下Docker 服务是active(running)状态就行。当前的Docker版本是1.13.1
保险起见,再reboot一下吧。
安装 kubeadm, kubelet 和 kubectl
添加Kubernetes Yum源。运行如下代码:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kube* EOF
如果要使用上述google源的话请自行解决连接问题。如果连不上google源的话可以改为阿里的镜像源:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 EOF
使用yum 安装Kubernetes 组件:
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
如下组件将会被安装:
安装完毕后启动Kubelet:
systemctl enable kubelet && systemctl start kubelet
如果此时使用 "systemctl status kubelet" 查看kubelet 服务状态的话会发现服务状态是 "Active: activating (auto-restart)",这是正常现象,因为此时还没有使用kubeadm做初始化。
最后再跑一下 "yum update -y",更新一下各种package,再重启一下。(这一步可有可无)
至此,对master node和worker nodes的基础配置及软件安装工作已经完成。请确保以上步骤在每一个node上都执行完成。
初始化Master Node
以下操作只在master node 上操作:
初始化master node 就是跑一下"kubeadm init". Kubeadm 在初始化Cluster的时候可以附带许多参数,此处我不指定任何参数,就用其默认值即可。运行成功后会得到如下的输出:
如果使用非root用户启动Cluster,则需要执行如下命令:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果是使用root用户启动Cluster,则可简化为:
export KUBECONFIG=/etc/kubernetes/admin.conf
接下来就是安装Pod Network Plugin。 这一步至关重要,否则Cluster无法正常运作。Pod Network Plugin有很多种可选,我这里就随便选了Weave Net。运行如下指令安装Weave Net:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
最后保留好“kubeadm join ”命令行的内容,这是用于在node上操作将node加入到cluster里。
至此,Master Node 初始化完成,运行 “kubectl get nodes”,应该可以看到如下输出:
在接下来的配置worker node的过程中,可以用如下指令在Master node 的Terminal里监控Cluster里Node数量和状态的变化:
watch -n 2 kubectl get nodes,svc,namespaces
向cluster中添加node
以下操作只在worker nodes 上操作。
运行在之前步骤中保存的 "kubeadm join " 语句,并在worker node上执行,最后得到如下结果说明该worker已经成功注册到master:
重复此操作将所需的worker node上都加入到cluster中。
返回master node查看cluster状态
如果之前在Master Node的Terminal里运行了 “”, 此时应该可以看到Cluster中已将包含了3个node上,其中一个是Master:
至此,最基本的 包含3个 nodes 的 Kubernetes Cluster 就已经初始化完成了。我当时的环境是可以连接google的,所以如果在不能连接google的环境中可能还会遇到某些需要 pull image的步骤过不去或报错的状况。详细错误信息可以用 “tail -f /var/log/message”来查看并有针对性的加以解决。
Master node和 Worker Node之间的路由问题
有时候在将worker node加入到Master node之后,worker node始终处于NotReady状态,并且可以看到对应的Weave-net pod状态异常:
[root@kub-master01 ~]# kubectl get pods -n kube-system | grep weave weave-net-6s47v 2/2 Running 8 28m weave-net-rglfd 1/2 CrashLoopBackOff 1 87s weave-net-zjhm2 2/2 Running 5 35m
这可能是因为worker node上运行的Weave-net pod 因为没有路由所以无法连接到Cluster IP:
[root@kub-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 133m
此时就需要在worker node上加一条路由:
[root@kub-node01 ~]# ip route add <Cluster IP> via <master node IP> dev enp0s3
参考文献
- https://kubernetes.io/docs/setup/independent/install-kubeadm/
- https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
- https://kubernetes.io/docs/reference/setup-tools/kubeadm
今天就写到这里吧。