首页 > 其他分享 >快速部署一个K8s集群——kubernetes v1.26,kubeadm方式

快速部署一个K8s集群——kubernetes v1.26,kubeadm方式

时间:2023-02-16 22:14:21浏览次数:53  
标签:kubernetes -- containerd v1.26 docker cri kubeadm

快速部署一个K8s集群——kubernetes v1.26,kubeadm方式

1、前置知识点

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硬盘

  • 本次实验环境4核CPU、8GB内存、200G硬盘(笔者使用的服务器做的ESXI虚拟化)

  • 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点

软件环境:

软件 版本
操作系统 Anolis7.9_x64 (mini)
Docker 20-ce
Kubernetes 1.26

服务器规划:

角色 IP
k8s-master 192.168.7.10
k8s-node1 192.168.7.11
k8s-node2 192.168.7.12

架构图:
架构图

1.3 操作系统初始化配置【所有节点】

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时

# 关闭swap
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

# 根据规划设置主机名
hostnamectl set-hostname <hostname>

# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.7.10 k8s-master
192.168.7.11 k8s-node1
192.168.7.12 k8s-node2
EOF

# 将桥接的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  # 生效

# 时间同步
yum install ntpdate -y
ntpdate ntp1.nim.ac.cn

2. 安装Docker/kubeadm/kubelet【所有节点】

2.1 安装Docker

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker

配置镜像下载加速器:

cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://292nm6nu.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl restart docker
docker info

2.2 安装cri-dockerd

Kubernetes v1.24移除docker-shim的支持,而Docker Engine默认又不支持CRI标准,因此二者默认无法再直接集成。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的桥梁,从而能够让Docker作为Kubernetes容器引擎。

如图所示:

cri-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

指定依赖镜像地址:

vim /usr/lib/systemd/system/cri-docker.service
把原来的注释一下添加如下
#ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://

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.3 添加阿里云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.4 安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
systemctl enable kubelet

3. 部署Kubernetes Master

在192.168.7.10(Master)执行

kubeadm init \
  --apiserver-advertise-address=192.168.7.10 \
  --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

初始化完成后,最后会输出一个join命令,先记住,下面用。

kubeadm init

拷贝kubectl使用的连接k8s认证文件到默认路径:

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

如果是root用户执行如下变量即可

export KUBECONFIG=/etc/kubernetes/admin.conf

查看工作节点:

kubectl get nodes
NAME               STATUS     ROLES            AGE   VERSION
k8s-master         NotReady   control-plane    20s   v1.26.0

注:由于网络插件还没有部署,还没有准备就绪 NotReady,先继续

参考资料:

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-plane-node

4. 加入Kubernetes Node

在192.168.7.11-12(Node1和Node2)执行。

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令并手动加上--cri-socket=unix:///var/run/cri-dockerd.sock:

kubeadm join 192.168.7.10:6443 --token 3bp6ue.kdwy1zs5geobn9yb \
        --discovery-token-ca-cert-hash sha256:ee0a5af34236c968d0d6804833c2b75a69e2de6cbc0d8f5973c4f43e303e8f9b  --cri-socket=unix:///var/run/cri-dockerd.sock

提示Node已经加入集群

Node_加入集群

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

kubeadm token create --print-join-command

参考资料:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/

5. 部署容器网络(CNI)

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

下载YAML:

wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml

下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。

#在3579行处添加如下配置
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"

修改完后文件后,部署:

kubectl apply -f calico.yaml
kubectl get pods -n kube-system

等Calico Pod都Running,节点也会准备就绪。

Calico_status

注:以后所有yaml文件都只在Master节点执行。

安装目录:/etc/kubernetes/

组件配置文件目录:/etc/kubernetes/manifests/

参考资料:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network

6. 部署 Dashboard

Dashboard是官方提供的一个UI,可用于基本管理K8s资源。

YAML下载地址:

https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.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  #这里注意大小写格式
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort       #这里注意大小写格式
...

kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard


##注意如果这里的nodePort写成nodeport或者存在其他书写问题,就会报如下的错
Error from server (BadRequest): error when creating "recommended.yaml": Service in version "v1" cannot be handled as a Service: strict decoding error: unknown field "spec.ports[0].nodeport"

dashboard

访问地址:https://Master1IP:30001

如果无法访问使用如下方式查看kubernetes-dashboard状态是否为running

