admin管理员组

文章数量:1029577

快速部署一套K8s集群(V1.32)

1、准备服务器环境

Kubernetes集群节点规划。

主机名

操作系统

IP地址

k8s-master

CentOS7.9_x64

192.168.111.128

k8s-node1

CentOS7.9_x64

192.168.111.129

k8s-node2

CentOS7.9_x64

192.168.111.130

集群节点运行的组件:

在上述环境中,我们选择Docker作为Kubernetes的容器运行时。因此,除了部署Kubernetes组件之外,还需部署Docker相关服务。

2、系统初始化配置

1)关闭防火墙

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

2)关闭SELinux

SELinux是Linux的一个安全机制,但使用复杂和存在兼容性问题,通常选择关闭它。

[root@localhost ~]# setenforce 0 # 临时

[root@localhost ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久

3)关闭Swap交换分区

Swap是一种虚拟内存技术,它允许系统将部分内存数据写到硬盘上的特定分区,从而释放更多物理内存。由于硬盘读写性能相比物理内存低,因此使用Swap会影响系统处理性能。并且Kubelet组件默认要求关闭Swap,以提高系统的稳定性和可靠性。

关闭Swap交换分区:

[root@localhost ~]# swapoff -a # 临时

[root@localhost ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久

  1. 设置主机名

[root@localhost ~]# hostnamectl set-hostname xxx

  1. 在master添加hosts

[root@localhost ~]# cat >> /etc/hosts << EOF

192.168.111.128 k8s-master

192.168.111.129 k8s-node1

192.168.111.130 k8s-node2

EOF

6)配置内核参数

某些Kubernetes网络插件可能会用到网络桥接(Bridge),为了确保网络桥接的数据包经过Iptables处理,启用相关的内核参数:

[root@localhost ~]# cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

[root@localhost ~]# sysctl --system

7)替换yum源:

[root@localhost ~] curl -o /etc/yum.repos.d/CentOS-Base.repo .repo

8)# 时间同步

[root@localhost ~] yum install ntpdate -y

[root@localhost ~] ntpdate time.windows

3、安装docker

在所有节点上安装并启动Docker。

下载阿里云Yum软件源文件:

[root@localhost ~]# wget .repo -O /etc/yum.repos.d/docker-ce.repo

安装指定版本Docker:

[root@localhost ~]# yum install -y docker-ce

[root@localhost ~]# cat > /etc/docker/daemon.json << EOF

