Kubernetes系列之一快速部署一套K8s集群(kubeadm方式)

最近本人在重温云原生相关的技术,说到云原生,必然绕不开Kubernetes,今天想跟大家聊的就是大名顶顶的Kubernetes。相信很多朋友在学习和使用Kubernetes的过程遇到各式各样不同的问题。我将从一个初学者的角度来给大家讲解一下Kubernete从安装、到架构以及生产中的使用。

1、生产环境可部署Kubernetes集群的两种方式

目前生产部署Kubernetes集群主要有两种方式:

  • kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

  • 二进制包

从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

这里采用kubeadm搭建集群。

kubeadm工具功能:

  • ****kubeadm init:****初始化一个Master节点
  • ****kubeadm join:****将工作节点加入集群
  • ****kubeadm upgrade:****升级K8s版本
  • ****kubeadm token:****管理 kubeadm join 使用的令牌
  • ****kubeadm reset:****清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改
  • ****kubeadm version:****打印 kubeadm 版本

****kubeadm alpha:****预览可用的新功能

2、准备环境

服务器要求:

  • 建议最小硬件配置:2核CPU、2G内存、20G硬盘
  • 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点

软件环境:

|------------|---------------|
| 软件 | 版本 |
| 操作系统 | Rocky Linux 9 |
| Docker | 20-ce |
| Kubernetes | 1.28.2 |

服务器规划:

|------------|--------------|
| 角色 | IP |
| k8s-master | 192.168.1.71 |
| k8s-node1 | 192.168.1.72 |
| k8s-node2 | 192.168.1.73 |

架构图:

3、操作系统初始化配置【所有节点】

bash 复制代码
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时

# 关闭swap
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

# 根据规划设置主机名
hostnamectl set-hostname <hostname>

# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.1.71 k8s-master
192.168.1.72 k8s-node1
192.168.1.73 k8s-node2
EOF

# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
vm.swappiness=0
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables=1
EOF

#加载br_netfilter模块,并查看
modprobe br_netfilter && lsmod | grep br_netfilter

sysctl --system  # 生效

4、安装Docker/kubeadm/kubelet【所有节点】

4.1 安装Docker
bash 复制代码
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
4.2 配置镜像下载加速器
bash 复制代码
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

systemctl restart docker
docker info
4.3 安装cri-dockerd

Kubernetes v1.24移除docker-shim的支持,而Docker Engine默认又不支持CRI标准,因此二者默认无法再直接集成。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的桥梁,从而能够让Docker作为Kubernetes容器引擎。

如图所示:

下载cri-docker

bash 复制代码
wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.15/cri-dockerd-0.3.15.amd64.tgz

解压cri-docker

bash 复制代码
tar -xvf cri-dockerd-0.3.15.amd64.tgz --strip-components=1 -C /usr/local/bin/

下载cri-docker service文件

bash 复制代码
wget -O /etc/systemd/system/cri-docker.service https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service 

wget -O /etc/systemd/system/cri-docker.socket https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket

指定依赖镜像地址:

bash 复制代码
vim /etc/systemd/system/cri-docker.service
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --cri-dockerd-root-directory=/var/lib/docker

编辑cri-docker.server

bash 复制代码
vim /etc/systemd/system/cri-docker.socket
ListenStream=/var/run/cri-dockerd.sock
bash 复制代码
systemctl daemon-reload 
systemctl enable cri-docker && systemctl start cri-docker
4.4 添加阿里云YUM软件源
bash 复制代码
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF
4.5 安装kubeadm,kubelet和kubectl
bash 复制代码
yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2
systemctl enable kubelet

5、部署Kubernetes Master

在192.168.1.71(Master)执行。

bash 复制代码
kubeadm init \
  --apiserver-advertise-address=192.168.1.71 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.2 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
  --ignore-preflight-errors=all
  • --apiserver-advertise-address 集群通告地址
  • --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
  • --kubernetes-version K8s版本,与上面安装的一致
  • --service-cidr 集群内部虚拟网络,Pod统一访问入口
  • --pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
  • --cri-socket 指定cri-dockerd接口,如果是containerd则使用--cri-socket unix:///run/containerd/containerd.sock

初始化完成后,最后会输出一个join命令,先记住,下面用。

拷贝kubectl使用的连接k8s认证文件到默认路径:

bash 复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看工作节点:

bash 复制代码
kubectl get nodes
NAME               STATUS     ROLES            AGE   VERSION
k8s-master   NotReady   control-plane          20s   v1.28.2

加入Kubernetes Node

在192.168.1.72/73(Node)执行。

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令并手动加上--cri-socket=unix:///var/run/cri-dockerd.sock:

bash 复制代码
kubeadm join 192.168.1.71:6443 --token cxoka7.sdqnph9vhwyc94xh \
	--discovery-token-ca-cert-hash sha256:a8e49f249b2b71c61dea230cd1674aa39093c050fe69bd61411368c74079b5d1  --cri-socket=unix:///var/run/cri-dockerd.sock

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

bash 复制代码
kubeadm token create --print-join-command

6、部署容器网络(CNI)

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

下载YAML:

bash 复制代码
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/calico.yaml

下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。这一点在老版本需要修改文件,在新版本里面已经不需要了。

修改完后文件后,部署:

bash 复制代码
kubectl apply -f calico.yaml
kubectl get pods -n kube-system

等Calico Pod都Running,节点也会准备就绪。

注:以后所有yaml文件都只在Master节点执行。

安装目录:/etc/kubernetes/

组件配置文件目录:/etc/kubernetes/manifests/

参考资料:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network

7、部署 Dashboard

Dashboard是官方提供的一个UI,可用于基本管理K8s资源。

YAML下载地址:

bash 复制代码
https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

文件名是:kubernetes-dashboard.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

bash 复制代码
vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort
...

kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard

访问地址:https://NodeIP:30001

创建service account并绑定默认cluster-admin管理员集群角色:

bash 复制代码
# 创建用户
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
# 获取用户Token
kubectl create token dashboard-admin -n kubernetes-dashboard

使用输出的token登录Dashboard。

以上是我本人一步一个脚印实战下来总结的基于kubeadm方式快速部署一套Kubernetes集群的步骤,如有不对的地方,还请大家多批评指正!

相关推荐
陈小肚3 小时前
k8s 1.28.2 集群部署 MinIO 分布式集群
分布式·容器·kubernetes
妍妍的宝贝3 小时前
k8s 的网络通信
网络·容器·kubernetes
H9455723 小时前
k8s中的存储
linux·容器·kubernetes
辉(子枕)3 小时前
k8s考试项目搭建
云原生·容器·kubernetes
Weirdo丨5 小时前
Docker进入容器运行命令
运维·后端·docker·容器
Bonne journée5 小时前
k8s为什么用Calico
云原生·容器·kubernetes
Deutsch.6 小时前
kubernetes中微服务部署
微服务·容器·kubernetes
kiraraLou7 小时前
【docker】mysql8.0 的 docker 安装
运维·docker·容器
凌虚7 小时前
Kubernetes:Seccomp、AppArmor、SELinux & Pod 安全性标准和准入
运维·后端·kubernetes