CKA认证 | 使用kubeadm部署K8s集群(v1.26)

news/2024/11/9 3:24:46 标签: kubernetes, 容器, 云原生, 运维, k8s, docker

一、前置知识点

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 集群

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.niftyadmin.cn/n/5744772.html

相关文章

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日&#xff0c;由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能&#xff0c;探索制造业数字化转型之路。 在苏州站活动开场&#xff0c;达索系统专业客户事业部华东区渠道经理马腾飞…

acmessl.cn提供接口API方式申请免费ssl证书

目录 一、前沿 二、API接口文档 1、证书可申请列表 简要描述 请求URL 请求方式 返回参数说明 备注 2、证书申请 简要描述 请求URL 请求方式 业务参数 返回示例 返回参数说明 备注 3、证书查询 简要描述 请求URL 请求方式 业务参数 返回参数说明 备注 4、证…

微积分复习笔记 Calculus Volume 1 - 4.10 Antiderivatives

4.10 Antiderivatives - Calculus Volume 1 | OpenStax

装载和刻录

"装载"和"刻录"是两个与计算机和数据存储相关的术语&#xff0c;特别是在处理光盘&#xff08;如CD、DVD&#xff09;和存储介质时。以下是它们的详细解释&#xff1a; 装载&#xff08;Mounting&#xff09; 在计算机领域&#xff0c;"装载"通…

docker拉取和打包多个镜像

docker拉取和打包多个镜像 关键词&#xff1a;拉取镜像、打包镜像、docker镜像 以下命令兼容linux、mac&#xff0c;无需安装docker-compose 登录仓库 docker login -u *** -p *** http://dockerhub.xxx.com拉取镜像 cat *.yml | awk {if ($1 "image:") print …

ORACLE RAC用DNS服务器的配置

一、搭建本地YUM源 二、安装DNS全部组建 yum -y install bind* 三、规划您RAC集群所有IP #public 192.168.16.111 rac1.ntt.com rac1 192.168.16.112 rac2.ntt.com rac2 192.168.16.121 rac3.ntt.com rac3 192.168.16.122 rac4.ntt.com rac4 #private 10.10.10.111 rac1-pr…

apk因检测是否使用代理无法抓包绕过方式

最近学习了如何在模拟器上抓取APP的包&#xff0c;APP防恶意行为的措施可分为三类&#xff1a; &#xff08;1&#xff09;反模拟器调试 &#xff08;2&#xff09;反代理 &#xff08;3&#xff09;反证书检验 第一种情况&#xff1a; 有的app检验是否使用系统代理&#xff0c…

无网络安装ionic和运行

npm 安装本地文件 之前使用npm安装包都是在有网络环境下&#xff0c;因为需要部署无互联网环境开发&#xff0c;才知道如何使用npm安装包安装本地文件/文件夹 >npm install <folder>如果 <folder> 位于项目的根目录中&#xff0c;它的依赖项将被安装&#xff…