{

"registry-mirrors": [";,";,";],

"exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

启动并设置开机启动:

[root@localhost ~]systemctl start docker && systemctl enable docker

4、安装cri-docker

在Kubernetes早期版本中,Docker作为默认容器运行时,并在Kubelet程序中开发了一个名为“Dockershim”的代理程序,负责Kubelet与Docker通信。

随着Kubernetes生态系统的发展,涌现出多种容器运行时,例如containerd、cri-o、rkt等。为了支持这些容器运行时,Kubernetes引入CRI(Container Runtime Interface,容器运行时接口)标准,使得第三方容器运行时只需对接CRI即可与Kubernetes集成。

后来,在Kubernetes 1.20版本发布时宣布:为了优化核心代码,减少维护负担,将在1.24版本中正式移除“Dockershim”,而当时Docker又不支持CRI,这就意味着Kubernetes无法再Docker作为容器运行时。Docker官方为了解决这个问题,与Mirantis公司合作,开发了一个名为“cri-dockerd”的代理程序,负责Kubelet与Docker通信。

因此,从Kubernetes 1.24版本及更高版本开始,使用Docker作为容器运行时,需要安装cri-dockerd。可以在GitHub Releases页面()找到适用于你系统平台版本的安装包,下载后上传到所有节点上并进行安装:

[root@localhost ~] rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm

安装完成后,修改Systemd服务文件指定依赖的Pause镜像为国内镜像地址:

[root@localhost ~] vi /usr/lib/systemd/system/cri-docker.service

ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs/google_containers/pause:3.9

启动并设置开机启动:

[root@localhost ~] systemctl start cri-docker && systemctl enable cri-docker

5、安装kubeadm和kubelet

在所有节点上安装kubeadm、kubectl和kubelet组件。但这些软件包未包含在系统默认软件源中,需要额外配置Yum软件源,例如配置阿里云的软件源:

[root@localhost ~] cat > /etc/yum.repos.d/kubernetes.repo << EOF

[kubernetes]

name=Kubernetes

baseurl=.32/rpm/

enabled=1

gpgcheck=1

gpgkey=.32/rpm/repodata/repomd.xml.key

EOF

安装指定版本kubeadm、kubectl和kubelet:

[root@localhost ~] yum install -y kubeadm-1.32.0 kubectl-1.32.0 kubelet-1.32.0

kubeadm和kubectl仅是一个集群搭建工具和管理工具,不涉及启动。而kubelet是一个守护进程程序,由kubeadm在搭建过程中自动启动,这里仅设置开机启动即可:

[root@localhost ~] systemctl enable kubelet

6、部署Master节点

在Master节点执行以下命令初始化Kubernetes管理节点:

[root@localhost ~] kubeadm init \

--apiserver-advertise-address=192.168.111.128 \

--image-repository=registry.aliyuncs/google_containers \

--kubernetes-version=v1.32.0 \

--pod-network-cidr=10.244.0.0/16 \

--service-cidr=10.96.0.0/12 \

--cri-socket=unix:///var/run/cri-dockerd.sock \

--ignore-preflight-errors=all

该命令中各参数含义如下:

--apiserver-advertise-address:指定API Server监听的IP地址。如果没有设置,将使用默认的网络接口。

--image-repository:指定镜像仓库地址。默认值为“registry.k8s.io”,但该仓库在国内无法访问,因此这里指定阿里云仓库。

--kubernetes-version:指定Kubernetes版本。

--pod-network-cidr:指定Pod网络的CIDR地址范围。

--service-cidr:指定Service网络的CIDR地址范围。

--cri-socket:指定kubelet连接容器运行时的Unix套接字文件。

命令执行后,kubeadm会执行一系列任务,大概如下:

[preflight]:该阶段执行一系列检查,验证当前系统环境是否满足Kubernetes的安装要求,包括:

CPU和内存是否满足最低要求;

网络是否正常;

操作系统版本是否满足;

容器运行时是否可以连接;

内核参数是否正确配置;

下载所需的容器镜像。

[certs]:生成Kubernetes组件所需的HTTPS证书和秘钥,并存放到“/etc/kubernetes/pki”目录;

[kubeconfig]:生成kubeconfig文件,该文件包含API Server地址、客户端证书等信息,并存放到“/etc/kubernetes”目录。

[kubelet-start]:生成kubelet配置文件“/var/lib/kubelet/config.yaml”并启动kubelet服务。

[control-plane]:为kube-apiserver、kube-controller-manager和kube-scheduler创建静态Pod资源文件,并存储到“/etc/kubernetes/manifests”目录。

[etcd]:为etcd创建静态Pod资源文件,并存储到“/etc/kubernetes/manifests”目录。

[wait-control-plane]:等待kubelet从目录“/etc/kubernetes/manifest”中以静态Pod的形式启动Master组件。

[apiclient]:检查Master组件是否健康。

[upload-config]:将kubeadm配置存储到ConfigMap对象中。

[kubelet]:将kubelet配置存储到ConfigMap对象中。

[upload-certs]:提示用户跳过证书上传。

[mark-control-plane]:给Master节点添加标签和污点。

[bootstrap-token]:生成引导令牌,用于Node节点在加入集群时使用。

[kubelet-finalize]:更新kubelet配置文件(/etc/kubernetes/kubelet.conf)。

[addons]:安装CoreDNS和kube-proxy插件。

紧接着,输出初始化成功的信息:

根据上述提示,执行以下命令开始使用集群:

这些命令是将文件“/etc/kubernetes/admin.conf”复制到“$HOME/.kube/config”,以便kubectl根据该配置文件连接和管理Kubernetes集群。

7、部署Node节点

在两台工作节点执行上述返回的“kubeadm init”命令,并添加“--cri-socket”参数,以将这些工作节点加入到集群中:

[root@localhost ~] kubeadm join 192.168.111.128:6443 --token twrp53.v7dz7hjulwr4u10t --discovery-token-ca-cert-hash sha256:95341cb0152412e136b15176bec9daf9e728c504d7ee71a33a150b93e4634d17 --cri-socket=

unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all

可以在Master节点执行“kubectl get nodes”命令查看节点,结果如下:

两个工作节点已成功加入集群中。kubeadm默认根据主机名来设置节点名称,还可以添加“--node-name”参数自定义节点名称。

8、部署网络插件

在上述结果中,节点状态显示为“NotReady”,表示节点尚未准备就绪。这是由于kubelet服务未发现网络插件导致的,kubelet日志中也有相关说明(“network plugin is not ready”)。

Kubernetes网络插件主要用于实现集群内部Pod通信,它负责配置和管理Pod的网络。常见的网络插件包括Calico、Flannel、Cilium等,这里选择使用Calico作为Kubernetes网络插件,安装Calico网络插件:

[root@localhost ~] kubectl create -f tigera-operator.yaml

[root@localhost ~] kubectl create -f custom-resources.yaml

等待片刻,查看Pod对象:

[root@localhost ~] kubectl get pods -n calico-system

所有Pod的状态均显示为“Running”,说明Calico安装成功。再通过“kubectl get nodes”命令查看节点,状态转为“Ready”,表示节点准备就绪。

需要注意的是,Kubernetes考虑到安全性,“kubeadm join”命令中的Token有效期为24小时,过期后不可再使用。届时,可以通过“kubeadm token create --print-join-command”命令创建新的Token,以添加新的工作节点。

9、部署Dashboard

Dashboard是官方开发的一个Web管理系统,通过它可以管理集群资源、查看应用概览、查看容器日志和进入容器等操作。

下载Dashboard的资源文件:

[root@localhost ~] wget .7.0/aio/deploy/recommended.yaml

将Service的类型设置为“NodePort”类型并指定访问端口,以便将其暴露到集群外部访问,修改如下:

[root@localhost ~]# vim recommended.yaml

在集群中创建资源:

[root@localhost ~] kubectl apply -f recommended.yaml

查看Pod对象:

[root@localhost ~] kubectl get pods -n kubernetes-dashboard

所有Pod的状态都显示为“Running”,说明Dasboard安装成功。浏览器访问“https://<节点IP地址>:30001”,将看到登录界面。

创建一个服务账号并授予集群管理员权限:

[root@localhost ~] kubectl create serviceaccount admin-user -n kubernetes-dashboard

[root@localhost ~] kubectl create clusterrolebinding admin-user --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user

根据服务账号创建Token:

[root@localhost ~] kubectl create token admin-user -n kubernetes-dashboard

将输出的Token复制到输入框中,然后点击登录,进入到Dashboard首页。

到此k8s (v1.32)已安装完毕。

快速部署一套K8s集群(V1.32)

1、准备服务器环境

Kubernetes集群节点规划。

主机名

操作系统

IP地址

k8s-master

CentOS7.9_x64

192.168.111.128

k8s-node1

CentOS7.9_x64

192.168.111.129

k8s-node2

CentOS7.9_x64

192.168.111.130

集群节点运行的组件:

在上述环境中,我们选择Docker作为Kubernetes的容器运行时。因此,除了部署Kubernetes组件之外,还需部署Docker相关服务。

2、系统初始化配置

1)关闭防火墙

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

2)关闭SELinux

