首先我们需要准备三台2核/4G的云服务器(搭建k8s最低标准),我选择的是青云,链接如下:青云官网
由于我们要搭建k8s集群,所以我们使用VPC网络来管理我们三台ESC(云服务器)
什么是VPC网络?
可以把VPC想象成一个大型网络,我们可以在VPC中创建多个私有网络,私有网络中部署我们三台云服务器,私有网络之间是隔离的。三台ESC之间相互通信通过它们各自的内网ip即可(使用公网IP也可以通信,不过会浪费很多流量)
我们一定要确保三台ESC处于同一个私有网络,处于同一个VPC中,并且三台ESC之间可以互相访问(相互可以ping通),使用的安全组策略也是相同的!
三台ESC都需要执行
# 安装yum、wget工具
yum install -y yum-utils
yum install -y wget
# 配置yum镜像源
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装指定版本docker
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
# 启动docker
systemctl enable docker --now
# 创建docker文件夹
mkdir -p /etc/docker
# 生成daemon.json配置文件
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启docker
systemctl restart docker
三台ESC都需要执行
# 为每台ESC设置自己的域名,例如:k8s-master
hostnamectl set-hostname xxxx
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 允许 iptables 检查桥接流量
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
EOF
# 使配置生效
sysctl --system
三台ESC都需要执行
# 配置K8S的镜像源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
# 安装K8S三剑客:kubelet、kubeadm、kubectl
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
# 启动kubelet(每个ESC),除了kubelet其他组件启动都是通过镜像
systemctl enable --now kubelet
# 下载镜像(除了三剑客,其余组件通过镜像启动)
tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
# 为上述images.sh文件赋予权限
chmod +x ./images.sh && ./images.sh
# 查看镜像
docker images
首先在主节点ESC上使用命令获取ip
# 获取ip地址
ip a
# 告诉每个节点(包含主节点),Master节点的位置
echo "172.31.0.2 cluster-endpoint" >> /etc/hosts
# ping通域名,说明成功
ping cluster-endpoint
# 主节点初始化(2、3行需要与第一个命令对应)
kubeadm init \
--apiserver-advertise-address=172.31.0.2 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16
# 根据控制台成功信息指示,Master节点执行下述命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看节点(主节点)
kubectl get nodes
通过查看节点得知,我们虽然部署了Master节点,但是主节点并不是Ready状态,需要安装部署好Calico
组件,才能使主节点准备就绪(下述命令主节点执行):
# 下载配置文件(Master节点)
curl https://docs.projectcalico.org/manifests/calico.yaml -O\
# 根据配置文件部署网络插件
kubectl apply -f calico.yaml
Worker节点执行:
# Worker节点加入K8S集群
# 如果token失效参考:https://blog.csdn.net/weixin_46594796/article/details/127217692
kubeadm join cluster-endpoint:6443 --token x5g4uy.wpjjdbgra92s25pp \
--discovery-token-ca-cert-hash sha256:6255797916eaee52bf9dda9429db616fcd828436708345a308f4b917d3457a22
# 使用wget下载dashboard配置文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
# 修改recommended.yaml配置文件(添加两处),参考下图
# 在spec和containers之间添加主节点hostname
# nodeName: k8s-master
# 参考:https://blog.csdn.net/weixin_42073629/article/details/117140818
vi recommended.yaml
# 根据配置文件安装dashboard
kubectl apply -f recommended.yaml
# 设置dashboard访问端口
# 将type: ClusterIP 改为 type: NodePort,参考下图
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 使用该命令得到dashboard访问端口(得到端口号记得添加到安全组,否则无法访问)
# 得到端口号,使用K8S集群中任意服务器ip + 端口,就可以访问到dashboard(使用https协议)
kubectl get svc -A |grep kubernetes-dashboard
# 想要登录到dashboard需要创建访问账号
# 创建dash-usr.yaml配置文件,粘贴以下内容
vi dash-usr.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
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: kubernetes-dashboard
# 应用账号配置文件
kubectl apply -f dash-usr.yaml
# 获取dashboard访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"