【K8S】Kubernetes集群搭建流程详解

时间:2022-10-11 17:53:15

一、购买云服务器

首先我们需要准备三台2核/4G的云服务器(搭建k8s最低标准),我选择的是青云,链接如下:青云官网

由于我们要搭建k8s集群,所以我们使用VPC网络来管理我们三台ESC(云服务器)

什么是VPC网络?
可以把VPC想象成一个大型网络,我们可以在VPC中创建多个私有网络,私有网络中部署我们三台云服务器,私有网络之间是隔离的。三台ESC之间相互通信通过它们各自的内网ip即可(使用公网IP也可以通信,不过会浪费很多流量)

【K8S】Kubernetes集群搭建流程详解
我们一定要确保三台ESC处于同一个私有网络,处于同一个VPC中,并且三台ESC之间可以互相访问(相互可以ping通),使用的安全组策略也是相同的!

二、搭建Docker环境

三台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

三、根据K8S官网搭建【基础环境】

三台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

四、安装K8S三剑客:kubelet、kubeadm、kubectl

三台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

五、安装K8S节点需要使用的镜像

# 下载镜像(除了三剑客,其余组件通过镜像启动)
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

六、使用kubeadm初始化Master节点

首先在主节点ESC上使用命令获取ip

# 获取ip地址
ip a

【K8S】Kubernetes集群搭建流程详解
拿到ip地址后,执行下述命令:

# 告诉每个节点(包含主节点),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

七、安装部署Calico

通过查看节点得知,我们虽然部署了Master节点,但是主节点并不是Ready状态,需要安装部署好Calico组件,才能使主节点准备就绪(下述命令主节点执行):

# 下载配置文件(Master节点)
curl https://docs.projectcalico.org/manifests/calico.yaml -O\

# 根据配置文件部署网络插件
kubectl apply -f calico.yaml

八、Worker节点加入集群

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

九、安装官方可视化界面dashboard

# 使用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

【K8S】Kubernetes集群搭建流程详解
【K8S】Kubernetes集群搭建流程详解

# 使用该命令得到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}}"

得到token令牌后,在dashboard首页输入令牌,即可登陆成功
【K8S】Kubernetes集群搭建流程详解