kubeadm快速搭建K8s集群 基于v1.22.2版本
### 一、环境介绍
1.1 kubeadm介绍
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
kubeadm采用的是容器化部署方式,组件除了kubelet
其他都以容器形式启动并运行。
1.2 部署流程
- 安装Docker
- 使用
kubeadm init
创建一个Master节点 - 使用
kubeadm join
将一个node节点加入到集群中 - 部署容器网络
- 部署Web UI
1.3 安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap分区
1.4 k8s运行图示
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版本的内核
查看目前可用内核
参考资料:升级内核
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节点执行就能加入该集群
#框一内容
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是因为没有部署网络插件导致的。
如果报错查看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,按最新版本的来,不怕报错,不怕困难,解决今天的报错就是减少以后加班的时间,干就完了!
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表示一共需要运行的容器个数。
calico.yaml也是以容器方式启动的,以下是所需的容器
cat calico.yaml | grep image
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
访问地址:
容器内访问: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。
效果如下所示
2.7 验证集群状态
从以下三个方面验证集群状态
- 验证Pod工作
- 验证Pod网络通信
- 验证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
访问地址:
容器内部访问:crul http://10.99.175.88 (在集群内任意节点都能访问,如k8s-master01,k8s-node01等等节点上)
容器外部访问:http://10.154.0.111:30180
2.使用命令验证
kubectl get pods -n kube-system
参考资料:官方文档支持的网络组件,官方文档之网络配置
三、查看集群命令
这里介绍几个常见的查看集群状态的命令
3.1 查看集群节点状态
kubectl get node
这里部署了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
信息很多,以json格式输出的,一般很少使用,常用的如下
kubectl describe node k8s-master
3.5 查看事件信息
kubectl get event
多久创建的节点,多久加入的节点都会记录在事件里
3.6 查看资源信息
kubectl describe cs
查看组件状态信息,其他k8s支持的资源可使用kubectl api-resources | more
命令查看
3.7 查看容器信息
kubectl get pods -n kube-system
3.8 查看服务状态
kubectl get pod,svc