kubeadm快速搭建K8s集群 基于v1.22.2版本

### 一、环境介绍

1.1 kubeadm介绍

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。

kubeadm采用的是容器化部署方式,组件除了kubelet其他都以容器形式启动并运行。

1.2 部署流程

  1. 安装Docker
  2. 使用kubeadm init创建一个Master节点
  3. 使用kubeadm join将一个node节点加入到集群中
  4. 部署容器网络
  5. 部署Web UI

1.3 安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

1.4 k8s运行图示

kubernetes架构图

1.5 环境准备

1.更新内核

k8s对系统内核要求较高,最好使用较新版本的内核,我这里使用的是5.4版本的内核,更新内核操作如下

#查看当前内核版本
uname -r
uname -a
cat /etc/redhat-release 

#添加yum源仓库
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

#更新yum源仓库
yum -y update

#查看可用的系统内核包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

#安装内核,注意先要查看可用内核,我安装的是5.4版本的内核
yum --enablerepo=elrepo-kernel install kernel-lt

#查看目前可用内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

#使用序号为0的内核,序号0是前面查出来的可用内核编号
grub2-set-default 0

#生成 grub 配置文件并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

查看可用的系统内核包,可以看到有5.4跟5.14版本两个内核,我安装的是5.4版本的内核

image-20211026144133319

查看目前可用内核

image-20211026144613034

参考资料:升级内核

2.准备环境

用三台机器,一台master,两台node作为实验环境

角色 IP
k8s-master01 10.154.0.111
k8s-node01 10.154.0.112
k8s-node02 10.154.0.113

以下命令除了设置主机名外,其他所有机器都要设置

#关闭防火墙,selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

#设置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

#在master添加hosts
cat >> /etc/hosts << EOF
10.154.0.111 k8s-master01
10.154.0.112 k8s-node01
10.154.0.113 k8s-node02
EOF

#启用IPv4模块
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

#重启服务器
reboot

二、部署k8s集群

以下操作在所有节点进行,如果使用的xshell工具,可以使用工具-->发送键到所有会话

2.1 安装Docker

这里我安装的是目前最新版本v20.10.9,使用的yum源安装的,也可以二进制安装docker

2.2 安装集群组件

1.添加阿里云YUM软件源

cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo -O /etc/yum.repos.d/epel.repo

2.安装kubeadm,kubelet和kubectl

目前最新版本是1.22.2,我们直接上最新版

yum install -y kubectl-1.22.2 kubelet-1.22.2 kubeadm-1.22.2
systemctl enable kubelet

2.3 部署Master节点

初始化有如下两种方式

方式一:使用kubeadm init命令初始化

在k8s-Master01上执行,报错请看k8s报错汇总

kubeadm init \
--apiserver-advertise-address=10.154.0.111 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
  • --apiserver-advertise-address 集群通告地址
  • --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
  • --kubernetes-version K8s版本,与上面安装的一致
  • --service-cidr 集群内部虚拟网络,Pod统一访问入口
  • --pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致
  • --ignore-preflight-errors=all 忽略一些检查错误

执行完毕后会出现以下内容,第一个框内是将连接集群的配置文件拷贝到默认路径下,第二个框内是加入集群命令kubeadm join,复制该命令在node节点执行就能加入该集群

image-20211022215248384

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

#框二内容
kubeadm join 10.154.0.111:6443 --token dtiqj4.z8xpk6hdio0e4mbu \
	--discovery-token-ca-cert-hash sha256:7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d

:'
kubeadm init初始化工作过程
1、[preflight] 环境检查和拉取镜像 kubeadm config images pull
2、[certs] 生成k8s证书和etcd证书 /etc/kubernetes/pki
3、[kubeconfig] 生成kubeconfig文件
4、[kubelet-start] 生成kubelet配置文件
5、[control-plane] 部署管理节点组件,用镜像启动容器  kubectl get pods -n kube-system
6、[etcd] 部署etcd数据库,用镜像启动容器
7、[upload-config] [kubelet] [upload-certs] 上传配置文件到k8s中
8、[mark-control-plane] 给管理节点添加一个标签 node-role.kubernetes.io/master='',再添加一个污点[node-role.kubernetes.io/master:NoSchedule]
9、[bootstrap-token] 自动为kubelet颁发证书
10、[addons] 部署插件,CoreDNS、kube-proxy
'

方式二:使用配置文件引导

vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.22.2
imageRepository: registry.aliyuncs.com/google_containers 
networking:
  podSubnet: 10.244.0.0/16 
  serviceSubnet: 10.96.0.0/12 

kubeadm init --config kubeadm.conf --ignore-preflight-errors=all  

参考文档:官方中文文档官方英文文档

2.查看效果

此时就能使用kubectl管理集群了,查看集群状态

kubectl get node
docker ps #可以看到集群实际上是拉起了很多容器

可以看到k8s-master01已经在集群中了

可以看到kube-system命名空间中的pod,命名空间跟pod概念以后讲解

2.4 部署Node节点

在k8s-node01跟02上执行

1.将node节点加入集群

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:

kubeadm join 10.154.0.111:6443 --token dtiqj4.z8xpk6hdio0e4mbu \
	--discovery-token-ca-cert-hash sha256:7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token。

