使用kubeadmin部署一套单Master节点的k8s集群
一、前置知识
1.1.生产环境可部署kubernetes集群的两种方式
目前生产环境部署kubernetes集群主要有两种方式:kubeadm、二进制包。
这里采用kubeadm的方式搭建集群。
1.1.1.kubeadm
- kubeadm是一个k8s部署工具,根据kubeadm init和kubeadm join,用于快速部署kubernetes集群。
- kubeadm工具的功能有:
- kubeadm init:初始化一个Master节点。
- kubeadm join:将工作节点加入集群。
- kubeadm upgrade:升级k8s版本。
- kubeadm token:管理kubeadm join使用的令牌。
- kubeadm reset:清空kubeadm init或者kubeadm join对主机所做的任何更改。
- kubeadm version:打印kubeadm版本。
- kubeadm alpha:预览可用的新功能。
1.1.2.二进制包
从GitHub下载发型版的二进制包,手动部署每个组件,组成kubernetes集群。
1.2.环境准备
我们这里是搭建的学习环境,对服务器的配置建议最小为:2核CPU、2G内存、20G硬盘。
服务器要可以访问外网,会有从网上拉取镜像的需求;如果服务器不能上网,需要提前下载好对应的镜像并导入所有节点。
1.2.1.软件环境
操作系统:Centos 7.9_x64(mini方式安装)
Docker:docker-ce-20
kubernetes:1.21
1.2.2.服务器规划
k8s-master:192.168.23.11
k8s-node12:192.168.23.12
k8s-node13:192.168.23.13
k8s-node14:192.168.23.14
二、操作系统初始化(所有节点执行)
2.1.操作系统的初始化要在所有节点上执行:
#安装所需的系统工具
yum install net-tools vim bind-utils lrzsz yum-utils device-mapper-persistent-data lvm2 wget curl -y
#设置操作系统语言
sed -ri 's/LANG*/#&/' /etc/locale.conf
cat >> /etc/locale.conf << EOF
LANG="en_US.UTF-8"
EOF
#重新加载系统语言
source /etc/locale.conf
#关闭防火墙
systemctl stop firewalld #临时关闭
systemctl disable firewalld #永久关闭
#关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久,重启后生效
setenforce 0 # 临时
#关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 添加hosts解析
cat >> /etc/hosts << EOF
192.168.23.11 k8s-master
192.168.23.12 k8s-node12
192.168.23.13 k8s-node13
192.168.23.14 k8s-node14
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
2.2.分别在每台服务器上设置主机名:
# 根据规划设置主机名设置
hostnamectl set-hostname <hostname>
三、安装docker(所有节点执行)
我们本次学习环境使用docker作为容器引擎。也可以换成别的,例如contained,下面介绍docker的安装。
#配置docker的yum源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#更新yum源缓存
yum makecache fast
#卸载操作系统已安装的旧版docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装docker
yum install -y docker-ce
#注意:此处安装docker-ce-20版本。yum install -y docker-ce-20.10.13
#注意:这里也可以直接执行yum -y install docker-ce安装docker的最新版本
#注意:可以通过yum list docker-ce.x86_64 --showduplicates | sort -r查找docker-ce的版本
#启动docker
systemctl start docker
#设置docker开机启动
systemctl enable docker
#查看docker版本
docker version
#查看docker详细信息
docker info
#配置docker镜像下载加速器,并修改cgroup的驱动
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#重启docker
systemctl restart docker
#查看docker详细信息,验证配置的加速器是否生效
docker info
#查看cgroup的驱动
docker info | grep systemd
四、安装kubeadm、kubelet以及kubectl(所有节点执行)
4.1.添加kubernetes阿里云yum软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
4.2.更新yum源缓存
yum makecache fast
4.3.安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号安装部署:
yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
systemctl enable kubelet
注意:
- kubelet、kubeadm、kubectl他们三的版本号必须一致。
- 这里设置kubelet开机启动即可,此时不用启动kubelet,因为Node节点在没有加入k8s集群前,kubelet无法启动。
- kubectl也可以只在master节点安装,node节点不安装;如果这样子做,后期就是没法在node节点上管理k8s。
五、提前拉取coredns镜像(所有节点执行)
在初始化master前,我们先手动在所有节点上下载CoreDNS镜像,这是因为在kubeadm init时,拉取该镜像的地址有误(上面配置了kubernetes的aliyun镜像地址,通过aliyun的服务器拉取的这个镜像,kubeadm里面写的地址和阿里云的镜像地址不一致),会导致该镜像无法拉取而产生错误,因此我们先提前手动将该镜像拉取下来,并将该镜像的tag修改成kubeadm定义的tag:
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0
docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
六、部署kubernetes Master(master节点执行)
在master节点上(192.168.23.11)执行初始化,部署master节点:
kubeadm init \
--apiserver-advertise-address=192.168.23.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
说明:
--apiserver-advertise-address 集群通告地址,这里填写本master服务器的IP地址。
--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
--kubernetes-version K8s版本,要与上面安装的 kubelet、kubeadm、kubectl的版本一致。
--service-cidr 集群内部虚拟网络,Pod统一访问入口。
--pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致。
初始化完成后,最后会输出一个join命令,先记住,后面Node节点加入master的时候使用。
拷贝kubectl使用的链接k8s认证文件到默认路径:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
七、加入kubernetes Node(所有node节点执行)
在所有node节点上,执行kubeadm初始化完成后输出的join命令,直接执行即可加入kubernetes集群。
kubeadm join 192.168.23.11:6443 --token drt6sj.jb6evemd4x2b0rfx \
--discovery-token-ca-cert-hash sha256:f62781032ec96756a79b4479235c69b158304fd83f4279282d8985bd2aa63968
注意:这里的IP地址、Token以及HASH根据实际情况进行修改
注意:这里使用kubeadm init执行结束后,使用屏幕打印的kubeadm join命令。
默认token有效期为24小时,当过期之后该token就不可用了;这时就需要重新创建token,可以直接使用命令快捷生成:
kubeadm token create --print-join-command
此时可以在master节点上查看k8s的节点:
kubectl get nods
会发现所有的节点都是 NotReady状态,这是因为网络插件还没有部署。
下面进行网络插件的部署。
八、部署容器网络(CNI)(master节点执行)
Calico是一个纯三层的数据中心网络方案,是目前kubernetes主流的网络方案。
8.1.下载Calico的YAML文件
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
注意:如果calico.yaml文件下载不下来,可以直接使用本文档里嵌入的calico.yaml文件。
8.2.修改YAML文件
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。