SELinux是Linux的一个安全机制,但使用复杂和存在兼容性问题,通常选择关闭它。

[root@localhost ~]# setenforce 0 # 临时

[root@localhost ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久

3)关闭Swap交换分区

Swap是一种虚拟内存技术,它允许系统将部分内存数据写到硬盘上的特定分区,从而释放更多物理内存。由于硬盘读写性能相比物理内存低,因此使用Swap会影响系统处理性能。并且Kubelet组件默认要求关闭Swap,以提高系统的稳定性和可靠性。

关闭Swap交换分区:

[root@localhost ~]# swapoff -a # 临时

[root@localhost ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久

  1. 设置主机名

[root@localhost ~]# hostnamectl set-hostname xxx

  1. 在master添加hosts

[root@localhost ~]# cat >> /etc/hosts << EOF

192.168.111.128 k8s-master

192.168.111.129 k8s-node1

192.168.111.130 k8s-node2

EOF

6)配置内核参数

某些Kubernetes网络插件可能会用到网络桥接(Bridge),为了确保网络桥接的数据包经过Iptables处理,启用相关的内核参数:

[root@localhost ~]# cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

[root@localhost ~]# sysctl --system

7)替换yum源:

[root@localhost ~] curl -o /etc/yum.repos.d/CentOS-Base.repo .repo

8)# 时间同步

[root@localhost ~] yum install ntpdate -y

[root@localhost ~] ntpdate time.windows

3、安装docker

在所有节点上安装并启动Docker。

下载阿里云Yum软件源文件:

[root@localhost ~]# wget .repo -O /etc/yum.repos.d/docker-ce.repo

