当前位置: 首页 > article >正文

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:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。


http://www.kler.cn/a/385273.html

相关文章:

  • Windows10/11开启卓越性能模式 windows开启卓越性能电源模式 工作电脑开启卓越性能模式 电脑开启性能模式
  • 【网络】完美配置 HTTPS:优化 SSL/TLS 证书以增强网站安全和性能
  • 手机发展史介绍
  • 智能提醒助理系列-jdk8升级到21,springboot2.3升级到3.3
  • qt QErrorMessage详解
  • 兰空图床配置域名访问
  • android 配置鼠标右键快捷对apk进行反编译
  • 如何通过Python SDK更新Collection中已存在的Doc
  • 一文读懂肖特基二极管
  • 【汽车悬挂减震器】制造行业的市场需求与汽车产量呈明显的正相关关系
  • Leetcode 278 First Bad Version
  • 以梧桐数据库为例分析分组排序并取每组第二大数值对应的用户的SQL实现
  • Spring Boot 携手 Vue 构建校内订餐新体系
  • RibbitMQ-原理使用
  • Java NIO操作
  • Liunx:文件fd、重定向、管道
  • 全局变量之C与Pthon的差异
  • 若依管理系统使用已有 Nacos 部署流程整理
  • [JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决
  • 城镇住房保障:SpringBoot系统维护与升级
  • Python基于TensorFlow实现双向循环神经网络GRU加注意力机制分类模型(BiGRU-Attention分类算法)项目实战
  • 多线程案例---阻塞队列
  • RapidrepairController
  • linux 下 signal() 函数的用法,信号类型在哪里定义的?
  • 【go从零单排】go语言中的指针
  • NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备汇聚公共资源场景方案全析