8.3.部署Calico
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
等Calico Pod都Running,其他Node节点就会进入Ready状态。
注意:以后所有的YAML文件都只在master节点执行。
九、完成kubernetews集群安装
在完成kubernetes单master集群安装后,可以看到后台pod都处于running状态,可以使用kubectl get pods -n kube-system命令查看kubernetes集群后台pod的状态,所有pod都应该是Running状态。
如下图所示:

安装完成后,处于Running状态的Pod应该有:
- kube-apiserver-k8s-master
- kube-scheduler-k8s-master
- etcd-k8s-master
- kube-controller-manager-master
- kube-proxy
- coredns
- calico-kube-controllers
- calico-node
使用kubectl get nods命令查看所有服务器节点的运行状态,所有服务器节点都应该是Ready状态。
如下图所示:
![]()
十、测试kubernetes集群
在kubernetes集群中创建一个pod,验证是否正常运行:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
查看创建的pod和server的状态:
kubectl get pod,svc
pod和server状态如下图所示:

使用kubectl get pods -o wide可以查看到当前nginx的pod运行在哪个node节点上,如下图所示:

使用node节点IP,server的端口就可以访问到刚才创建的pod,从查询结果可以得知,当前pos运行在k8s-node12节点上,该节点的IP地址是192.168.23.12,server对外暴露的端口是30362;pod访问结果如下图所示:

十一、常见问题:
11.1.kubeadm init未执行完成,提示失败
可能的原因有:
- 系统不满足,例如服务器配置低、sway没关闭
- 同时建议服务器安装安装后,对相关软件版本进行升级:
yum update -y
注意:如果出现了init失败,修复问题后,要执行kubeadm reset后,再重新执行kubeadm init。
11.2.calico镜像下载失败
使用 grep image calico.yaml 命令查看calico.yaml文件里有需要下载哪些镜像:

使用docker pull命令手动在所有节点上拉取yaml文件里的4个镜像,然后重新部署calico。
kubectl delete -f calico.yaml
kubectl apply -f calico.yaml
11.3.使用kubectl get cs查看到两个组件(controller-manager、scheduler)的状态是Unhealthy,同时该两个组件连接拒绝
使用kubectl get cs命令查看controller-manager和scheduler这两个组件的状态,如下图所示,该两个组件的状态为Unhealthy,同时显示connection refused:

该问题的解决办法只要修改这2个组件的配置文件,将--port参数给注释(使用#号注释):
vim /etc/kubernetes/manifests/kube-controller-manager.yaml

vim /etc/kubernetes/manifests/kube-scheduler.yaml

注释后等待几分钟,再次执行kubectl get cs查看状态,即可看到状态为Healthy:


浙公网安备 33010602011771号