Kubernetes学习笔记-1:在CentOS7上搭建简易Kubernetes Cluster


随着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

 

今天就写到这里吧。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM