[[文章索引]] [[K8s 系列]]

系列文章

环境准备

安装虚拟机软件

安装 Virtualboxopen in new windowExtension Packopen in new window

我们将会使用 Virtualbox 部署 K8S 集群的master和一个node。

安装 Extension Pack 的目的是使用 Headless 模式启动虚拟机,方便后续在宿主机使用终端 ssh 通信操作。

安装OS

本文选择了 CentOS7open in new window

虚拟机属性上,分配 4核 CPU 和 4g 内存,网络使用桥接模式。

设置转发端口的目的是为了后续 ssh 连接到虚拟机。

启动虚拟机,选择镜像,按照提示安装操作系统。

这里假设我们把虚拟机 OS 的管理员命名为 yuchanns 。

关闭 swap 和开启 ssh 服务

进入虚拟机 OS ,注意 下面的操作都在虚拟机的 Shell 中执行的。

K8S 官方建议关闭 swap 分区,这里我们选择关闭,免得后续安装 K8S 时出现警告提示。

先执行 sudo swapoff -a 关闭分区,然后去掉 /etc/fstab 中对 swap 的加载(注意! 是注释 /dev/mapper/centos-swap swap 这一行配置,而不是删除掉文件本身)。

#
# /etc/fstab
# Created by anaconda on Sat Apr  3 15:13:29 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=56bde1b4-7b8d-4b1d-ac9f-51975adefa6e /boot                   xfs     defaults        0 0
# 注释下面这一行
# /dev/mapper/centos-swap swap                    swap    defaults        0 0

上面这一步操作也可以使用 sudo sed -i '/swap/ s/^/#/' /etc/fstab && sudo swapoff -a 代替。

接着设置 ssh 服务的配置文件 /etc/ssh/sshd_config ,主要是"设置监听端口、允许 root 登录和允许账号密码登录"。

# /etc/ssh/sshd_config 关键配置
Port 22 # 取消注释
#AddressFamily any
ListenAddress 0.0.0.0 # 取消注释
ListenAddress :: # 取消注释
# 省略
PermitRootLogin yes # 取消注释
# 省略
PasswordAuthentication yes # 取消注释

启动服务并使用 systemctl 设置开机启动。

sudo service sshd start
sudo systemctl enable sshd.service

关闭防火墙服务和禁用 SELinux 。

sudo systemctl disable firewalld
sudo systemctl stop firewalld
sudo setenforce 0

启用 bridge-nf-call-iptables

sudo echo 'net.bridge.bridge-nf-call-iptables = 1' >> /etc/sysctl.conf

Headless 模式

在关闭虚拟机之前,执行 ifconfig 获取到虚拟机的 ip,例如 master 为192.168.31.207, node 为192.168.31.17 关闭虚拟机。

接下来我们通过 Headless 模式启动虚拟机,并在终端使用 ssh 操作 OS 。

注意 下面这段 Shell 命令是在宿主机的终端上执行的。

❯ VBoxManage list vms
"x86" {e1f31c26-84e8-496e-93ce-5cb843368ad4}
"CentOS7-master" {45d4e304-704d-4835-9816-58465a1ce4f7}
❯ VBoxHeadless -s CentOS7-master
Oracle VM VirtualBox Headless Interface 6.1.18
(C) 2008-2021 Oracle Corporation
All rights reserved.


这样虚拟机就在后台启动了。

在宿主机的新终端中执行 ssh [email protected]虚拟机ip ,连接上虚拟机。

下面没有特殊说明,全都是在宿主机终端的 ssh 通信中操作。

安装 Docker

这一部分直接参考阿里云的 Docker CE 镜像源站open in new window 手册操作。

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

安装完成之后,使用阿里云的 容器镜像服务open in new window 设置 Docker 使用国内镜像源并重启docker刷新配置以及设置开机启动。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://你申请的镜像源.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

安装 K8S 工具

