本文基于Mac平台和Parallels软件,在其中创建三个Ubuntu系统,搭建了一个3个节点(1个master和2个Node)的K8s集群。下面的步骤没有特殊说明,都是需要在所有节点上分别执行的。也可以在一个虚拟机上执行完之后,复制当前虚拟机作为其他节点。
1. 虚拟机基础配置
基于Parallels虚拟机软件,在其中安装三个ubuntu系统,后续用于创建K8s集群的master节点和两个Node节点,三个节点均采用静态ip,具体配置如下:
Master节点:192.168.31.200 master
Node1节点:192.168.31.201 node1
Node2节点:192.168.31.202 node2
配置静态ip
需要在三个节点上分别配置,下面以master为例:
修改虚拟机网络为桥接模式:
设置主机名
在Master节点运行
1 | sudo hostnamectl set-hostname master |
其他节点分别运行
1 | sudo hostnamectl set-hostname node1 |
设置hosts
方便节点之间相互访问,在每个节点的/etc/hosts
上添加如下配置:
1 | 192.168.31.200 master |
配置好之后,试下ping master、node1看能否正常访问。
安装ssh
安装ssh,方便后续连接到虚拟机执行cmd。
1 | sudo apt update |
后续为了方便在多个terminal同时输入command,可以使用iterm同时打开三个窗口,然后输入
cmd + shift + I
进入多个输入的模式,如果需要退出,可以输入⌘Command + ⇧Shift + ⌥Option + I
。
2. Ubuntu系统设置
禁用swap
1 | sudo swapoff -a |
这步之后,最好重启ubuntu系统保证修改生效。
修改内核参数
载入如下内核模块,
1 | sudo tee /etc/modules-load.d/containerd.conf <<EOF |
相关资料参考:
配置下面的网络参数:
1 | sudo tee /etc/sysctl.d/kubernetes.conf <<EOF |
运行下面的command使改动生效:
1 | sudo sysctl --system |
3. 安装containerd
Docker,Kubernetes 等工具来运行一个容器时会调用组件(CRI)比如 containerd,CRI-O来来完成容器的创建、运行、销毁等实际工作。Docker 使用的是 containerd 作为其运行时;Kubernetes 支持 containerd,CRI-O等,这些组件都遵循了 OCI 规范,并通过 runc 来实现与操作系统内核交互来完成容器的创建和运行。
他们之间的相互关系如下:
具体安装步骤如下:
- 安装dependencies:
1 | sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates |
- 添加docker repo:
1 | sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg |
- 安装containerd
1 | sudo apt update |
- 配置containerd使用systemd作为cgroup
1 | containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1 |
- 重启并设置开机自启
1 | sudo systemctl restart containerd |
4. 安装Kubernetes组件
添加apt repo
1 | curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - |
安装Kubectl, kubeadm & kubelet
1 | sudo apt update |
apt-mark 用于将软件包标记/取消标记为自动安装。 hold 选项用于将软件包标记为保留,以防止软件包被自动安装、升级或删除。这里主要是为了防止kubelet等组件自动升级。
5. 初始化Master节点
这步需要在Master节点进行设置,运行如下的节点初始化整个k8s集群。
1 | sudo kubeadm init --control-plane-endpoint=192.168.31.200 |
当看到如下的输出时,说明系统master节点初始化完成。
接着按照提示信息,进行后续的初始化工作:
1 | mkdir -p $HOME/.kube |
完成上面的工作之后,可以尝试运行下面的command来查看当前集群的状态:
1 | kubectl cluster-info |
输入类似如下
6. 加入Node节点
在master节点的初始化输出的最下面,会列出node节点加入的command,直接copy然后到每个node节点运行即可。下面是个例子,得换成实际的command,
1 | sudo kubeadm join 192.168.31.200:6443 --token mjy0xx.95lsse7r7fw5sb00 |
加入成功之后,可以查看当前集群的node状态,此时由于没有安装网络相关插件,所有节点出于NotReady的状态。下一步会进行安装。
1 | kubectl get nodes |
7. 配置集群网络
一般可以安装Calico、Flannel和Weave-net等插件,下面以Calico为例进行操作。
1 | curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O |
输出结果大概如下:
此时可以查看系统namespace下的所有基础组件的运行情况,
1 | kubectl get pods -n kube-system |
接下来检查节点状态:
1 | kubectl get nodes |
至此,整个k8s集群搭建完毕, 下面可以进行一些基本测试。
8. 测试K8s集群
这里部署了一个nginx的app来进行测试,
1 | kubectl create deployment nginx-app --image=nginx --replicas=2 |
查看nginx的状态:
1 | kubectl get deployment nginx-app |
将deployment暴露出去,采用NodePort的方式(这种方式会在每个节点上开放同一个端口,外部可以通过节点ip+port的方式进行访问)
1 | kubectl expose deployment nginx-app --type=NodePort --port=80 |
可以检查service的状态,
1 | kubectl get svc nginx-app |
下面是测试结果:
说明Nginx运行正常,整个k8s节点部署成功。
参考:
本文由『后端精进之路』原创,首发于博客 http://teckee.github.io/ , 转载请注明出处