一、创建主机及基础配置
1.安装VMware
点击Fusion and Workstation | VMware
2.安装镜像
镜像采用CentOS-Stream-10-latest版本
百度网盘:
链接:https://pan.baidu.com/s/1a86DYVgeWZHENFnV8y3VdQ?pwd=kmyn
提取码:kmyn
名称 | k8s-master | k8s-node1 | k8s-node2 |
内存 | 4G | 4G | 4G |
cpu | 2核2个 | 2核2个 | 2核2个 |
硬盘 | 60G | 60G | 60G |
IP | 192.168.20.100 | 192.168.20.101 | 192.168.20.102 |
3.网络配置(静态)
vi /etc/NetworkManager/system-connections/ens33.nmconnection
# 修改为静态IP(根据自己网关修改)
method=manual
address1=192.168.20.100/24,192.168.20.2
dns=8.8.8.8;114.114.114.114
# 重启生效网络
nmcli c reload
nmcli c up ens33
4.修改主机名
# 修改主机名(node也做)
hostname k8s-master
bash
# 添加映射
vi /etc/hosts
# 写入
192.168.20.100 k8s-master
192.168.20.101 k8s-node1
192.168.20.102 k8s-node2
5.安装基础插件
yum -y install wget vim net-tools telnet
6.关闭防火墙(永久关闭)
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
vi /etc/selinux/config
# 修改SELINUX
SELINUX=disabled
# 关闭swap
sed -ri 's/.*swap.*/#&/' /etc/fstab
或vi /etc/fstab
# 临时关闭命令
setenforce 0
swapoff -a
7.将桥接的 IPv4 流量传递到 iptables 的链
# 启用modprobe模块
modprobe overlay
modprobe br_netfilter
cat << EOF | tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
cat << EOF | 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
# 配置生效
sysctl --system
二、配置containerd仓库
1.添加阿里云仓库
# 添加仓库
dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新仓库(如遇失败再次更新即可)
dnf update
2.安装containerd
# 安装containerd
dnf -y install containerd
# 如遇安装失败先清除软件包缓存后重新安装
dnf clean packages
3.配置containerd
# 创建containerd配置文件目录
mkdir -p /etc/containerd
# 生成 containerd 的默认配置文件并保存
containerd config default | tee /etc/containerd/config.toml
# 修改containerd配置文件
vi /etc/containerd/config.toml
# 查找 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] 修改 SystemdCgroup
SystemdCgroup = true
# 查找sandbox_image = "registry.k8s.io/pause:3.8" 修改 sandbox_image
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
# 重启生效并加入自启动
systemctl restart containerd
systemctl enable containerd
三、部署k8s集群
1.添加Kubernetes仓库
# 添加Kubernetes仓库
vi /etc/yum.repos.d/kubernetes.repo
# 添加以下内容
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
# 更新仓库
dnf update
# 安装 Kubernetes modules
dnf -y install kubelet kubeadm kubectl
# 设置开机自启动
systemctl enable kubelet
2.创建containerd的crictl配置文件
# 创建containerd的crictl配置文件
tee /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
# 验证连接
crictl images
3.修改containerd源(国内源)
# 备份当前配置
cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
# 添加 DaoCloud 镜像配置
# 找到[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
# 添加以下内容
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.m.daocloud.io"]
# 重启 containerd
systemctl restart containerd
# 拉取镜像测试
crictl pull nginx:latest
成功如下图:
4.初始化(master)
# 初始化
kubeadm init \
--apiserver-advertise-address=192.168.20.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.15 \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint=k8s-master
# 将输出的kubeadm join复制
# token忘记或遗忘
kubeadm token create --print-join-command
# 初始化失败后先清除再初始化
kubeadm reset -f
rm -rf $HOME/.kube
5.配置认证
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
6.node加入集群
# 使用复制的kubeadm join命令在node1及node2节点直接运行即可
kubeadm join k8s-master:6443 --token ts3kay.xqjvqid8zpe962lx \
--discovery-token-ca-cert-hash sha256:ed3fa45c084cbefc7459c7b9404623b786187293fbee9f41706fe57c61d06693
7.配置node节点认证
# node1和node2节点创建集群目录
mkdir -p $HOME/.kube
# 将master节点的配置复制到从节点
scp $HOME/.kube/config root@k8s-node1:~/.kube/config
scp $HOME/.kube/config root@k8s-node2:~/.kube/config
scp /etc/kubernetes/admin.conf root@k8s-node1:/etc/kubernetes/
scp /etc/kubernetes/admin.conf root@k8s-node2:/etc/kubernetes/
# 修改node1和node2的ROLES标签
kubectl label node k8s-node1 kubernetes.io/role=worker1
kubectl label node k8s-node2 kubernetes.io/role=worker2
四、安装网络插件(flannel)
1.安装网络插件(三台节点均作)
# 将pod网络加入集群(三台均作)
kubectl apply -f https://cdn.jsdelivr.net/gh/flannel-io/flannel@master/Documentation/kube-flannel.yml
# 无法使用更换链接
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 查看flannel配置是否安装成功
ls /etc/cni/net.d/
# 如为空进行手动配置
cat <<EOF > /etc/cni/net.d/10-flannel.conflist
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
EOF
2.查看节点状态
kubectl get nodes
结果如下图:
五、部署kubernetes-dashboard(master)
1.获取资源配置文件
# 获取资源配置文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml
# 无法下载更换此链接
wget https://cdn.jsdelivr.net/gh/kubernetes/dashboard@v2.7.0/aio/deploy/recommended.yaml
# 都无法使用上述任一链接在浏览器输入
# 将内容复制至recommended.yaml
2.编辑资源配置文件
# 进入配置文件
vi recommended.yaml
# 显示行号
:set number
# 定位到39行,修改其提供的service资源
# 添加NodePort端口
type: NodePort
nodePort: 31000
示例:
3.部署pod应用
kubectl apply -f recommended.yaml
4. 创建admin-user账户及授权资源配置文件
cat > dashboard-adminuser.yml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
EOF
5.创建资源实例
kubectl create -f dashboard-adminuser.yml
6.查看web镜像状态
kubectl get pods -n kubernetes-dashboard
示例:
7.获取账户admin-user的Token用于登录
kubectl create token admin-user --namespace kube-system
8.访问web端
浏览器输入:https://192.168.20.100:31000
六、常见错误
1.web镜像状态错误(网络插件问题)
根据错误提示说明subnet.env缺失
# 修复
ls /run/flannel/subnet.env
# 如返回为空则新建并添加内容(所有节点)
vi /run/flannel/subnet.env
# 添加以下内容
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
# 修改权限
chmod 777 /run/flannel/subnet.env
# 重启并添加自启动
systemctl restart kubelet
systemctl enable kubelet
# 再次查看
kubectl get pods -n kubernetes-dashboard
2.虚拟机重启后出现证书过期
Unable to connect to the server: tls: failed to verify certificate: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
# 备份旧配置
mkdir -p ~/k8s-backup
sudo cp -r /etc/kubernetes/ ~/k8s-backup/
# 重新生成kubeconfig
sudo kubeadm init phase kubeconfig all
# 更新用户配置
cp /etc/kubernetes/admin.conf ~/.kube/config