安装 Kubeadm 工具,并预先拉取 K8S 相关的镜像。

首先配置 yum 国内源,创建 /etc/yum.repos.d/kubernetes.repo 写入如下内容。

[kubernetes]
name=Kubernetes Repository
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0

开始安装 kubelet 、 kubeadm 和 kubectl 等 K8S 工具。

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

设置 kubelet 开机启动。

systemctl enable kubelet && systemctl start kubelet

配置 Kubeadm 和拉取镜像

首先执行 sudo kubeadm config print init-defaults > init.default.yaml 获取默认的初始化参数文件。

然后参照该文件创建 init-config.yaml ,定制镜像仓库为阿里云仓库(默认使用的是 k8s.gcr.io)。

apiVersion: kubeadm.k8s.io/v1beta2
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.0

使用配置文件拉取安装 K8S 需要的镜像。

sudo kubeadm config images pull --config=init-config.yaml
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.20.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.20.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.20.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.20.0
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.2
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.4.13-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:1.7.0

到这里,关闭虚拟机,然后生成快照,以便后续如果有需要可以快速恢复备份,并复制一份命名为 node 。

然后更改两份虚拟机的 hostname,分别命名为 yuchanns-masteryuchanns-node-1

hostnamectl set-hostname yuchanns-master

安装 K8S

Master

我们先启动 master 虚拟机,安装 K8S Master 。

sudo kubeadm init --config=init-config.yaml

片刻后得到如下输出。

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.31.207:6443 --token hx8f96.5yh392lco45qkd94 \
    --discovery-token-ca-cert-hash sha256:cb21467e644298e460e0db036e0472bdce9d87bb5beba6e1453d9f3efa8ebe48

上面的片段告诉我们作为普通用户应该执行的一些命令(如果不执行,将无法使用 kubelet 正确与集群通信),以及 node 集群如何加入 master 的方法。

按照提示,执行命令。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Node

启动 node 虚拟机,安装 K8S Node 。

这里我们根据安装 Master 时得到的加入提示,创建相应的配置文件 join-config.yml

apiVersion: kubeadm.k8s.io/v1beta2
kind: JoinConfiguration
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.31.207:6443
    token: hx8f96.5yh392lco45qkd94
    unsafeSkipCAVerification: true
  tlsBootstrapToken: hx8f96.5yh392lco45qkd94

然后执行 sudo kubeadm join --config=join-config.yml

安装成功!

安装网络插件

master 需要安装网络插件, 这里使用 waves 。

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

然后执行 kubectl get nodes 看到所有集群状态都为 Ready 。

NAME              STATUS   ROLES                  AGE     VERSION
yuchanns-master   Ready    control-plane,master   11m     v1.20.5
yuchanns-node-1   Ready    <none>                 8m46s   v1.20.5

检查所有 pod 状态是否正常。这里可以看到包括 node 集群的 pod 状态。

kubectl get pods --all-namespaces
NAMESPACE     NAME                                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-7f89b7bc75-2z2lm                  1/1     Running        0          11m
kube-system   coredns-7f89b7bc75-gz26q                  1/1     Running        0          11m
kube-system   etcd-yuchanns-master                      1/1     Running        0          11m
kube-system   kube-apiserver-yuchanns-master            1/1     Running        1          11m
kube-system   kube-controller-manager-yuchanns-master   1/1     Running        0          12m
kube-system   kube-proxy-p2r8v                          1/1     Running        0          9m4s
kube-system   kube-proxy-xjzkp                          1/1     Running        0          11m
kube-system   kube-scheduler-yuchanns-master            1/1     Running        0          11m
kube-system   weave-net-9slcj                           2/2     Running        0          9m4s
kube-system   weave-net-sskbj                           2/2     Running        0          10m

如果存在异常,可以使用 kubectl --namespace=kube-system describe pod <pod_name> 的方式查看错误日志。

若安装失败,也可以通过 sudo kubeadm reset 重置再重新安装。