先准备三台虚拟主机(一主二从),虚拟机配置为(master节点2CPU3G内存20G硬盘,node节点1CPU2G内存20G硬盘),虚拟机安装软件为VirtualBox7.0
编辑三台虚拟机的/etc/hosts文件
vi /etc/hosts
kubernetes要求集群中的节点必须精确一致,这里所以chronyd服务从网络同步时间
企业中建议配置内部的时间同步服务器
# 启动chronyd服务
systemctl start chronyd
# 设置chronyd服务开机自启
systemctl enable chronyd
# chronyd服务启动几秒钟后使用date命令验证时间
date
kuberbetes和docker在运行中会产生大量的iptables规则,为了不让系统规则和它们混淆,直接关闭系统的规则
# 关闭firewalld服务
systemctl stop firewalld
# 禁止firewalld服务开机自启
systemctl disable firewalld
selinux是Liunx系统下的一个安全服务,如果不关闭它,在安装集群中会出现各种问题
# 执行命令
setenforce 0
# 执行命令
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
kubernetes要求每个节点都需要禁用swap分区,不然会对集群造成极大的性能影响
编辑/etc/fstab文件,注释掉swap分区一行
vi /etc/fstab
我这里安装虚拟机的时候选的手动分区,我没有使用swap分区,所以可以省略这一步
为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。例如:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
在kubernetes中service有两种代理模型,一种是iptables一种是ipvs
两者比较的话,ipvs性能要更好一点,但是如果要使用它,需要手动载入ipvs模块
确保 IPVS 所需的内核模块
(用于 Linux 内核 4.19 及更高版本)nf_conntrack
(用于 Linux 内核 4.19 以下版本)nf_conntrack_ipv4
查看内核版本
uname -a
在使用 IPVS 模式之前,还应在节点上安装诸如 之类的软件包。ipset
如果不满足这些要求,Kube-proxy 将回退到 IPTABLES 模式。
参见IPVS官方说明
# 安装ipset和ipvsadm
dnf install ipset ipvsadm -y
# 编写启动模块脚本
vi ipvs.modules
添加内容如下
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
# 启动模块
chmod +x ipvs.modules
/bin/bash ipvs.modules
# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack
Kubernetes从1.24开始移除了dockershim,所以这里用官方推荐的containerd.io,具体说明看一看官方文档容器运行时
这里用docker的仓库安装容器运行时,比较方便,但是这种方式不会安装CNI插件,具体参见容器入门
# 配置镜像源
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装
dnf install containerd.io-1.6.15-3.1.el9 -y
从 https://github.com/containernetworking/plugins/releases
下载压缩包,然后执行以下命令
$ mkdir -p /opt/cni/bin
$ tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz
这里记录一下下面配置文件的说明文档CRI 插件配置指南
# 创建containerd默认配置目录,并将现有的默认配置导出
containerd config default | sudo tee /etc/containerd/config.toml
#
vi /etc/containerd/config.toml
sandbox_image
修改为registry.aliyuncs.com/google_containers/pause:3.9
或者registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
,总之和下面拉取集群镜像的仓库保持一致就行
SystemdCgroup
修改为true
修改完启动或重启containerd服务
systemctl enable --now containerd
由于kubernetes镜像仓库在国外,所以这里采用阿里云镜像仓库
# 编辑/etc/yum.repos.d/kubernetes.repo
vi /etc/yum.repos.d/kubernetes.repo
添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
# 安装kubeadm,kubectl,kubelet
dnf install kubelet-1.26.0-0 kubeadm-1.26.0-0 kubectl-1.26.0-0 -y
crictl 是 CRI 兼容的容器运行时命令行接口,你可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。使用 crictl 对 Kubernetes 节点进行调试
vi /etc/crictl.yaml
设置为如下内容:
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
设置kubelet开机自启
systemctl enable --now kubelet
在安装kubernetes集群之前,需要先准备好集群需要的镜像,所需镜像可以通过下面命令查看
kubeadm config images list
上面命令展示出来的都是k8s官方仓库的镜像,没有梯子拉不下来,所以从阿里云的镜像仓库中拉取,写个脚本,内容如下:
#!/bin/bash
images=(
kube-apiserver:v1.26.0
kube-controller-manager:v1.26.0
kube-scheduler:v1.26.0
kube-proxy:v1.26.0
pause:3.9
etcd:3.5.6-0
coredns:v1.9.3)
for imageName in ${images[@]};
do
crictl pull registry.aliyuncs.com/google_containers/$imageName
done
然后执行这个脚本
下面的操作只需要在master集群上执行即可
先写个配置文件来代替命令参数,导出默认参数然后修改(可以使用 kubeadm config print 命令打印出默认配置。
如果你的配置没有使用最新版本, 推荐使用 kubeadm config migrate 命令进行迁移。)
# 导出默认参数为kubeadm.yml
kubeadm config print init-defaults --component-configs KubeletConfiguration > kubeadm.yml
# 根据实际情况修改一些参数
vi kubeadm.yml
localAPIEndpoint:
# 修改为虚拟机地址
advertiseAddress: 192.168.31.100
bindPort: 6443
nodeRegistration:
# 修改为安装的容器运行时
criSocket: unix:///run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
# 修改为master节点的主机名
name: rocky1
# 修改镜像源为阿里的镜像源
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.26.0
networking:
serviceSubnet: "10.96.0.0/16"
# 配置一个没有使用的网段
podSubnet: "10.244.0.0/16"
dnsDomain: "cluster.local"
在最后加上这段内容,设置kublet的代理模式为IPVS
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
# kube-proxy specific options here
mode: ipvs
kubeadm命令都可以用上--config 配置文件地址
来代替一些额外的运行参数,参考官网kubeadm配置说明
# 初始化集群
kubeadm init --config kubeadm.yml
集群创建完成后执行下列命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
集群启动后在master节点上执行安装网络插件的命令,否则nodes状态为NotReady
一般来都是从网页上拉取并应用,也可以提前准备一个网络插件的资源文件,这里用的是Flannel
执行下列命令
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
建议提前下载kube-flannel.yml文件然后上传到服务器中执行
kubectl apply -f kube-flannel.yml
稍等几分钟再执行kubectl get nodes
,等到所有Node状态都是Ready时,执行下列命令清除污点
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl create deployment nginx --image=nginx:1.14
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod
kubectl get service