前言

  • 服务器统一版本 Ubuntu 20.04

  • 搭建集群最少要两台服务器

  • 每台服务器都需要 docker、环境配置、安装 kubeadmkubeletkubectl

docker

安装 docker

sudo apt install -y docker.io # 安装Docker Engine
sudo service docker start # 启动docker服务

操作 Docker 必须要有 root 权限,直接使用 root 用户不够安全,加入 Docker 用户组是一个比较好的选择。

如果你没有使用 root 账号,则需要将当前用户加入 Docker 的用户组:

sudo usermod -aG docker ${USER} # 当前用户加入docker组

修改用户组之后,需要退出系统,重新登录 usermod 才能生效。

docker version # 输出Docker客户端和服务器各自的版本信息

配置 docker

需要将 dockeer 的驱动程序改为 systemd,配置代理镜像源,然后重启 Docker 的守护进程。

cat <<EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker	 # 配置Docker为开机自启动
sudo systemctl daemon-reload # 重新加载服务的配置文件
sudo systemctl restart docker # 重启Docker

环境配置

更新 hosts 和 hostname 配置信息

Kubernetes 使用主机名来区分集群里的节点,所以每个节点的 hostname 必须不能重名。

# 每个节点分别设置对应主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

或者

sudo vim /etc/hostname

修改完 hostname 后,重新登录,当前命令行界面连接 hostname 才会更新。

# 所有节点都修改 hosts
vim /etc/hosts 192.168.77.100 master
192.168.77.101 node1
192.168.77.102 node2

iptables 配置

为了让 Kubernetes 能够检查、转发网络流量,需要修改 iptables 的配置,并启用 br_netfilter模块。

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF sudo sysctl --system # 手动加载所有的配置文件

关闭 swap 分区

关闭 Linuxswap 分区,提升 Kubernetes 的性能。

# 临时关闭
sudo swapoff -a
# 永久关闭:注释 swap 挂载,给 swap 这行开头加一下 "#" 注释
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

为什么要关闭 swap 交换分区?

Swap 交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm 初始化的时候会检测 swap 是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s 的时候可以指定 --ignore-preflight-errors=Swap 来解决。

安装 kubeadm、kubelet 和 kubectl

更新使用阿里云镜像源

sudo apt install -y apt-transport-https ca-certificates curl

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF sudo apt update

下载

apt 默认会下载最新版本,也可以指定版本号。

sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00

安装完成之后,可以用 kubeadm versionkubectl version 来验证版本是否正确。

systemctl enable kubelet.service # 配置kubelet为开机自启动

版本锁定

锁定这三个软件的版本,避免意外升级导致版本错误。

sudo apt-mark hold kubeadm kubelet kubectl

下载 Kubernetes 组件镜像

更新,可以直接用这种方式

kubeadm init \
--apiserver-advertise-address=192.168.137.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

历史,以下方式也适用

Kubernetes 组件镜像是放在 Google 自己的镜像仓库网站 gcr.io,国内访问不了,需要提前把镜像下载到本地。

命令 kubeadm config images list 可以查看安装 Kubernetes 所需的镜像列表,参数 --kubernetes-version 可以指定版本号:

kubeadm config images list --kubernetes-version v1.23.3

k8s.gcr.io/kube-apiserver:v1.23.3
k8s.gcr.io/kube-controller-manager:v1.23.3
k8s.gcr.io/kube-scheduler:v1.23.3
k8s.gcr.io/kube-proxy:v1.23.3
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6

shell 自动化下载镜像

shell 自动化从国内镜像网站下载,然后再用 docker tag 改名。

repo=registry.aliyuncs.com/google_containers

