使用kubeadm安装k8s1.26.0笔记

一. 安装前沿

1. 重磅改动

2022 年 5 月 3 日,Kubernetes 1.24 正式发布,在新版本中,我们看到 Kubernetes 作为
容器编排的事实标准,正愈发变得成熟,有 12 项功能都更新到了稳定版本,同时引入了很多 实 用 的 功 能 , 例 如 StatefulSets 支 持 批 量 滚 动 更 新 , NetworkPolicy 新 增
NetworkPolicyStatus 字段方便进行故障排查等

其中,最重要的改动是 Kubernetes 正式移除对 Dockershim 的支持,讨论很久的 “弃用Dockershim” 也终于在这个版本画上了句号。

2. CRI 接口的演变

Kubernetes 提供了一个 CRI 的容器运行时接口,那么这个 CRI 到底是什么呢?这个其实也和 Docker 的发展密切相关的。
在 Kubernetes 早期的时候,当时 Docker 实在是太火了,Kubernetes 当然会先选择支持
Docker,而且是通过硬编码的方式直接调用 Docker API,后面随着 Docker 的不断发展以及 Google 的主导,出现了更多容器运行时,Kubernetes 为了支持更多更精简的容器运行时,Google 就和红帽主导推出了 CRI 标准,用于将 Kubernetes 平台和特定的容器运行时(当然主要是为了干掉 Docker)解耦。
CRI(Container Runtime Interface 容器运行时接口)本质上就是 Kubernetes 定义的一组与容器运行时进行交互的接口, 所以只要实现了这套接口的容器运行时都可以对接到
Kubernetes 平台上来。不过 Kubernetes 推出 CRI 这套标准的时候还没有现在的统治地位, 所以有一些容器运行时可能不会自身就去实现 CRI 接口,于是就有了 shim(垫片), 一个
shim 的职责就是作为适配器将各种容器运行时本身的接口适配到 Kubernetes 的 CRI 接口上,其中 dockershim 就是 Kubernetes 对接 Docker 到 CRI 接口上的一个垫片实现。

Kubelet 通过 gRPC 框架与容器运行时或 shim 进行通信,其中 kubelet 作为客户端,CRI shim(也可能是容器运行时本身)作为服务器。

 

 

 完整结构图

3. Docker 与 containerd 的关系

 

可以并存也可以直接使用containerd
从上图可以看出在 containerd 1.0 中,对 CRI 的适配是通过一个单独的 CRI-Containerd 进程来完成的,这是因为最开始 containerd 还会去适配其他的系统(比如 swarm),所以没有直接实现 CRI,所以这个对接工作就交给 CRI-Containerd 这个 shim 了。然后到了containerd 1.1 版本后就去掉了 CRI-Containerd 这个 shim,直接把适配逻辑作为插件的方式集成到了 containerd 主进程中,现在这样的调用就更加简洁了。

 

 

 目前最新的是 1.6 版本

二. 机器准备

1. 机器规格

k8s版本:v1.26.0

本次安装1个master和1个node节点
Master: 192.168.64.6
Node: 192.168.64.7
规则:
CPU:2
内存:4G
系统:ubuntu20.04
磁盘:30G

Master使用cri-dockered方案安装
Node使用containered方案安装

2. 虚拟机准备

创建:

multipass launch -n master01 -c 2 -m 4G -d 40G

查看镜像:multipass find

指定版本:multipass launch -n master01 -c 2 -m 4G -d 40G 20.04

文档:
https://segmentfault.com/a/1190000023083548?utm_source=sf-similar-article

3. 机器配置

1.配置Dns

  检查dns是否可用

2. 外网权限

可以访问外网

3. 时区设置

timedatectl set-timezone Asia/Shanghai
date -R # 检查时区

4. 安装chrony

apt install chrony -y

修改配置:
/etc/chrony/chrony.conf
修改:pool master01 #将master01作为ntp服务器
重新启动:

root@master01:~# systemctl restart chronyd
root@master01:~# systemctl enable chronyd

主从控节点同步时间

chronyc sources

5. 设置hosts

hostnamectl set-hostname master #设置主机名称

设置hosts文件:

cat >> /etc/hosts << OFF
192.168.64.6 master01
192.168.64.7 node01
OFF

6. 关闭swap

# 如果不关闭,默认的kubelet将无法启动
swapoff -a #立即生效
sed -i 's/.*swap.*/#&/' /etc/fstab # 不立即生效
free -h #查看交换分区