2.重新创建token

重新创建token有两种方式

方式一:一次性创建

kubeadm token create --print-join-command

方式二:分批创建

#创建token
$ kubeadm token create
w2ouca.erkyzzbw70xuxoqb

#创建token-ca-cert-hash
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d

#合起来就是加入集群命令
$ kubeadm join 10.154.0.111:6443 --token w2ouca.erkyzzbw70xuxoqb --discovery-token-ca-cert-hash 7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d

#查看token列表
kubeadm token list

3.查看效果

这时node已经加入到集群中了,状态为NotReady是因为没有部署网络插件导致的。

image-20211022230409614

如果报错查看kubelet日志

journalctl -u kubelet >error.log
vim error.log

参考资料:官方文档

2.5 部署容器网络

网络组件有很多种,只需要部署其中一个即可,推荐Calico。

Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。

Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。

此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。

1.下载Calico

目前最新版本为v3.20,按最新版本的来,不怕报错,不怕困难,解决今天的报错就是减少以后加班的时间,干就完了!

官方下载Calico

wget https://docs.projectcalico.org/v3.20/manifests/calico.yaml

2.修改calico.yaml

下载完后还需要修改里面定义Pod网络(字段为CALICO_IPV4POOL_CIDR),与前面kubeadm init中定义的pod-network-cidr网段一样

#大约在3878行,取消注释,并改为前面kubeadm init中pod-network-cidr字段定义的网段
vim calico.yaml +3878
...
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"
...

3.修改完后应用清单

kubectl apply -f calico.yaml
kubectl get pods -n kube-system

我们看READY这一列,这里的1/1,左边的1表示已经运行了的容器个数,右边的1表示一共需要运行的容器个数。

image-20211022233332192

calico.yaml也是以容器方式启动的,以下是所需的容器

cat calico.yaml | grep image

image-20211022233538478

2.6 部署 Dashboard

1.下载yaml文件

官网下载地址

目前最新版本为v2.4.0,我先冲了各位!

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

2.修改资源类型

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部30001端口

#加入下面的15行暴露3001端口,跟18行,对应配置文件的43跟46行
vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort
...

注意格式对齐

3.应用清单

kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard
kubectl get pods,svc -n kubernetes-dashboard

image-20211023000452627

image-20211023000635723

访问地址:

容器内访问:curl https://10.104.22.253:443

容器外访问:https://10.154.0.111:30001

4.登录UI

有两种方式登录,使用token或者kubeconfig登录

下面使用token方式登录

创建service account并绑定默认cluster-admin管理员集群角色:

# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system

# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

# 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

使用输出的token登录Dashboard。

image-20211023001255805

效果如下所示

image-20211023001439927

2.7 验证集群状态

从以下三个方面验证集群状态

  1. 验证Pod工作
  2. 验证Pod网络通信
  3. 验证DNS解析

1.创建pod验证

在Kubernetes集群中k8s-master01上创建一个pod,验证是否正常运行:

#创建一个nginx容器
kubectl create deployment nginx --image=nginx

#将nginx端口暴露出来
kubectl expose deployment nginx --port=80 --type=NodePort

#查看
kubectl get pod,svc

可以看到暴露出来的访问端口是30180

image-20211023171723730

访问地址:

容器内部访问:crul http://10.99.175.88 (在集群内任意节点都能访问,如k8s-master01,k8s-node01等等节点上)

容器外部访问:http://10.154.0.111:30180

2.使用命令验证

kubectl get pods -n kube-system

image-20211023172700643

参考资料:官方文档支持的网络组件官方文档之网络配置

三、查看集群命令

这里介绍几个常见的查看集群状态的命令

3.1 查看集群节点状态

kubectl get node

image-20211023193004922

这里部署了kubelet的节点都会被显示出来,如果使用二进制安装的话,master因为没部署kubelet将不会被显示出来,需要注意。

3.2 查看组件状态

kubectl get cs

这里的警告表示在v1.19+版本,该命令要被弃用了

这里的cs是缩写,全称是componentstatuses,意为组件状态

该命令是查看k8s资源,k8s资源有很多,resources意为资源

kubectl api-resources | more

第一列是资源的名字

第二列是缩写

第三列是API组

第四列是否支持命名空间

3.3 查看api代理的URL

kubectl cluster-info

3.4 查看集群详细信息

kubectl cluster-info dump |more

image-20211023200204280

信息很多,以json格式输出的,一般很少使用,常用的如下

kubectl describe node k8s-master

image-20211023200423104

3.5 查看事件信息

kubectl get event

image-20211023200705982

多久创建的节点,多久加入的节点都会记录在事件里

3.6 查看资源信息

kubectl describe cs

image-20211023200946205

查看组件状态信息,其他k8s支持的资源可使用kubectl api-resources | more命令查看

3.7 查看容器信息

kubectl get pods -n kube-system

image-20211023202521005

3.8 查看服务状态

kubectl get pod,svc

image-20211023202942350

四、参考资料

51CTO课程

posted @ 2021-10-26 16:59  努力吧阿团  阅读(3984)  评论(0编辑  收藏  举报