CKA认证 | 使用kubeadm部署K8s集群(v1.26)
一、前置知识点
1.1 生产环境可部署Kubernetes集群的两种方式
目前生产部署Kubernetes集群主要有两种方式:
① kubeadm
Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。
② 二进制包
从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
这里采用kubeadm搭建集群
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.2 准备环境
服务器要求:
- 建议最小硬件配置:2核CPU、2G内存、20G硬盘
- 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点
软件环境:
软件 | 版本 |
操作系统 | CentOS7.9_x64 (mini) |
Docker | 20-ce |
Kubernetes | 1.26 |
服务器规划:
角色 | IP | 主机名 |
k8s-master | 192.168.1.71 | k8s-master-1-71 |
k8s-node1 | 192.168.1.72 | k8s-node1-1-72 |
k8s-node2 | 192.168.1.73 | k8s-node2-1-73 |
架构图:
二、环境准备
2.1 操作系统初始化配置(所有节点)
1)设置网卡命名(不强求)
cat /etc/default/grub
...
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0"
...
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot //重启生效
2)配置IP地址(以1.71为例)
[root@k8s-master-1-71 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=192.168.1.71
PREFIX=24
GATEWAY=192.168.1.254
DNS1=223.5.5.5
...
3)关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
4)关闭 selinux
setenforce 0 # 临时配置
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久配置
5)关闭 swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
6)根据规划设置主机名
hostnamectl set-hostname <hostname>
7)添加 hosts 解析
cat >> /etc/hosts << EOF
192.168.1.71 k8s-master
192.168.1.72 k8s-node1
192.168.1.73 k8s-node2
EOF
8)将桥接的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 # 生效
9)配置YUM源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
10)时间同步
yum install ntpdate -y
ntpdate time.windows.com
(echo "*/5 * * * * /usr/sbin/ntpdate -u time.windows.com") | crontab
crontab -l
*/5 * * * * /usr/sbin/ntpdate -u time.windows.com
11)配置内核模块
cat >> /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
systemctl restart systemd-modules-load.service
lsmod | grep -e ip_vs -e nf_conntrack
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs 155648 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139264 1 ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 4 nf_conntrack,btrfs,raid456,ip_vs
12)内核参数调优
cat <<EOF >> /etc/sysctl.conf
fs.file-max = 6815744
fs.nr_open = 1048576
net.ipv4.tcp_max_tw_buckets = 102400
net.ipv4.tcp_max_syn_backlog = 20480
net.core.somaxconn = 102400
net.core.netdev_max_backlog = 32768
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.forwarding = 1
EOF
13)下载基本软件
yum -y install wget vim net-tools jq telnet lvm2 git tar curl nfs-kernel-server chrony bash-completion
2.2 安装 Docker / kubeadm / kubelet(所有节点)
2.2.1 安装Docker
# 下载 docker 镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 安装 docker-ce
yum -y install docker-ce
# 开启 docker 开机自启
systemctl enable docker && systemctl start docker
# 查看docker版本
docker --version
Docker version 23.0.1, build a5ee5b1
2.2.2 配置镜像下载加速器
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl restart docker
docker info //查看docker信息
Client:
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.10.2
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.16.0
Path: /usr/libexec/docker/cli-plugins/docker-compose
scan: Docker Scan (Docker Inc.)
Version: v0.23.0
Path: /usr/libexec/docker/cli-plugins/docker-scan
...
Registry Mirrors:
https://b9pmyelo.mirror.aliyuncs.com/
Live Restore Enabled: false
参考:配置Docker镜像加速器-阿里云开发者社区
2.2.3 安装cri-dockerd(CRI容器运行时)
Kubernetes v1.24 移除 docker-shim 的支持,而Docker Engine默认又不支持CRI标准,因此二者默认无法再直接集成。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的桥梁,从而能够让Docker作为Kubernetes容器引擎。如图所示:
补充:containerd 是自带CRI,不需要 cri-docker 的支持,且 containerd 是集成在dockerd 中的;
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm
指定依赖镜像地址:
vi /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
systemctl daemon-reload
systemctl enable cri-docker && systemctl start cri-docker
2.2.4 添加阿里云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
2.2.5 安装kubeadm、kubelet 和 kubectl
由于版本更新频繁,这里指定版本号部署(注意,是所有节点安装)
yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
systemctl enable kubelet
三、部署 k8s 集群
- 安装目录:/etc/kubernetes/
- 组件配置文件目录:/etc/kubernetes/manifests/
3.1 部署Kubernetes Master
在 k8s-Master 执行(192.168.1.71)
kubeadm init \
--apiserver-advertise-address=192.168.1.71 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.26.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
- --apiserver-advertise-address 集群通告地址
- --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
- --kubernetes-version K8s版本,与上面安装的一致
- --service-cidr 集群内部虚拟网络,Pod统一访问入口
- --pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
- --cri-socket 指定cri-dockerd接口,如果是containerd则使用--cri-socket unix:///run/containerd/containerd.sock
- --ignore-preflight-errors=all,忽略所有错误告警
初始化完成后,会输出以下信息,其中有一个join命令,需记住,在后面步骤将会使用
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
kubeadm join 192.168.1.71:6443 --token 0c2d3a.awbn79ctop2plelx \
--discovery-token-ca-cert-hash sha256:7d286f2200085684c82ec9c08ef93df391ce4437d17360f9d4f5f0baf275bc57
拷贝 kubectl 使用的连接k8s认证文件到默认路径(将 admin.conf 文件拷贝到所有节点的 $HOME/.kube/config,即可以在每个节点使用 kubectl get nodes查看集群)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
注意:由于网络插件还没有部署,还没有准备就绪 NotReady
参考资料:
- kubeadm init | Kubernetes
- Creating a cluster with kubeadm | Kubernetes
3.2 加入Kubernetes Node
在 k8s-Node 工作节点执行(192.168.1.72/73)
向集群添加新节点,将刚刚执行在 kubeadm init 输出中的 kubeadm join 命令,并手动加上相关
--cri-socket=unix:///var/run/cri-dockerd.sock
kubeadm join 192.168.1.71:6443 --token 0c2d3a.awbn79ctop2plelx \
--discovery-token-ca-cert-hash sha256:7d286f2200085684c82ec9c08ef93df391ce4437d17360f9d4f5f0baf275bc57 --cri-socket=unix:///var/run/cri-dockerd.sock
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:
kubeadm token create --print-join-command
参考资料:kubeadm join | Kubernetes
3.3 部署容器网络(CNI) (k8s-master上运行)
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案
# 下载 calico 相关yaml文件
wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样(例如:10.244.0.0/16 )
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
修改完后文件后进行部署:
[root@k8s-master-1-71 ~]# kubectl apply -f calico.yaml
[root@k8s-master-1-71 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-79568db7f8-7b8qt 1/1 Running 0 10h
calico-node-52hzv 1/1 Running 0 10h
calico-node-hwlxn 1/1 Running 0 10h
calico-node-qngqv 1/1 Running 0 10h
coredns-5bbd96d687-58m5t 1/1 Running 0 10h
coredns-5bbd96d687-dxwth 1/1 Running 0 10h
etcd-k8s-master-1-71 1/1 Running 0 10h
kube-apiserver-k8s-master-1-71 1/1 Running 0 10h
kube-controller-manager-k8s-master-1-71 1/1 Running 0 10h
kube-proxy-2np4n 1/1 Running 0 10h
kube-proxy-ch5qf 1/1 Running 0 10h
kube-proxy-sw9qt 1/1 Running 0 10h
kube-scheduler-k8s-master-1-71 1/1 Running 0 10h
参考资料:Creating a cluster with kubeadm | Kubernetes
3.4 部署 Dashboard
Dashboard是官方提供的一个UI,可用于基本管理K8s资源。
YAML下载地址:https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
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 # 添加 nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
type: NodePort # 添加 nodePort
...
kubectl apply -f recommended.yaml
[root@k8s-master-1-71 ~]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-7bc864c59-hwnkh 1/1 Running 0 10h
kubernetes-dashboard-6c7ccbcf87-pts92 1/1 Running 0 10h
创建 service account 并绑定默认 cluster-admin 管理员集群角色:
# 创建用户
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
# 获取用户Token
kubectl create token dashboard-admin -n kubernetes-dashboard
访问地址:https://NodeIP:30001,使用输出的 token 登录 Dashboard
四、容器引擎Containerd(与Docker二选一)
containerd 是一个主流的容器引擎,与Docker相兼容,相比Docker轻量很多,containerd 是自带CRI,不需要 cri-docker 的支持,且 containerd 是集成在dockerd 中的,目前较为成熟。
自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除,间接的希望能够从 containerd 作为今后的容器引擎,而当前主流的容器依旧还是 docker
参考资料:容器运行时 | Kubernetes
4.1 安装 containerd 容器
情况1:在未有安装 docker-ce 的情况下,需自己手动安装 containerd
① 解决内核模块及参数优化
# 将桥接的IPv4流量传递到iptables的链
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system # 应用 sysctl 参数而不重新启动
# 通过运行以下指令确认 br_netfilter 和 overlay 模块被加载:
lsmod | grep br_netfilter
lsmod | grep overlay
② 下载安装 containerd
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
情况2:如果是由 docker 切换 containerd 以上①、②可省略
4.2 修改配置文件
生成 containerd config 配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml # 生成配置文件
修改配置文件主要内容如下:
- pause镜像设置阿里云镜像仓库地址
- 拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址
vi /etc/containerd/config.toml
...
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2" //设置阿里云镜像仓库地址
...
[plugins."io.containerd.grpc.v1.cri".registry.mirrors] //在该plugins下添加以下2行,主要设置阿里云镜像加速器地址
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
systemctl restart containerd
4.3 配置kubelet使用containerd
修改容器运行时为 /run/containerd/containerd.sock
ls /run/containerd/containerd.sock
vi /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8"
systemctl restart kubelet
# 验证
kubectl get node -o wide
k8s-node1 xxx containerd://1.5.6
# 如果需要停用原来的 docker-ce,停止cri-docker即可
systemctl stop cri-docker
如果需要将containerd再切换回docker,则将步骤回滚即可
4.4 管理容器工具 crictl
由于 containerd 默认提供的是 ctr 命令行工具管理容器,但功能比较简单,所以由社区开源的crictl工具去检查和调试容器,也可适配其它的容器运行时。
项目地址:GitHub - kubernetes-sigs/cri-tools: CLI and validation tools for Kubelet Container Runtime Interface (CRI) .
# 设置 crictl 工具连接 containerd :
vi /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock //指定容器运行时的接口
image-endpoint: unix:///run/containerd/containerd.sock //指定容器的接口
timeout: 10 //超时时间
debug: false //debug输出
4.5 docker与crictl命令对照表
镜像相关功能 | Docker | Containerd(crictl) |
显示本地镜像列表 | docker images | crictl images |
下载镜像 | docker pull | crictl pull |
上传镜像 | docker push | 无,例如buildk |
删除本地镜像 | docker rmi | crictl rmi |
查看镜像详情 | docker inspect IMAGE-ID | crictl inspect IMAGE-ID |
容器相关功能 | Docker | Containerd(crictl) |
显示容器列表 | docker ps | crictl ps |
创建容器 | docker create | crictl create |
启动容器 | docker start | crictl start |
停止容器 | docker stop | crictl stop |
删除容器 | docker rm | crictl rm |
查看容器详情 | docker inspect | crictl inspect |
附加容器 | docker attach | crictl attach |
执行命令 | docker exec | crictl exec |
查看日志 | docker logs | crictl logs |
查看容器资源 | docker stats | crictl stats |
POD 相关功能 | Docker | Containerd(crictl) |
显示 POD 列表 | 无 | crictl pods |
查看 POD 详情 | 无 | crictl inspectp |
运行 POD | 无 | crictl runp |
停止 POD | 无 | crictl stopp |
小结:
本篇为 【Kubernetes CKA认证】的开篇学习笔记,希望这篇笔记可以让您初步了解到 如何使用kubeadm部署1.26版本的K8s集群,不妨跟着我的笔记步伐亲自实践一下吧!
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。