安装指定版本Docker:

[root@localhost ~]# yum install -y docker-ce

[root@localhost ~]# cat > /etc/docker/daemon.json << EOF

{

"registry-mirrors": [";,";,";],

"exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

启动并设置开机启动:

[root@localhost ~]systemctl start docker && systemctl enable docker

4、安装cri-docker

在Kubernetes早期版本中,Docker作为默认容器运行时,并在Kubelet程序中开发了一个名为“Dockershim”的代理程序,负责Kubelet与Docker通信。

随着Kubernetes生态系统的发展,涌现出多种容器运行时,例如containerd、cri-o、rkt等。为了支持这些容器运行时,Kubernetes引入CRI(Container Runtime Interface,容器运行时接口)标准,使得第三方容器运行时只需对接CRI即可与Kubernetes集成。

后来,在Kubernetes 1.20版本发布时宣布:为了优化核心代码,减少维护负担,将在1.24版本中正式移除“Dockershim”,而当时Docker又不支持CRI,这就意味着Kubernetes无法再Docker作为容器运行时。Docker官方为了解决这个问题,与Mirantis公司合作,开发了一个名为“cri-dockerd”的代理程序,负责Kubelet与Docker通信。

因此,从Kubernetes 1.24版本及更高版本开始,使用Docker作为容器运行时,需要安装cri-dockerd。可以在GitHub Releases页面()找到适用于你系统平台版本的安装包,下载后上传到所有节点上并进行安装:

[root@localhost ~] rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm

安装完成后,修改Systemd服务文件指定依赖的Pause镜像为国内镜像地址:

[root@localhost ~] vi /usr/lib/systemd/system/cri-docker.service

ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs/google_containers/pause:3.9

启动并设置开机启动:

[root@localhost ~] systemctl start cri-docker && systemctl enable cri-docker

5、安装kubeadm和kubelet

在所有节点上安装kubeadm、kubectl和kubelet组件。但这些软件包未包含在系统默认软件源中,需要额外配置Yum软件源,例如配置阿里云的软件源:

[root@localhost ~] cat > /etc/yum.repos.d/kubernetes.repo << EOF

[kubernetes]

name=Kubernetes

baseurl=.32/rpm/

enabled=1

gpgcheck=1

gpgkey=.32/rpm/repodata/repomd.xml.key

EOF

安装指定版本kubeadm、kubectl和kubelet:

[root@localhost ~] yum install -y kubeadm-1.32.0 kubectl-1.32.0 kubelet-1.32.0

kubeadm和kubectl仅是一个集群搭建工具和管理工具,不涉及启动。而kubelet是一个守护进程程序,由kubeadm在搭建过程中自动启动,这里仅设置开机启动即可:

[root@localhost ~] systemctl enable kubelet

6、部署Master节点

在Master节点执行以下命令初始化Kubernetes管理节点:

[root@localhost ~] kubeadm init \

--apiserver-advertise-address=192.168.111.128 \

--image-repository=registry.aliyuncs/google_containers \

--kubernetes-version=v1.32.0 \

--pod-network-cidr=10.244.0.0/16 \

--service-cidr=10.96.0.0/12 \

--cri-socket=unix:///var/run/cri-dockerd.sock \

--ignore-preflight-errors=all

该命令中各参数含义如下:

--apiserver-advertise-address:指定API Server监听的IP地址。如果没有设置,将使用默认的网络接口。

--image-repository:指定镜像仓库地址。默认值为“registry.k8s.io”,但该仓库在国内无法访问,因此这里指定阿里云仓库。

--kubernetes-version:指定Kubernetes版本。

--pod-network-cidr:指定Pod网络的CIDR地址范围。

--service-cidr:指定Service网络的CIDR地址范围。

--cri-socket:指定kubelet连接容器运行时的Unix套接字文件。

命令执行后,kubeadm会执行一系列任务,大概如下:

[preflight]:该阶段执行一系列检查,验证当前系统环境是否满足Kubernetes的安装要求,包括:

CPU和内存是否满足最低要求;

网络是否正常;

操作系统版本是否满足;

容器运行时是否可以连接;

内核参数是否正确配置;

下载所需的容器镜像。

[certs]:生成Kubernetes组件所需的HTTPS证书和秘钥,并存放到“/etc/kubernetes/pki”目录;

[kubeconfig]:生成kubeconfig文件,该文件包含API Server地址、客户端证书等信息,并存放到“/etc/kubernetes”目录。

[kubelet-start]:生成kubelet配置文件“/var/lib/kubelet/config.yaml”并启动kubelet服务。

[control-plane]:为kube-apiserver、kube-controller-manager和kube-scheduler创建静态Pod资源文件,并存储到“/etc/kubernetes/manifests”目录。

[etcd]:为etcd创建静态Pod资源文件,并存储到“/etc/kubernetes/manifests”目录。

[wait-control-plane]:等待kubelet从目录“/etc/kubernetes/manifest”中以静态Pod的形式启动Master组件。

[apiclient]:检查Master组件是否健康。

[upload-config]:将kubeadm配置存储到ConfigMap对象中。

[kubelet]:将kubelet配置存储到ConfigMap对象中。

[upload-certs]:提示用户跳过证书上传。

[mark-control-plane]:给Master节点添加标签和污点。

[bootstrap-token]:生成引导令牌,用于Node节点在加入集群时使用。

[kubelet-finalize]:更新kubelet配置文件(/etc/kubernetes/kubelet.conf)。

[addons]:安装CoreDNS和kube-proxy插件。

紧接着,输出初始化成功的信息:

根据上述提示,执行以下命令开始使用集群:

这些命令是将文件“/etc/kubernetes/admin.conf”复制到“$HOME/.kube/config”,以便kubectl根据该配置文件连接和管理Kubernetes集群。

7、部署Node节点

在两台工作节点执行上述返回的“kubeadm init”命令,并添加“--cri-socket”参数,以将这些工作节点加入到集群中:

[root@localhost ~] kubeadm join 192.168.111.128:6443 --token twrp53.v7dz7hjulwr4u10t --discovery-token-ca-cert-hash sha256:95341cb0152412e136b15176bec9daf9e728c504d7ee71a33a150b93e4634d17 --cri-socket=

unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all

可以在Master节点执行“kubectl get nodes”命令查看节点,结果如下:

两个工作节点已成功加入集群中。kubeadm默认根据主机名来设置节点名称,还可以添加“--node-name”参数自定义节点名称。

8、部署网络插件

在上述结果中,节点状态显示为“NotReady”,表示节点尚未准备就绪。这是由于kubelet服务未发现网络插件导致的,kubelet日志中也有相关说明(“network plugin is not ready”)。

Kubernetes网络插件主要用于实现集群内部Pod通信,它负责配置和管理Pod的网络。常见的网络插件包括Calico、Flannel、Cilium等,这里选择使用Calico作为Kubernetes网络插件,安装Calico网络插件:

[root@localhost ~] kubectl create -f tigera-operator.yaml

[root@localhost ~] kubectl create -f custom-resources.yaml

等待片刻,查看Pod对象:

[root@localhost ~] kubectl get pods -n calico-system

所有Pod的状态均显示为“Running”,说明Calico安装成功。再通过“kubectl get nodes”命令查看节点,状态转为“Ready”,表示节点准备就绪。

需要注意的是,Kubernetes考虑到安全性,“kubeadm join”命令中的Token有效期为24小时,过期后不可再使用。届时,可以通过“kubeadm token create --print-join-command”命令创建新的Token,以添加新的工作节点。

9、部署Dashboard

Dashboard是官方开发的一个Web管理系统,通过它可以管理集群资源、查看应用概览、查看容器日志和进入容器等操作。

下载Dashboard的资源文件:

[root@localhost ~] wget .7.0/aio/deploy/recommended.yaml

将Service的类型设置为“NodePort”类型并指定访问端口,以便将其暴露到集群外部访问,修改如下:

[root@localhost ~]# vim recommended.yaml

在集群中创建资源:

[root@localhost ~] kubectl apply -f recommended.yaml

查看Pod对象:

[root@localhost ~] kubectl get pods -n kubernetes-dashboard

所有Pod的状态都显示为“Running”,说明Dasboard安装成功。浏览器访问“https://<节点IP地址>:30001”,将看到登录界面。

创建一个服务账号并授予集群管理员权限:

[root@localhost ~] kubectl create serviceaccount admin-user -n kubernetes-dashboard

[root@localhost ~] kubectl create clusterrolebinding admin-user --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user

根据服务账号创建Token:

[root@localhost ~] kubectl create token admin-user -n kubernetes-dashboard

将输出的Token复制到输入框中,然后点击登录,进入到Dashboard首页。

到此k8s (v1.32)已安装完毕。

本文标签: 快速部署一套K8s集群(V132)