7. 关闭防火墙

ufw disable

8. 加载ipvs模块

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ipvs_sh
#modprobe -- nf_conntrack_ipv4
modprobe -- nf_conntrack
lsmod | grep nf_conntrack

9. 内核参数配置

复制代码
# 创建/etc/sysctl.d/k8s.conf,添加如下内容
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables=1 # 开启网桥模式
net.bridge.bridge-nf-call-ip6tables=1 # 开启网桥模式
net.ipv4.ip_forward=1
EOF

#生效
modprobe br_netfilter # 立即生效,重启失效,流量控制的内核模块
sysctl -p /etc/sysctl.d/k8s.conf


# 配置永久生效
cat <<EOF |tee /etc/modules-load.d/k8s.conf
br_ netfilter
EOF

复制代码

10. 安装其他工具

apt install -y ipvsadm ipset

三. Docker方式CRI安装

1. docker环境准备

1. 查看系统信息

root@master01:~# lsb_release  -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 20.04.5 LTS
Release:    20.04
Codename:    focal 

2. 查看内核版本

root@master01:~# uname -r
5.4.0-137-generic
root@master01:~# 

3. 查看完整的linux发行版信息

root@master01:~# cat /proc/version
Linux version 5.4.0-137-generic (buildd@bos01-arm64-023) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #154-Ubuntu SMP Thu Jan 5 17:03:02 UTC 2023

4. 查看所有的docker版本 

root@master01:~# apt-cache madison docker-ce

5. 更新docker源

# 卸载原来的Docker以及contained

root@master01:~# apt-get remove docker docker-engine docker.io containerd runc 

root@master01:~# apt remove docker-ce docker-ce-cli containerd.id -y

# 更新apt程序包索引并安装程序包,已允许apt通过https使用存储库

# 安装必要的一些系统工具

root@master01:~# sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

# 添加docker官方的GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定存储库

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新

apt-get update

6. 安装最新版本

复制代码
# 安装
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 查看版本
docker --version
docker info
# 通过systemd启动Docker服务
sudo systemctl start docker

# 可以通过status命令查看一下启动状态,此处无须管理员权限
systemctl status docker
复制代码

7. 修改docker配置已适应kubelet

# 设置docker镜像加速及修改cgroups Driver

复制代码
 cat > /etc/docker/daemon.json <<EOF
 {

    "registry-mirrors": ["https://registry.cn.hangzhou.aliyuncs.com"],
    
    "exec-opts": ["native.cgroupdriver=systemd"]

}

EOF
复制代码

重新加载

systemctl daemon-reload

systemctl  restart docker

2. Ubuntu安装CRI-dockered

开源项目-替换dockershim in kubelet中

地址:

https://github.com/Mirantis/cri-dockerd

1. 下载及安装

# 下载

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd_0.3.1.3-0.ubuntu-focal_amd64.deb

# 安装

dpkg -i cri-dockerd_0.3.1.3-0.ubuntu-focal_amd64.deb

# 或者使用tgz的包进行安装

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1.arm64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/
chmod +x /usr/bin/cri-dockerd

配置 cri-dockerd

复制代码
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify

ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7

ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

StartLimitBurst=3

StartLimitInterval=60s

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

EOF

cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

EOF
View Code
复制代码

设置配置文件

vim /usr/lib/systemd/system/cri-docker.service 

ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9

启动 cri-docker

systemctl daemon-reload
systemctl start cri-docker
systemctl enable cri-docker
systemctl status cri-docker

四. Kubeadm Kubelet Kubectl安装

1. kubeadm简介

kubeadm是kubernetes的集群安装工具, 能够快速完成集群的安装,能完成下面的拓扑安装

  • 但节点k8s(1+0)
  • 单master和多个node的k8s(1+n)
  • Master ha 和多个node的k8s(m*1+n)

kubeadm在整个k8s架构的位置

  

2. kubeadm常用命令

3. 安装

# 添加阿里云k8s源
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
# 添加源
sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 更新
apt update
# 查看可用版本
apt-cache  madison kubead
# 删除旧版本
apt remove kubeadm kubelet kubectl -y
# 安装最新版本
apt install kubeadm kubelet kubectl -y
 # 安装特定版本
apt install kubeadm=1.23.2-00 kubelet=1.23.2-00 kubectl=1.23.2-00 -y

 

4. 启动kubelet