先用kubectl get pods --all-namespaces -owide查看问题pod,然后用kubectl describe pod pod_name -n kube-system来查看日志,一般情况下,我们都是可以通过这个方式来获取到报错原因

创建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

使用输出的token登录Dashboard。

dashboard_login

7. 容器引擎Containerd【与Docker二选一】

containerd是一个主流的容器引擎,与Docker相兼容,相比Docker轻量很多,目前较为成熟。

参考资料:https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#containerd

1、配置先决条件

如果是由docker切containerd这步可省略。

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

2、安装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
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

3、修改配置文件

  • 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."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
            endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
          
systemctl restart containerd

4、配置kubelet使用containerd

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

5、验证

kubectl get node -o wide

k8s-node1  xxx  containerd://1.5.6

get node

6、管理容器工具

containerd提供了ctr命令行工具管理容器,但功能比较简单,所以一般会用crictl工具检查和调试容器。

项目地址:https://github.com/kubernetes-sigs/cri-tools/

设置crictl连接containerd:

vi /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false

下面是docker与crictl命令对照表:

镜像相关功能 Docker Containerd
显示本地镜像列表 docker images crictl images
下载镜像 docker pull crictl pull
上传镜像 docker push 无,例如buildk
删除本地镜像 docker rmi crictl rmi
查看镜像详情 docker inspect IMAGE-ID crictl inspecti IMAGE-ID
容器相关功能 Docker Containerd
显示容器列表 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
显示 POD 列表 crictl pods
查看 POD 详情 crictl inspectp
运行 POD crictl runp
停止 POD crictl stopp

标签:kubernetes,--,containerd,v1.26,docker,cri,kubeadm
From: https://www.cnblogs.com/bamboo-green/p/17128474.html

相关文章

  • kubeadm安装
    目录:环境准备所有节点安装docker部署K8s集群部署Dashboard安装Harbor私有仓库安装master(2C/4G,cpu核心数要求大于2)192.168.63.100docker、kubeadm、kubelet、kubec......
  • Kubernetes二进制安装
    目录:操作系统初始化配置部署docker引擎部署etcd集群准备签发证书环境部署Master组件部署WorkerNode组件部署CNI网络组件部署flannel部署Calico部署Core......
  • IoT 边缘集群基于 Kubernetes Events 的告警通知实现
    背景边缘集群(基于树莓派+K3S)需要实现基本的告警功能。边缘集群限制CPU/内存/存储资源紧张,无法支撑至少需要2GB以上内存和大量存储的基于Prometheus的完整监......
  • Kubeadm搭建K8S
    一、kubeadm部署K8S集群架构主机名IP地址安装组件master(2C/4G,cpu核心数要求大于2)192.168.160.20docker、kubeadm、kubelet、kubectl、flannelnode01(2C/2G......
  • Kubernetes架构设计Concepts之理解Kubernetes API之理解Kubernetes对象
     首先我说下为什么去翻译这些文章,当然也有一些不少文章是翻译的,但是没有对照,或者是全中文的,这个时候你就不好判断理解,特别是比如:从代码角度和运维角度,代码角度呢,我们看到......
  • kubernetes 使用jq命令对资源配置查看(yaml json文件解析工具)
    有图形化的直接从图形化可以看到各种资源,如Deployment、Pod等资源的配置安装1.jq命令centos环境下安装#yum-yinstalljq2.https://github.com/stedolan/jq下载 ......
  • Kubernetes CSI插件注册(二)—— Kubelet CSI插件注册机制源码分析
    1、概述Kubernetes的CSIPlugin注册机制的实现分为两个部分,第一部分是sidecar"node-driver-registrar",第二部分是Kubelet的pluginManager,第一部分详细内容请参见《Kuber......
  • Kubernetes控制平面组件:调度器和控制器
    一、调度器1、调度器简述kube-scheduler负责分配调度Pod到集群内的节点上,它监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分......
  • kubeadm的部署+Dashboard+以及连接私有仓库 Harbor
    一、kubeadm部署K8S集群架构主机名IP地址安装组件master(2C/4G,cpu核心数要求大于2)192.168.10.10docker、kubeadm、kubelet、kubectl、flannenode01(2C/2G)1......
  • Kubernetes:基于命令行终端UI的管理工具 K9s
    写在前面K9s是一个基于终端UI的K8S管理工具博文内容为k9s在windows、Linux以及docker安装Demo简单的热键使用。理解不足小伙伴帮忙指正我所渴求的,無非是......