虚拟机基础设置
修改虚拟机网络为桥接模式
换源
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了。