在容器编排技术蓬勃发展的时代,Kubernetes 以其强大的功能和社区活力迅速成为行业标准,而 CentOS 作为一款稳定、免费且广泛使用的企业级操作系统,是部署 Kubernetes 集群的理想平台,本文将详细介绍如何在 CentOS 7 系统上部署一个功能完备的 Kubernetes 1.7 集群,尽管 1.7 版本已不是最新,但其核心架构和部署流程对于理解 Kubernetes 的工作原理以及维护一些遗留环境具有重要的学习价值和实践意义。
环境准备
在开始部署之前,我们需要准备符合要求的服务器环境,一个最小化的 Kubernetes 集群至少需要一个 Master 节点和一个 Worker 节点,为了演示和保证冗余,我们将配置一个包含一个 Master 节点和两个 Worker 节点的集群。
节点规划表:
主机名 | IP 地址 | 角色 | 配置(最低建议) |
---|---|---|---|
k8s-master | 168.1.10 | Master | 2核CPU, 4GB内存 |
k8s-node1 | 168.1.11 | Worker | 2核CPU, 4GB内存 |
k8s-node2 | 168.1.12 | Worker | 2核CPU, 4GB内存 |
通用系统配置(所有节点执行)
关闭防火墙和 SELinux:为了简化初次部署过程,避免网络策略干扰,我们暂时关闭防火墙和 SELinux,在生产环境中,应正确配置防火墙规则而非直接关闭。
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
配置主机名和主机解析:为每个节点设置主机名,并确保所有节点之间可以通过主机名互相访问。
# 在 k8s-master 节点 hostnamectl set-hostname k8s-master # 在 k8s-node1 节点 hostnamectl set-hostname k8s-node1 # 在 k8s-node2 节点 hostnamectl set-hostname k8s-node2 # 在所有节点上编辑 /etc/hosts 文件,添加以下内容 cat >> /etc/hosts << EOF 192.168.1.10 k8s-master 192.168.1.11 k8s-node1 192.168.1.12 k8s-node2 EOF
关闭 Swap 分区:Kubernetes Master 节点为了保证其性能和稳定性,要求必须关闭 Swap。
swapoff -a sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
配置内核参数:启用
br_netfilter
模块并调整相关内核参数,以满足 Kubernetes 网络组件(如 kube-proxy)的正常工作。cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
安装 Docker 和 Kubernetes 组件
以下操作需要在所有节点上执行。
安装 Docker:Kubernetes 使用容器运行时来管理容器,Docker 是最常见的选择,我们需要安装一个与 Kubernetes 1.7 兼容的 Docker 版本。
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce-18.06.1.ce-3.el7 # 启动并设置 Docker 开机自启 systemctl enable docker && systemctl start docker
安装 kubeadm, kubelet, kubectl:这三个是 Kubernetes 的核心组件。
kubeadm
:用于初始化集群的命令行工具。kubelet
:运行在每个节点上的代理,负责管理 Pod。kubectl
:与集群交互的命令行客户端。
添加 Kubernetes 的 YUM 仓库:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF
安装指定版本(1.7.0)的组件:
yum install -y kubelet-1.7.0-0 kubeadm-1.7.0-0 kubectl-1.7.0-0 systemctl enable kubelet && systemctl start kubelet
初始化 Master 节点
在 k8s-master
节点上执行以下命令来初始化控制平面。
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.1.10
--pod-network-cidr
:指定 Pod 网络的 IP 地址范围,这里我们使用了 Flannel 网络插件的默认 CIDR。--apiserver-advertise-address
:指定 Master 节点的 API Server 监听地址。
初始化成功后,终端会输出重要的后续操作指令,包括:
配置
kubectl
的配置文件,以便普通用户也能管理集群。mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
一条
kubeadm join
命令,用于 Worker 节点加入集群,请务必记录下这条命令,它包含了加入集群所需的 token。
安装 Pod 网络插件
集群初始化完成后,kubectl get nodes
会看到 Master 节点处于 NotReady
状态,因为没有安装网络插件,我们选择 Flannel,一个简单易用的 VXLAN 网络方案。
在 k8s-master
节点上执行:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
等待片刻,下载 Flannel 的镜像并启动相关 Pod 后,再次检查节点状态:
kubectl get nodes
k8s-master
的状态应该变为 Ready
。
Worker 节点加入集群
在 k8s-node1
和 k8s-node2
节点上,执行之前在 Master 初始化成功后记录的 kubeadm join
命令,命令格式如下:
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
执行成功后,回到 k8s-master
节点,再次检查节点状态:
kubectl get nodes
如果一切顺利,你会看到所有三个节点都处于 Ready
状态,至此,一个基础的 Kubernetes 1.7 集群就搭建完成了。
验证集群功能
为了验证集群是否正常工作,我们可以部署一个 Nginx 应用。
创建 Deployment:
kubectl run nginx --image=nginx --replicas=3 --port=80
暴露服务:通过 NodePort 类型的 Service 将 Nginx 服务暴露在集群外部。
kubectl expose deployment nginx --type=NodePort --port=80
查看服务信息:
kubectl get svc nginx
该命令会输出一个随机分配的 NodePort 端口,
30880
。访问验证:在任何一台节点的机器上,或者能访问到节点网络的主机上,通过
curl
访问服务:curl http://192.168.1.11:30880
或者访问任意其他 Node 节点的 IP 和该端口,如果看到 Nginx 的欢迎页面,说明集群部署完全成功。
相关问答FAQs
Q1: kubeadm join
命令执行失败,提示 discovery token 失效或找不到,该怎么办?
A: kubeadm init
生成的 token 默认只有 24 小时的有效期,token 过期,你需要在 Master 节点上重新生成一个,在 Master 节点上创建一个新的 token:
kubeadm token create
获取 CA 公钥的 hash 值:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
使用新获取的 token 和 hash 值重新拼接 kubeadm join
命令,并在 Worker 节点上执行即可。
Q2: 部署应用后,Pod 一直处于 ContainerCreating
或 Pending
状态,kubectl describe pod
显示镜像拉取失败,是什么原因?
A: 这通常是网络问题或 Worker 节点无法访问容器镜像仓库导致的,Kubernetes 1.7 时代,国内访问 gcr.io
或 k8s.gcr.io
等官方仓库非常困难,解决方法有两个:
- 配置 Docker 镜像加速器:在所有节点上为 Docker 配置国内镜像源,如阿里云、腾讯云等提供的加速服务,修改
/etc/docker/daemon.json
文件并重启 Docker,这可以解决大部分第三方镜像(如 Nginx)的拉取问题。 - 手动拉取和标记镜像:对于核心组件(如
kube-proxy-amd64
)所需的k8s.gcr.io
镜像,可以在能访问外网的机器上将其从 Docker Hub 等第三方仓库(国内开发者通常会同步一份)拉取下来,然后通过docker tag
命令重新打上 K8s 需要的标签,再docker save
成 tar 包,分发到各个 Worker 节点上用docker load
导入。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复