systemctl daemon-reload
systemctl start kubelet.service
systemctl enable kubelet.service
systemctl status kubelet.service

# 查看日志报错

 journalctl -xefu kubelet

5. 安装k8s

1. 直接命令行安装

2. 配置文件安装

# 生成配置文件
kubeadm config print init-defaults > init-config.yaml

安装:kubeadm init --config=init-config.yaml
配置如下apiVersion: kubeadm.k8s.io/v1beta3 
复制代码
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.26.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
复制代码

需要修改的内容:

advertiseAddress:本机master地址
criSocket:根据本机进行配置,本机 /var/run/cri-dockerd.sock

serviceSubnet:
#最终配置如下

复制代码
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.64.8
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  name: node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.26.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: "10.20.0.0/16"
  podSubnet: "10.10.0.0/16"
scheduler: {}

---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
复制代码
# 错误解决
创建文件并且编辑
vim /etc/default/kubelet 

KUBELET_KUBEADM_EXTRA_ARGS=--cgroup-driver=systemd --fail-swap-on=false 

3. kubectl准备 

下面的命令是配置kubectl访问集群的方式:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 查看组件的状态 

root@master01:~# kubectl  get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
controller-manager   Healthy   ok                              
scheduler            Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""}    

 

4. 安装pod network flannel

 # 下载
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 

 

 # 修改podcidr地址,默认是10.244.0.0/16
复制代码
  net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
复制代码
# 运行创建
root@master01:~# kubectl  apply -f kube-flannel.yml 
#  查看创建详情
root@master01:~# kubectl  get nodes -owide

5. 卸载安装

复制代码
kubeadm reset
# 清除所有数据
# 使用flannel插件
ip link delete cni0
ip link delete flannel.1
rm -rf /var/lib/cni
rm -rf /etc/kubernetes
rm -rf /root/.kube/config
rm -rf  /var/lib/etcd
ipcsadm -C 
复制代码

6. 使用测试

# 创建
kubectl  create deployment nginx-demo --image=nginx:1.9
发现创建有问题,查看详情
kubectl  describe pod nginx-demo-76779ccccc-bscf9
发现错误日志:
 Warning  FailedScheduling  105s  default-scheduler  0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..
# 查看node详情
root@master01:~# kubectl  describe node
其中发现 
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
发现这个节点是有污点的,需要将去掉
kubectl  taint node node node-role.kubernetes.io/control-plane- 

7. 修改使用ipvs转发流量

如果使用命令行安装,其实没指定ipvs转发,默认是通过iptables进行转发的,性能较低

复制代码
kubectl describe configmap kube-proxy -n kube-system

kubectl edit configmap kube-proxy -n kube-system

mode: "ipvs"
kubectl delete pod  -n kube-system kube-proxy--dada21
 
复制代码

6. 增加node节点-通过cri-dockerd

 

1. 配置基础环境 

 

2. 配置cri-dockerd

执行三步骤 

3.  增加节点

# 在master得到节点 join 命令时需要的 token

kubeadm token create --print-join-command

# 在node 节点上增加

kubeadm join 192.168.64.8:6443 --token 5x9xm3.bju0d9yynrh5gnv1 --discovery-token-ca-cert-hash sha256:4f24c5dfaf96c212267cc51e95b6ed73261b85475d0b02e960691ab315f09295 

如遇到报错解决

kubeadm join 192.168.64.8:6443 --token 5x9xm3.bju0d9yynrh5gnv1 --discovery-token-ca-cert-hash sha256:4f24c5dfaf96c212267cc51e95b6ed73261b85475d0b02e960691ab315f09295   --cri-socket unix:///var/run/cri-dockerd.sock

 

4.  kubectl配置

 

# 跟目录

mkdir ./kube

root@node01:~# scp root@master01:/root/.kube/config ./kube/config

 

5. node角色改变

 

# 查看
root@node01:~# kubectl  get nodes 
NAME     STATUS   ROLES           AGE   VERSION
node     Ready    control-plane   24h   v1.26.1
node01   Ready    <none>          20m   v1.26.1
# 改变角色
kubectl label nodes node1 node-role.kubernetes.io/node= 

7. cri切换到containerd 

1. 停止docker 服务

systemctl stop docker
#Warning: Stopping docker.service, but it can still be activated by: #docker.socket

systemctl stop docker.socket systemctl disable docker
systemctl stop cri-docker.service cri-docker.socket systemctl disable cri-docker.service cri-docker.socket

