Ubuntu安装k8s

虚拟机基础设置

修改虚拟机网络为桥接模式

换源

Ubuntu采用apt作为软件安装工具,其镜像源列表记录在/etc/apt/sources.list文件中。

首先将sources.list复制为sources.list.bak备份,然后将sources.list内容改为以下内容:

deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
 
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
 
## Pre-released source, not recommended.
# deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
 
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
 
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
 
## Pre-released source, not recommended.
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
 
## Pre-released source, not recommended.
# deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
 
deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-backports main restricted universe multiverse
 
# deb-src http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ jammy-backports main restricted universe multiverse
 
## Pre-released source, not recommended.
# deb http://mirrors.163.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ jammy-proposed main restricted universe multiverse

最后更新一下即可

sudo apt update

设置主机名

master节点

sudo hostnamectl set-hostname master

其他节点

sudo hostnamectl set-hostname node1
sudo hostnamectl set-hostname node2

注:使用 hostnamectl 命令修改的主机名会被永久修改,保存到文件中,并且不需要重启系统就会生效。

配置静态ip

各个节点都要设置,下面以master为例

在这里插入图片描述

时间同步

sudo apt install ntp
systemctl start ntp
systemctl enable ntp

安装ssh

sudo apt update
sudo apt install openssh-server
sudo systemctl status ssh

安装好ssh后可以用Xshell软件连接,直接在物理机中使用,免去了频繁切换的麻烦。

Ubuntu系统设置

禁用swap

在Linux下,SWAP的作用类似Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。

SWAP意思是交换,顾名思义,当某进程向OS请求内存发现不足时,OS会把内存中暂时不用的数据交换出去,放在SWAP分区中,这个过程称为SWAP OUT。当某进程又需要这些数据且OS发现还有空闲物理内存时,又会把SWAP分区中的数据交换回物理内存中,这个过程称为SWAP IN。

当然,swap大小是有上限的,一旦swap使用完,操作系统会触发OOM-Killer机制,把消耗内存最多的进程kill掉以释放内存。

Swap会导致docker的运行不正常,性能下降,是个bug,但是后来关闭swap就解决了,就变成了通用方案。

sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

这步之后,最好重启ubuntu系统保证修改生效。

修改内核参数

载入如下内核模块

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

sudo modprobe overlay
sudo modprobe br_netfilter

配置下面的网络参数:

sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

运行下面的command使改动生效:

sudo sysctl --system

开启ipvs

在kubernetes中service有两种代理模型,一种是基于iptables(链表),另一种是基于ipvs(hash表)。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块。

(1)安装ipset和ipvsadm

apt install -y ipset ipvsadm

(2)配置加载模块

cat > /etc/modules-load.d/ipvs.conf << EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

(3)临时加载

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh

(4)开机加载配置,将ipvs相关模块加入配置文件中

cat >> /etc/modules <<EOF
ip_vs_sh
ip_vs_wrr
ip_vs_rr
ip_vs
nf_conntrack
EOF

安装containerd

containerd是容器虚拟化技术,从docker中剥离出来,形成开放容器接口(OCI)标准的一部分。

在这里插入图片描述

docker对容器的管理和操作基本都是通过containerd完成的。Containerd 是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。详细点说,Containerd 负责干下面这些事情:

  • 管理容器的生命周期(从创建容器到销毁容器)
  • 拉取/推送容器镜像
  • 存储管理(管理镜像及容器数据的存储)
  • 调用 runC 运行容器(与 runC 等容器运行时交互)
  • 管理容器网络接口及网络

具体安装步骤如下:

(1)安装dependencies

sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

(2)添加阿里云containerd镜像

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

(3)安装containerd

sudo apt update
sudo apt install -y containerd.io

(4)配置containerd使用systemd作为cgroup

containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

(5)接着修改/etc/containerd/config.toml配置文件,如果没有该配置文件,可以用命令containerd config default > /etc/containerd/config.toml创建。将配置文件中的sandbox_image 镜像源设置为阿里云 google_containers 镜像源(所有节点)registry.aliyuncs.com/google_containers/pause

如下图所示

在这里插入图片描述

等效的shell命令如下

sed -i '/sandbox_image/s/registry\.k8s\.io\/pause/registry\.aliyuncs\.com\/google_containers\/pause/' /etc/containerd/config.toml

(6)添加 endpoint加速器

sed -i '/registry.mirrors]/a\ \ \ \ \ \ \ \ [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]' /etc/containerd/config.toml
sed -i '/registry.mirrors."docker.io"]/a\ \ \ \ \ \ \ \ \ \ endpoint = ["https://xd8h18qb.mirror.aliyuncs.com"]' /etc/containerd/config.toml

