简介

本文主要介绍基于Ubuntut通过官方社区推出的快速部署kubeneters集群的工具kubeadm来快速搭建k8s集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/

安装条件

在开始之前,部署K8s集群需要做以下环境准备
准备两台虚拟机,这里我用的Ubuntu20.0.5LTS版本

集群角色 服务IP 主机名
控制节点 192.168.32.32 master-k8s
工作节点 192.168.32.32 worker-k8s

机器环境准备

网络配置

这里假设用的是一个新的Liunx Ubuntu环境
首先为虚拟机设置固定服务IP,这里取决于虚拟机工具设置的共享网络"Host-only",这里需要新增网络配置
这里可以参考在Parellels的设置

接着在两个虚拟机中设置固定网络
比如在Master节点的机器上配置网络Method为Manual

最终通过ip addr查看两台机器网卡ip信息

软件安装

网络配置后,安装基本的软件

sudo apt update
sudo apt install -y git vim curl jq

开始安装并启动Docker

sudo apt install -y docker.io     #安装Docker Engine
sudo service docker start         #启动docker服务

另外需要把当前的用户加入 Docker 的用户组,这是因为操作 Docker 必须要有 root 权限,而直接使用 root 用户不够安全,加入 Docker 用户组是一个比较好的选择,这也是 Docker 官方推荐的做法

sudo usermod -aG docker ${USER}   #当前用户加入docker组

执行成功后退出系统重新登录使修改的用户组生效
最终通过执行docker version查看系统信息

如果遇到Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock,refer https://linuxhandbook.com/docker-permission-denied/
退出系统重新登录即可

Docker完成安装后需要对配置进行一点修改,在“/etc/docker/daemon.json”里把 cgroup 的驱动程序改成 systemd ,然后重启 Docker 的守护进程。
daemon.json 内容如下

{  
        "exec-opts": ["native.cgroupdriver=systemd"],  
        "log-driver": "json-file",  
        "log-opts": {    "max-size": "100m"  },  
        "storage-driver": "overlay2",
        "registry-mirrors": ["https://6kx4zyno.mirror.aliyuncs.com","https://registry.docker-cn.com"]
}

修改完成后重启docker daemon

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用“br_netfilter”模块:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF

sudo sysctl --system

接着你需要修改“/etc/fstab”,关闭 Linux 的 swap 分区,提升 Kubernetes 的性能:

sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

安装kubeadm

现在我们就要安装 kubeadm 了,在 Master 节点和 Worker 节点上都需要这么做
kubeadm 可以直接从 Google 自己的软件仓库下载安装,但国内的网络不稳定,很难下载成功,需要改用其他的软件源

sudo apt install -y apt-transport-https ca-certificates curl

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt update

更新完成后,就可以开始下载kubeadm相关的kubeadm、kubelet 和 kubectl工具,默认会下载最新版本,这里指定固定版本

#查看有哪些版本
sudo apt-cache madison kubeadm
#指定版本
sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00

如果需要防止意外升级工具版本,可以锁定相关软件的版本

sudo apt-mark hold kubeadm kubelet kubectl

查看安装信息

kubeadm version

Kubernetes 组件镜像

首先我们需要查看安装kubernetes所需要的镜像列表,其中参数--kubernetes-version可以指定版本号

kubeadm config images list --kubernetes-version v1.23.3

k8s.gcr.io/kube-apiserver:v1.23.3
k8s.gcr.io/kube-controller-manager:v1.23.3
k8s.gcr.io/kube-scheduler:v1.23.3
k8s.gcr.io/kube-proxy:v1.23.3
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6

接着就需要下载k8s相关镜像了,因为kubeadm把apiserver、etcd、scheduler相关组件都打包成了镜像,并以容器的方式启动kubernetes
但是这些镜像的还是在Google自己的仓库,因为众所周知的原因,我们可以从国内镜像网站下载这些镜像

# 镜像下载执行脚本
repo=registry.aliyuncs.com/google_containers

for name in `kubeadm config images list --kubernetes-version v1.23.3`; do

    src_name=${name#k8s.gcr.io/}
    src_name=${src_name#coredns/}

    docker pull $repo/$src_name

    docker tag $repo/$src_name $name
    docker rmi $repo/$src_name
done

下载完成后看下相关镜像信息即可

docker image list

集群配置

基本的软件准备工作完成后,就可以开始进行k8s集群配置了

Master节点

基于kubeadm只需要kubeadm init命令就可以把组件在Master节点上运行起来,不过在这过程中有很多参数来进行集群配置。更多参数可以使用 -h 查看
这里我们主要需要以下参数

  • --pod-network-cidr,设置集群里 Pod 的 IP 地址段。
  • --apiserver-advertise-address,设置 apiserver 的 IP 地址,对于多网卡服务器来说很重要(比如 VirtualBox 虚拟机就用了两块网卡),可以指定 apiserver 在哪个网卡上对外提供服务。
  • --kubernetes-version,指定 Kubernetes 的版本号。

那么在Mater节点上我们执行

sudo kubeadm init \
    --pod-network-cidr=10.244.0.0/16 \
    --apiserver-advertise-address=192.168.32.32 \
    --kubernetes-version=v1.23.3

最终的执行结果

值得注意的是,最后有个重要的执行命令表示其他节点要加入集群必须要用指令里的 token 和 ca 证书

kubeadm join 192.168.32.32:6443 --token 9xx5kx.dyjebdab12bukhja \
	--discovery-token-ca-cert-hash sha256:a7f1d7794e90796ad0a1792fa392e67ce7cd16bbddeb52bb5a3d43a630305c0a 

若果没有记录下来可以使用以下命令查看:

kubeadm token create --print-join-command

安装过程中也会提示接下来所需要执行的操作

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

安装完成后,你就可以使用 kubectl version、kubectl get node 来检查 Kubernetes 的版本和集群的节点状态了

kubectl version
kubectl get node

这时候发现集群节点还是NotReady的状态,因为还缺少网络插件,集群的内部网络还没有正常运作

安装Flannel网络插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

稍等会儿,再使用kubectl get node查看下,发现节点已经是Ready状态

Worker 节点

如果你成功安装了 Master 节点,那么 Worker 节点的安装就简单多了,只需要用之前拷贝的那条 kubeadm join 命令就可以了,记得要用 sudo 来执行

kubeadm join 192.168.32.32:6443 --token 9xx5kx.dyjebdab12bukhja \
	--discovery-token-ca-cert-hash sha256:a7f1d7794e90796ad0a1792fa392e67ce7cd16bbddeb52bb5a3d43a630305c0a 

它会连接 Master 节点,然后拉取镜像,安装网络插件,最后把节点加入集群

现在让我们用 kubectl run ,运行 Nginx 来测试一下:

kubectl run ngx --image=nginx:alpine
kubectl get pod -o wide


可以看到Pod成功运行在了workre节点上