K8S 1.24.0 安装部署

标签: K8s | 发表时间:2022-05-25 20:11 | 作者:mao_siyu
出处:http://www.dev-share.top
最佳实践
支持

在 v1.2x 版本中, Kubernetes 支持的最大节点数为 5000。更具体地说,我们支持满足以下所有条件的配置:

  • 节点数不超过 5000
  • 每个节点的 pod 数量不超过 100
  • Pod 总数不超过 150000
  • 容器总数不超过 300000



官方文档
国内教程

Container Runtime
  • Kubernetes v1.20 开始,默认移除 docker 的依赖,如果宿主机上安装了 docker 和 containerd,将优先使用 docker 作为容器运行引擎,如果宿主机上未安装 docker 只安装了 containerd,将使用 containerd 作为容器运行引擎;
  • 本文使用 containerd 作为容器运行引擎;
关于二进制安装
  • kubeadm 是 Kubernetes 官方支持的安装方式, 不是 二进制 。本文档采用 kubernetes.io 官方推荐的 kubeadm 工具安装 kubernetes 集群。



系统环境
  [root@master01 ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
[root@master01 ~]#
[root@master01 ~]#
[root@master01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.22.12.61     master01
10.22.12.62     master02
10.22.12.63     master03
10.22.12.64     worker01
10.22.12.65     worker02
10.22.12.66     worker03
[root@master01 ~]#



安装 containerd
  # 在 master 节点和 worker 节点都要执行

# 指定k8s版本
export K8S_VERSION=1.24.0
# 指定Containerd版本
export CONTAINERD_VERSION=1.6.4

卸载旧版本依赖
  # 卸载旧版本, 根据实际情况不用每次都卸载
yum remove -y containerd.io
# 卸载旧版本, 根据实际情况不用每次都卸载
yum remove -y kubelet kubeadm kubectl
重新安装k8s

setup_containerd.sh 在 master 节点和 worker 节点都要执行
  #!/bin/bash

# 在 master 节点和 worker 节点都要执行

if [[ ${K8S_VERSION} == '' ]]
  then
    echo -e "\033[31m 缺少环境变量: export K8S_VERSION=${K8S_VERSION} \033[0m"
    exit
  else
    echo -e "\033[32m export K8S_VERSION=${K8S_VERSION} \033[0m"
fi
if [[ ${CONTAINERD_VERSION} == ''  ]]
  then
    echo -e "\033[31m 缺少环境变量: export CONTAINERD_VERSION=${CONTAINERD_VERSION} \033[0m"
    exit
  else
    echo -e "\033[32m export CONTAINERD_VERSION=${CONTAINERD_VERSION} \033[0m"
fi

# 安装 containerd
# 参考文档如下
# https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd

cat << EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# Setup required sysctl params, these persist across reboots.
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
sysctl --system

# 设置 yum repository
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 containerd
## yum update -y
sudo yum install -y containerd.io-${CONTAINERD_VERSION}

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

# 修改Containerd配置文件,开启SystemdCgroup模式
sed -i "s/SystemdCgroup = false/SystemdCgroup = true/g" /etc/containerd/config.toml


systemctl daemon-reload
systemctl enable containerd
systemctl restart containerd


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

# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak | grep -v swap > /etc/fstab

# 配置K8S的yum源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装kubelet、kubeadm、kubectl
yum install -y kubelet-${K8S_VERSION} kubeadm-${K8S_VERSION} kubectl-${K8S_VERSION}

crictl config runtime-endpoint /run/containerd/containerd.sock

# 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl enable kubelet
systemctl start kubelet

containerd --version
kubelet --version

## ---------------------------------------------------------------------------------------------

# 生成 CNI 配置文件
cat << EOF | tee /etc/cni/net.d/10-containerd-net.conflist
{
 "cniVersion": "1.0.0",
 "name": "containerd-net",
 "plugins": [
   {
     "type": "bridge",
     "bridge": "cni0",
     "isGateway": true,
     "ipMasq": true,
     "promiscMode": true,
     "ipam": {
       "type": "host-local",
       "ranges": [
         [{
           "subnet": "10.88.0.0/16"
         }],
         [{
           "subnet": "2001:db8:4860::/64"
         }]
       ],
       "routes": [
         { "dst": "0.0.0.0/0" },
         { "dst": "::/0" }
       ]
     }
   },
   {
     "type": "portmap",
     "capabilities": {"portMappings": true}
   }
 ]
}
EOF

## ---------------------------------------------------------------------------------------------

## 下载镜像
# 根据k8s的版本自动配置合适的镜像
images=$(kubeadm config images list --kubernetes-version=${K8S_VERSION})
# 转为数组
new_images=(${images//" "/})
for img in ${new_images[@]};
do
    # 下载阿里云镜像(因 1.20.与 1.23.x以后的coredns名称不一致,因此做了如下处理)
    if [[ $img != *coredns/* ]]
    then
        #echo ${img/k8s.gcr.io\//registry.cn-qingdao.aliyuncs.com\/cn-aliyun/}
        ctr -n k8s.io i pull ${img/k8s.gcr.io\//registry.cn-qingdao.aliyuncs.com\/cn-aliyun/}
        ctr -n k8s.io i tag ${img/k8s.gcr.io\//registry.cn-qingdao.aliyuncs.com\/cn-aliyun/} $img
    else
        #echo ${img/k8s.gcr.io\//registry.cn-qingdao.aliyuncs.com\/cn-aliyun/}
        ctr -n k8s.io i pull ${img/k8s.gcr.io\/coredns\//registry.cn-qingdao.aliyuncs.com\/cn-aliyun/}
        ctr -n k8s.io i tag ${img/k8s.gcr.io\/coredns\//registry.cn-qingdao.aliyuncs.com\/cn-aliyun/} $img
    fi
    echo '+----------------------------------------------------------------+'
    echo ''
done

echo ""
echo -e "\033[32m Kubernetes依赖安装完成 \033[0m"




初始化 master 节点
  关于初始化时用到的环境变量

POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改

设置ApiServer的IP址
  # 单master节点时它为ApiServer的IP址
# 高可用时它是负载均衡的虚IP(LOAD_BALANCER_IP)
export APISERVER_IP=10.22.12.61
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
init_master.sh 只在 master 节点执行
  #!/bin/bash

# 只在 master 节点执行

if [[ ${APISERVER_IP} == '' ]]
  then
    echo -e "\033[31m 缺少环境变量: export APISERVER_IP=${APISERVER_IP} \033[0m"
    exit
  else
    echo -e "\033[32m export APISERVER_IP=${APISERVER_IP} \033[0m"
fi
if [[ ${POD_SUBNET} == ''  ]]
  then
    echo -e "\033[31m 缺少环境变量: export POD_SUBNET=${POD_SUBNET} \033[0m"
    exit
  else
    echo -e "\033[32m export POD_SUBNET=${POD_SUBNET} \033[0m"
fi

# 脚本出错时终止执行
set -e

rm -f ./kubeadm-config.yaml

cat > kubeadm-config.yaml << ERIC
---

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v${K8S_VERSION}
controlPlaneEndpoint: ${APISERVER_IP}:6443          # "LOAD_BALANCER_IP:LOAD_BALANCER_PORT"

# 只在部署高可用时配置 apiServer
apiServer:
  # 生成的~/.kube/config证书,都允许使用哪些IP地址访问ApiServer,地址可以写多个,也可以写域名
  certSANs:
    - ${APISERVER_IP}                               #- "LOAD_BALANCER_IP"
#    - 178.177.27.25                               #- "LOAD_BALANCER_IP"
#    - 178.137.22.26                               #- "LOAD_BALANCER_IP"

# 修改etcd数据存储目录
#etcd:
#  local:
#    dataDir: /mnt/etcd-data

# 配置集群内部网段
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/16                       # 设定service 网段,不做修改
  podSubnet: ${POD_SUBNET}                          # 设定pod 网段

---

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

ERIC

# kubeadm init
echo ""
echo -e "\033[32m 初始化 Master 节点 \033[0m"
kubeadm init --config=kubeadm-config.yaml --upload-certs

# 配置 kubectl
rm -rf /root/.kube/
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

echo ""
echo -e "\033[32m Kubernetes初始化完成 \033[0m"


安装网络插件, 只在 master 节点执行
  wget http://qiniu.dev-share.top/cni/k8s-1.24.x-calico-3.20.5.yaml
kubectl apply -fk8s-1.24.x-calico-3.20.5.yaml




相关 [k8s] 推荐:

CentOS7 安装 K8S

- - 企业架构 - ITeye博客
前提:VirtualBox CentOS7. 物理机IP   192.168.18.8. 虚拟机1IP:192.168.18.100(VMaster master). 虚拟机2IP:192.168.18.101(VServer1 node1). 虚拟机3IP:192.168.18.102(VServer2 node2).

k8s水平扩容

- - Bboysoul's Blog
k8s 的好处就是可以弹性水平扩容和纵向扩容,平时纵向扩容用的不太多,所以今天说说水平扩容,在创建hpa之前你要确定集群中已经安装了metrics-server,我使用的是k3s,直接自带. 首先创建需要的容器,下面是dockerfile. 原理就是当你访问index.php的时候会进行一个循环计算来提高cpu的使用率.

# [k8s] HPA: Horizontal Pod Autoscaling

- - V2EX - 技术
HPA 是 K8S 的一大利器. 通过 HPA, 我们可以让服务的 pod 数量根据特定指标自动增加或减少, 使得在高峰期有足够的资源服务请求, 在低峰期又可以避免占用过多的资源. 同时, 在 SOA 架构下, 我们也习惯通过 HPA 来避免劳心劳力的为每个微服务计算所需的资源.. minReplicas: 允许的最小 pod 数量.

K8S 1.24.0 安装部署

- - Share
在 v1.2x 版本中, Kubernetes 支持的最大节点数为 5000. 更具体地说,我们支持满足以下所有条件的配置:. 每个节点的 pod 数量不超过. Kubernetes v1.20 开始,默认移除 docker 的依赖,如果宿主机上安装了 docker 和 containerd,将优先使用 docker 作为容器运行引擎,如果宿主机上未安装 docker 只安装了 containerd,将使用 containerd 作为容器运行引擎;.

k8s docker集群搭建 - CSDN博客

- -
一、Kubernetes系列之介绍篇.     - 一次构建,到处运行. 2.什么是kubernetes.   首先,他是一个全新的基于容器技术的分布式架构领先方案. Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg). 在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性.

深入掌握K8S Pod - Yabea - 博客园

- -
K8S configmap介绍. Pod是k8s中最小的调度单元,包含了一个“根容器”和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的基本使用,但是为了更好的应用,你需要深入了解pod的配置、调度、升级和扩缩容等. pod包含一个或多个相对紧密耦合的容器,处于同一个pod中的容器共享同样的存储空间、IP地址和Port端口.

浅谈 k8s ingress controller 选型 - 知乎

- -
大家好,先简单自我介绍下,我叫厉辉,来自腾讯云. 业余时间比较喜欢开源,现在是Apache APISIX PPMC. 今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容需要大家对 K8S 有一定的了解,下面是我的分享. 阅读本文需要熟悉以下基本概念:. 集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等云资源.

SkyWalking探针在 k8s 中集成

- - 掘金 后端
最近公司需要在 k8s 环境接入 SkyWalking,要让应用无感知接入. 开始打算的是把agent文件放到基础镜像中,这样应用只需要引用包含agent的基础镜像即可. 但是这样会有几个问题,首先不好管理agent,升级需要应用重新打镜像部署,动静太大. 第二,不是所有应用都需要接入,要按需引入不同基础镜像,这样就多个一个步骤,应用会有感知.

记一次K8s排错实战

- - 掘金 后端
这是我参与更文挑战的第3天,活动详情查看:. 收到测试环境集群告警,登陆K8s集群进行排查. 查看kube-system node2节点calico pod异常. 查看详细信息,查看node2节点没有存储空间,cgroup泄露. 登陆node2查看服务器存储信息,目前空间还很充足. 集群使用到的分布式存储为ceph,因此查看ceph集群状态.

K8S 故障处理 - chalon - 博客园

- -
问题1:K8S集群服务访问失败. 原因分析:证书不能被识别,其原因为:自定义证书,过期等. 问题2:K8S集群服务访问失败. 原因分析:端口映射错误,服务正常工作,但不能提供服务. 解决方法:删除svc,重新映射端口即可. 问题3:K8S集群服务暴露失败. 解决方法:删除svc,重新映射端口即可. 问题4:外网无法访问K8S集群提供的服务.