(7)重启并设置开机自启

sudo systemctl daemon-reload
sudo systemctl restart containerd
sudo systemctl enable containerd

安装Kubernetes组件

添加apt存储库

执行以下命令为 Kubernetes 添加 apt 存储库

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-jammy main"

如果有如下爆错

在这里插入图片描述

说明上面那个谷歌的源用不了,就用下面的阿里云的源

# 替换成阿里云
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
sudo apt-add-repository "deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main"

安装Kubectl, kubeadm & kubelet

sudo apt update
sudo apt install -y kubelet=1.26.0-00 kubeadm=1.26.0-00 kubectl=1.26.0-00
sudo apt-mark hold kubelet kubeadm kubectl

apt-mark 用于将软件包标记/取消标记为自动安装。 hold 选项用于将软件包标记为保留,以防止软件包被自动安装、升级或删除。这里主要是为了防止kubelet等组件自动升级。

这里指定版本是我为了后续装dashboard版本匹配。1.26.0的版本目前还是很新的,如果想装最新的,把版本号去掉即可。后续配图中的版本号会和此处的版本不一致,为了记录安装过程,我也是装了好几次,截图的时候是在另一次安装中截的,知道大概流程即可,不必过于纠结。

设置crictl

cat > /etc/crictl.yaml << EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10 
debug: false
EOF

初始化Master节点

在各节点开机启动kubelet服务

systemctl enable kubelet.service

使用kubeadm config print init-defaults 可以打印集群初始化默认的使用的配置,其中有一些需要修改的配置项:

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     #需要替换master节点IP
  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  #这个源要换成阿里的!registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.26.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16  #增加该字段,用于指定pod的网段
  serviceSubnet: 10.96.0.0/12
scheduler: {}
# 下面都是新增的
---
# 使用ipvs
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
# 指定cgroup
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

使用命令将默认配置保存为一个yaml文件

kubeadm config print init-defaults > init-config.yaml

然后用vim修改好配置项,在开始初始化集群之前可以预先在各个服务器节点上拉取k8s需要的容器镜像。

kubeadm config images pull --config init-config.yaml  #提前拉取镜像

接下来正式初始化

kubeadm init --config init-config.yaml

如果不想使用配置文件的话,可以用下面这条命令:

kubeadm init --apiserver-advertise-address=<master的ip地址> --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

当看到如下的输出时,说明系统master节点初始化完成。

在这里插入图片描述

注意:如果kubernets初始化时失败后,第二次再次执行会初始化命令会报错,这时需要进行重置

kubeadm reset

接着按照提示信息,进行后续的初始化工作:

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

完成上面的工作之后,可以尝试运行下面的command来查看当前集群的状态:

kubectl cluster-info
kubectl get nodes

输出类似如下

在这里插入图片描述

加入Node节点

在master节点的初始化输出的最下面,会列出node节点加入的command,直接copy然后到每个node节点运行即可。下面是我的机器的例子,得换成实际的command

kubeadm join 192.168.31.209:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:ee713d98083f6ba56e31f4d246a0f537e78bc02e0dbc790652f629adf7e3bcfe

token的有效期是24h,如果过期了需要重新生成token,可以使用如下命令:

kubeadm token create --print-join-command

然后copy到node节点运行即可。当然,也可以用--ttl 0参数来产生一个永不过期的token。另外,使用kubeadm token list命令可以列出当前有效的token列表。

加入成功之后,可以查看当前集群的node状态,此时由于没有安装网络相关插件,所有节点处于NotReady的状态。下一步会进行安装。

kubectl get nodes

在这里插入图片描述

配置集群网络

一般可以安装Calico、Flannel和Weave-net等插件,这里选择使用flannel。如果想用Calico可以参考官方文档,上面也有安装教程。

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

如果连接失败可以科学上网,先去把yaml文件下载下来,再拖进Ubuntu里apply。运行结果大致如下:

在这里插入图片描述

此时可以查看系统namespace下的所有基础组件的运行情况:

kubectl get pods -n kube-system

在这里插入图片描述

接下来检查节点状态:

kubectl get nodes

在这里插入图片描述

至此,整个k8s集群搭建完毕。

若在配置完Flannel后,有新节点加入集群,在master节点上get nodes会显示not ready,具体解决方案如下:

(1)查取正常集群节点所使用网段

cat /run/flannel/subnet.env

在这里插入图片描述

(2)在新节点上创建cni网络相关配置文件

mkdir -p /etc/cni/net.d/
cat <<EOF> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
EOF
mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
cat <<EOF> /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF

其中subnet.env的内容要根据上一步中查到的进行修改。

(3)然后重新查询node状态,已经变成ready了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h0l10w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值