for name in `kubeadm config images list --kubernetes-version v1.23.3`; do

    src_name=${name#k8s.gcr.io/}
src_name=${src_name#coredns/} docker pull $repo/$src_name docker tag $repo/$src_name $name
docker rmi $repo/$src_name
done

如果国内镜像网站不提供服务,或者修改了镜像,此方法将会失败,请对比所需的镜像列表是否一致。

修改 kubelet 启动参数

添加 kubelet 的启动参数--node-ip=公网IP, 每个主机都要添加并指定对应的公网 ip,添加了这一步才能使用公网 ip 来注册进集群。

systemctl status kubelet # 查看kubelet运行状态、加载配置文件路径

 kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Wed 2023-03-15 17:57:03 CST; >
Docs: https://kubernetes.io/docs/home/
Process: 14400 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $K>
Main PID: 14400 (code=exited, status=1/FAILURE)
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 最后一行添加公网IP
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=<公网Ip>

如果文件不存在,则新增 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件,增加如下内容

vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

https://raw.githubusercontent.com/kubernetes/release/v0.15.1/cmd/kubepkg/templates/latest/rpm/kubeadm/10-kubeadm.conf

初始化 master 节点

选择一个节点作为master,仅在master节点初始化。

若失败了可以用 kubeadm reset 重置,删除 $HOME/.kube 后,再 kubeadm init 初始化。

sudo kubeadm init \
--apiserver-advertise-address=<公网IP> \
--control-plane-endpoint=<公网IP> \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version=v1.23.3 # --apiserver-advertise-address: 指定master服务发布的ip地址
# --control-plane-endpoint: 可用于为所有控制平面节点设置共享端点,允许IP地址和可以映射到IP地址的DNS名称,例如 192.168.77.100 master
# --image-repository: 指定镜像源
# --service-cidr: 指定service网络的IP地址范围
# --pod-network-cidr: 指定pod网络的IP地址范围
# --kubernetes-version: 指定k8s版本

因为已经提前把镜像下载到了本地,所以 kubeadm 的安装过程很快就完成了。

Your Kubernetes control-plane has initialized successfully!

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 You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root: kubeadm join 192.168.77.100:6443 --token m93vq1.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxx201631b982ffc0e7593d4d845e9c916bb7b512081f510 \
--control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.77.100:6443 --token m93vq1.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxx201631b982ffc0e7593d4d845e9c916bb7b512081f510

按照提示,在本地建立一个 .kube 目录,然后拷贝 kubectl 配置文件,改变文件关联用户组权限。

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

kubeadm join 提示,其他节点要加入集群必须要用指令里的 tokenca 证书,这条命令需要保存好,在 node 节点执行。

使用 Calico 网络插件

上述 master 节点初始化后,可以使用 kubectl get node 来检查 kubernetes 集群节点状态,当前 master 节点的状态为 NotReady,这是由于缺少网络插件,集群的内部网络还没有正常运作。

可以在 Calico 的网站(https://www.tigera.io/project-calico/)上找到它的安装方式,需要注意 Calico 版本支持适配的 kubernets 版本。

Kubernetes 版本 Calico 版本 Calico YAML文件
1.18、1.19、1.20 3.18 https://projectcalico.docs.tigera.io/archive/v3.18/getting-started/kubernetes/requirements https://projectcalico.docs.tigera.io/archive/v3.18/manifests/calico.yaml
1.19、1.20、1.21 3.19 https://projectcalico.docs.tigera.io/archive/v3.19/getting-started/kubernetes/requirements https://projectcalico.docs.tigera.io/archive/v3.19/manifests/calico.yaml
1.19、1.20、1.21 3.20 https://projectcalico.docs.tigera.io/archive/v3.20/getting-started/kubernetes/requirements https://projectcalico.docs.tigera.io/archive/v3.20/manifests/calico.yaml
1.20、1.21、1.22 3.21 https://projectcalico.docs.tigera.io/archive/v3.21/getting-started/kubernetes/requirements https://projectcalico.docs.tigera.io/archive/v3.21/manifests/calico.yaml
1.21、1.22、1.23 3.22 https://projectcalico.docs.tigera.io/archive/v3.22/getting-started/kubernetes/requirements https://projectcalico.docs.tigera.io/archive/v3.22/manifests/calico.yaml
1.21、1.22、1.23 3.23 https://projectcalico.docs.tigera.io/archive/v3.23/getting-started/kubernetes/requirements https://projectcalico.docs.tigera.io/archive/v3.23/manifests/calico.yaml
1.22、1.23、1.24 3.24 https://projectcalico.docs.tigera.io/archive/v3.24/getting-started/kubernetes/requirements https://projectcalico.docs.tigera.io/archive/v3.24/manifests/calico.yaml
wget https://projectcalico.docs.tigera.io/archive/v3.24/manifests/calico.yaml

Calico 使用的镜像较大,如果安装超时,可以考虑在每个节点上预先使用 docker pull 拉取镜像:

# 从calico.yaml文件中,找到需要下载的镜像源
docker pull docker.io/calico/kube-controllers:v3.24.5
docker pull docker.io/calico/node:v3.24.5
docker pull docker.io/calico/pod2daemon-flexvol:v3.24.5
docker pull docker.io/calico/cni:v3.24.5

Calico 安装使用 kubectl apply即可:

kind: DaemonSet
apiVersion: apps/v1
metadata:
name: calico-node
namespace: kube-system
labels:
k8s-app: calico-node
spec:
...
containers:
...
env:
...
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
...
- name: IP_AUTODETECTION_METHOD
value: "can-reach=${DNS 服务器 IP 地址}"

去掉 CALICO_IPV4POOL_CIDR 注释,并配置 value 值,使其与 pod_network_cidr 配置项保持一致

增加 IP_AUTODETECTION_METHOD 配置项,value 值后面的网段配置为 DNS 服务器 IP 地址

# 如下我的配置
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
- name: IP_AUTODETECTION_METHOD
value: "can-reach=8.8.8.8" # 最后执行calico安装
kubectl apply -f calico.yaml

安装 Worker 节点

worker 节点机器上,使用 master 初始化成功后的 join 命令:

kubeadm join 192.168.77.100:6443 --token m93vq1.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxx201631b982ffc0e7593d4d845e9c916bb7b512081f510

它会连接 master 节点,然后拉取镜像,安装网络插件,最后把节点加入集群。

如果 join 命令找不到了,可以创建新的 token

kubeadm token create --print-join-command

如果遇到拉取镜像的问题,同样使用 docker pull 下载到本地即可。

worker 节点完成运行后,在 master 节点上 kubectl get node可以看到各个节点状态变为 Ready

kubectl get node

NAME     STATUS   ROLES                  AGE   VERSION
master Ready control-plane,master 16h v1.23.3
node1 Ready <none> 15h v1.23.3
node2 Ready <none> 15h v1.23.3

Console 节点

Console 节点的部署工作更加简单,它只需要安装一个 kubectl,然后复制“config”文件就行,你可以直接在 Master 节点上用“scp”远程拷贝,例如:

scp `which kubectl` niuben@192.168.56.2:~/
scp ~/.kube/config niuben@192.168.56.2:~/.kube

Ubuntu20.04搭建k8s v1.23.3版本集群的更多相关文章

  1. kubeadm部署k8s v1.19.4版本集群

    1. 准备2台2c4g虚机 配置地址192.168.198.144,192.168.198.146,一台作为master,一台作为node 2. 部署环境准备,每一台虚机都需要操作 # 关闭防火墙sy ...

  2. Ubuntu20.04搭建web服务器

    其他Ubuntu20以及Ubuntu18系列也可以!

  3. ansible-kubeadm在线安装k8s v1.19-v1.20版本

    ansible-kubeadm在线安装k8s v1.19-v1.20版本 1. ansible-kubeadm在线安装k8s v1.19-v1.20版本 安装要求 确保所有节点系统时间一致 操作系统要 ...

  4. 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群

    需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...

  5. 基于hadoop2.6.0搭建5个节点的分布式集群

    1.前言 我们使用hadoop2.6.0版本配置Hadoop集群,同时配置NameNode+HA.ResourceManager+HA,并使用zookeeper来管理Hadoop集群 2.规划 1.主 ...

  6. Haproxy+Keepalived搭建Weblogic高可用负载均衡集群

    配置环境说明: KVM虚拟机配置 用途 数量 IP地址 机器名 虚拟IP地址 硬件 内存3G  系统盘20G cpu 4核 Haproxy keepalived 2台 192.168.1.10 192 ...

  7. 三分钟快速搭建分布式高可用的Redis集群

    这里的Redis集群指的是Redis Cluster,它是Redis在3.0版本正式推出的专用集群方案,有效地解决了Redis分布式方面的需求.当单机内存.并发.流量等遇到瓶颈的时候,可以采用这种Re ...

  8. 搭建hbase1.2.5完全分布式集群

    简介 有一段时间,没写博客了,因为公司开发分布式调用链追踪系统,用到hbase,在这里记录一下搭建过程 1.集群如下: ip 主机名 角色 192.168.6.130 node1.jacky.com ...

  9. linux -- 基于zookeeper搭建yarn的HA高可用集群

    linux -- 基于zookeeper搭建yarn的HA高可用集群 实现方式:配置yarn-site.xml配置文件 <configuration> <property> & ...

  10. 摘要: CentOS 6.5搭建Redis3.2.8伪分布式集群

    from https://my.oschina.net/ososchina/blog/856678     摘要: CentOS 6.5搭建Redis3.2.8伪分布式集群 前言 最近在服务器上搭建了 ...

随机推荐

  1. 龙哥量化:注册simnow上期所的期货仿真模拟交易账户教程步骤

    永远顺着趋势交易 在技术分析这种市场研究方法中,趋势的概念绝对是核心内容.分析师所使用的全部工具, 诸如支撑和阻挡水平.价格形态.移动平均线.趋势线等等,其唯一的目的就是辅助我们估量市场趋势, 从而顺 ...

  2. [转]怎么使用PyCharm编写Python程序,简单教程

    原文链接:怎么使用PyCharm编写Python程序,简单教程.

  3. 创建Windows service使用FluentScheduler定时刷新网页

    我们都知道iis的程序池默认的闲置回收时间是20分钟, 如果是自己的服务器,我们可以设置成0,闲置不回收. 这样网站就不会出现每隔20分钟没有访客访问就出现打开非常慢的情况. 但是,如果个别网站不是用 ...

  4. 搭建gitlab私有仓库

    1.下载gitlab 首先在 /etc/yum.repos.d/目录下配置gitlab下载镜像源. # 进入目录 /etc/yum.repos.d/ cd /etc/yum.repos.d/ # 创建 ...

  5. JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

    即将过去的 2024 年,是 JuiceFS 开源版本推出的第 4 年,企业版的第 8 个年头.回顾过去这一年,JuiceFS 社区版依旧保持着快速成长的势头,GitHub 星标突破 11.1K,各项 ...

  6. Solution -「PKUWC 2018」「洛谷 P5298」Minimax

    \(\mathscr{Description}\)   Link.   给定一棵二叉树,每片叶子有一个权值,所有权值互不相同.每个非叶结点 \(u\) 有一个概率 \(p_u\in(0,1)\),表示 ...

  7. 使用iText对PDF文件签章和验章

    PDF是国际板式文件标准,使用的范围很广.OFD为国产板式文件标准,设计起点很高,天然支持国产签名算法(SM2.SM3):具有后发优势,目前市场占有率仍然很低,前途光明而又漫长.PDF标准并不支持国产 ...

  8. ctfshow--web1

    第一题很简单 就是一个base64编码 我们打开开发者模式看源代码 Y3Rmc2hvd3s1MGMyZDdkYS1lOWZjLTQ5YzItYTRjZC1iZmJmZjIyYmI4NWV9将这段话ba ...

  9. DataV Note:让数据自己讲故事

    您是否常常因为面对那些充满各类指标的汇报报告而感到困扰?我们或许能帮到您! ‍「我们是一家国内的服装公司,财年结束了,公司的销售团队需要对公司的销售数据进行分析,以指导下个财年的作战方向」 ‍「我是浙 ...

  10. 注册全局组件(H5) 任意页面使用

    在view下创建components文件夹. 在components下创建文件夹base. base文件夹是用来存放 基础组件的. 比如说页面中很多处都在使用的公共组件 如你需要自定义的按钮 在com ...