使用kubeadmin部署一套单Master节点的k8s集群

一、前置知识

1.1.生产环境可部署kubernetes集群的两种方式

目前生产环境部署kubernetes集群主要有两种方式:kubeadm、二进制包。
这里采用kubeadm的方式搭建集群。

1.1.1.kubeadm

  1. kubeadm是一个k8s部署工具,根据kubeadm init和kubeadm join,用于快速部署kubernetes集群。
  2. kubeadm工具的功能有:
  3. kubeadm init:初始化一个Master节点。
  4. kubeadm join:将工作节点加入集群。
  5. kubeadm upgrade:升级k8s版本。
  6. kubeadm token:管理kubeadm join使用的令牌。
  7. kubeadm reset:清空kubeadm init或者kubeadm join对主机所做的任何更改。
  8. kubeadm version:打印kubeadm版本。
  9. 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

注意:

  1. kubelet、kubeadm、kubectl他们三的版本号必须一致。
  2. 这里设置kubelet开机启动即可,此时不用启动kubelet,因为Node节点在没有加入k8s集群前,kubelet无法启动。
  3. 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应该有:

  1. kube-apiserver-k8s-master
  2. kube-scheduler-k8s-master
  3. etcd-k8s-master
  4. kube-controller-manager-master
  5. kube-proxy
  6. coredns
  7. calico-kube-controllers
  8. 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未执行完成,提示失败

可能的原因有:

  1. 系统不满足,例如服务器配置低、sway没关闭
  2. 同时建议服务器安装安装后,对相关软件版本进行升级:
    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:

posted @ 2022-09-08 17:57  juchengchao  阅读(1032)  评论(0)    收藏  举报