2. 启动containerd 服务

systemctl start containerd.service

3、修改配置文件

pause 镜像设置过阿里云镜像仓库地址
cgroups 驱动设置为systemd
拉取docker hub 镜像配置加速地址设置为阿里云镜像仓库地址

mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml

vim /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".containerd.runtimes.runc.options]

  SystemdCgroup = true

....

....

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]

endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
....
复制代码

4. 重启

systemctl daemon-reload
systemctl restart containerd.service

5. 配置 kubelet 使用containerd

vi /var/lib/kubelet/kubeadm-flags.env

KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock --pod-infra-container- image=registry.aliyuncs.com/google_containers/pause:3.9"

systemctl daemon-reload

systemctl restart kubelet

6. 验证切换

# 主master端验证,容器是否切换为containerd 

复制代码

root@master01:~# kubectl  get nodes -owide

NAME     STATUS                     ROLES           AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME

node     Ready                      control-plane   30h     v1.26.1   192.168.64.8   <none>        Ubuntu 22.04.1 LTS   5.15.0-57-generic   docker://20.10.23

node01   Ready,SchedulingDisabled   node            7h12m   v1.26.1   192.168.64.9   <none>        Ubuntu 22.04.1 LTS   5.15.0-57-generic   containerd://1.6.16

复制代码

8. CRO-O配置和安装

1. 启动内核模块

modprobe overlay 
modprobe br_netfilter

2. 安装

注意:请先安装 curl 与 gnupg
要安装在下边表格中的操作系统上,则请先将环境变量 $OS 设置为下表中对应的值:

操作系统 $OS
Debian Unstable Debian_Unstable
Debian Testing Debian_Testing
Debian 10 Debian_10
Raspberry Pi OS Raspbian_10
Ubuntu 22.04 xUbuntu_22.04
Ubuntu 21.10 xUbuntu_21.10
Ubuntu 20.04 xUbuntu_20.04
Ubuntu 18.04 xUbuntu_18.04
如果安装 cri-o-runc(推荐),则需要安装 libseccomp >= 2.4.1
注意:这在基于 Debian 10(buster)或更低版本的发行版中不可用

For instance, if you want to install cri-o 1.17, VERSION=1.17 We also support pinning to a particular release. To install 1.17.3, VERSION=1.17:1.17.3
环境变量的设置

export OS=xUbuntu_20.04 
export VERSION=1.26.1 echo $OS echo $VERSION

然后以 root 身份运行

复制代码
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | apt-key add -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | apt-key add -

apt-get update
apt-get install cri-o cri-o-runc
复制代码

注意:我们包含 cri-o-runc,是因为 Ubuntu 和 Debian 包含它们自己的打包版本的 runc
虽然这个版本应该也可以与 CRI-O 一起使用
但保持 CRI-O 与 runc 的打包版本同步可以确保它们能够一起工作

3. 配置cri-o

复制代码
vim /etc/crio/crio.conf
# 找到如下参数进行修改
pause_image = "registry.aliyuncs.com/google_containers/pause:3.9"

启动并设置开机启动
systemctl daemon-reload
systemctl enable crio && systemctl start crio && systemctl status crio
复制代码

4. 配置crictl

复制代码

crictl config --set runtime-endpoint=/var/run/crio/crio.sock
crictl config --get runtime-endpoint /run/containerd/containerd.sock


# 也可以修改下默认的配置文件,默认为 /etc/crictl.yaml,在文件中指定容器运行时和镜像的
endpoint 地址,内容如下所示:
cat /etc/crictl.yaml

runtime-endpoint: "unix:///var/run/crio/crio.sock"
image-endpoint: "unix:///var/run/crio/crio.sock"
timeout: 0
debug: false
pull-image-on-create: false
disable-pull-on-run: false

复制代码

5. kubelet配置修改

1. cgroup drive 设 置

CRI-O 运行时使用的 cgroup driver 为 systemd ,因此需要设置 kubelet 参数保持一致:
kubelet 会默认--cgroup-driver=systemd,若运行时 cgroup 不一致时,kubelet 会报错

2. 运行时参数设置

cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime- endpoint=unix:///var/run/crio/crio.sock --pod-infra-container- image=registry.aliyuncs.com/google_containers/pause:3.9"

 

cri镜像配置

https://www.cnblogs.com/newtonsky/p/15490153.html

9. --

 

 

 
posted @   wanghhhh  阅读(422)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示