CentOS Stream容器化部署Kubernetes的详细步骤与注意事项助您轻松搭建企业级容器编排平台实现应用快速部署与弹性伸缩

引言
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它由Google设计并捐赠给Cloud Native Computing Foundation(CNCF)来维护。Kubernetes提供了容器编排、负载均衡、服务发现、存储编排、自动扩缩容等强大功能,已成为容器编排领域的事实标准。
CentOS Stream是CentOS项目的一个滚动发布的Linux发行版,它位于Fedora和RHEL之间,是RHEL的上游开发分支。选择CentOS Stream作为Kubernetes的部署平台有以下几个优势:
稳定性与最新性的平衡:CentOS Stream提供了比传统CentOS更快的软件更新,同时保持相对的稳定性。
RHEL兼容性:作为RHEL的上游,CentOS Stream与RHEL高度兼容,便于未来迁移。
社区支持:拥有活跃的社区支持,问题解决速度快。
适合企业环境:提供了企业级的安全性和稳定性。
本文将详细介绍在CentOS Stream上部署Kubernetes集群的步骤,包括环境准备、组件安装、集群初始化、网络配置以及应用部署等内容,帮助读者快速搭建企业级容器编排平台,实现应用的快速部署与弹性伸缩。
环境准备
在开始部署Kubernetes之前,我们需要做好充分的准备工作,包括硬件要求、系统配置、网络规划等。
系统要求
操作系统:CentOS Stream
8
⁄
9
CPU:至少2核
内存:至少2GB RAM(推荐4GB以上)
硬盘:至少20GB可用空间
网络:所有节点之间网络互通
主机规划
为了搭建高可用的Kubernetes集群,我们至少需要准备以下节点:
1个Master节点(控制平面节点)
至少2个Worker节点(工作节点)
在实际生产环境中,建议至少配置3个Master节点以实现高可用。本文以1个Master节点和2个Worker节点为例进行说明。
角色
主机名
IP地址
Master
k8s-master
192.168.1.10
Worker
k8s-worker1
192.168.1.11
Worker
k8s-worker2
192.168.1.12
系统初始化配置
以下操作需要在所有节点上执行。
1. 更新系统
首先,确保系统是最新的:
sudo dnf update -y
2. 设置主机名
根据上面的主机规划,为每个节点设置主机名:
在Master节点上:
sudo hostnamectl set-hostname k8s-master
在Worker节点1上:
sudo hostnamectl set-hostname k8s-worker1
在Worker节点2上:
sudo hostnamectl set-hostname k8s-worker2
3. 配置hosts文件
编辑所有节点的
/etc/hosts
文件,添加所有节点的IP和主机名映射:
sudo tee -a /etc/hosts << EOF 192.168.1.10 k8s-master 192.168.1.11 k8s-worker1 192.168.1.12 k8s-worker2 EOF 4. 禁用SELinux Kubernetes和SELinux之间存在一些兼容性问题,为了简化部署过程,我们暂时禁用SELinux: sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config 5. 禁用Swap Kubernetes要求禁用Swap分区以提高性能: sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 6. 配置内核参数 Kubernetes需要一些特定的内核参数和网络设置: # 创建配置文件 sudo tee /etc/modules-load.d/k8s.conf << EOF overlay br_netfilter EOF # 加载模块 sudo modprobe overlay sudo modprobe br_netfilter # 设置内核参数 sudo tee /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF # 应用参数 sudo sysctl --system 7. 配置防火墙 Kubernetes的各个组件之间需要特定的端口通信。我们需要开放这些端口: 在Master节点上: sudo firewall-cmd --permanent --add-port=6443/tcp # Kubernetes API Server sudo firewall-cmd --permanent --add-port=2379-2380/tcp # etcd server client API sudo firewall-cmd --permanent --add-port=10250/tcp # Kubelet API sudo firewall-cmd --permanent --add-port=10251/tcp # kube-scheduler sudo firewall-cmd --permanent --add-port=10252/tcp # kube-controller-manager sudo firewall-cmd --permanent --add-port=30000-32767/tcp # NodePort Services sudo firewall-cmd --reload 在Worker节点上: sudo firewall-cmd --permanent --add-port=10250/tcp # Kubelet API sudo firewall-cmd --permanent --add-port=30000-32767/tcp # NodePort Services sudo firewall-cmd --reload 或者,为了简化,可以暂时关闭防火墙(仅适用于测试环境,生产环境不建议): sudo systemctl stop firewalld sudo systemctl disable firewalld 8. 安装时间同步工具 确保所有节点的时间同步非常重要: sudo dnf install -y chrony sudo systemctl start chronyd sudo systemctl enable chronyd 安装Docker容器运行时 Kubernetes需要一个容器运行时来管理容器。Docker是最常用的选择之一,此外还有containerd、CRI-O等。本文以Docker为例进行说明。 以下操作需要在所有节点上执行。 1. 安装必要的软件包 sudo dnf install -y yum-utils device-mapper-persistent-data lvm2 2. 添加Docker仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 3. 安装Docker sudo dnf install -y docker-ce docker-ce-cli containerd.io 4. 配置Docker 创建Docker配置文件: sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json << EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF 5. 启动并启用Docker sudo systemctl enable docker sudo systemctl start docker 6. 验证Docker安装 sudo docker --version sudo docker run hello-world 如果Docker安装成功,你将看到Docker的版本信息和”Hello from Docker!“的欢迎消息。 安装Kubernetes组件 现在我们将在所有节点上安装Kubernetes的核心组件:kubeadm、kubelet和kubectl。 1. 添加Kubernetes仓库 sudo tee -a /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch 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 exclude=kubelet kubeadm kubectl EOF 2. 安装Kubernetes组件 sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes 3. 启用并启动kubelet sudo systemctl enable kubelet sudo systemctl start kubelet 4. 配置cgroup驱动 确保kubelet和Docker使用相同的cgroup驱动: sudo sed -i 's/cgroup-driver=systemd/cgroup-driver=systemd/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf sudo systemctl daemon-reload sudo systemctl restart kubelet 初始化Kubernetes集群 现在我们准备初始化Kubernetes集群。这些操作只在Master节点上执行。 1. 初始化Master节点 sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.1.10 参数说明: --pod-network-cidr :指定Pod网络的CIDR,这里我们使用Flannel网络插件,所以设置为10.244.0.0/16。 --apiserver-advertise-address :指定API Server的广告地址,通常设置为Master节点的IP地址。 初始化过程可能需要几分钟时间。完成后,你会看到类似以下的输出: Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.1.10:6443 --token \
–discovery-token-ca-cert-hash sha256:
2. 配置kubectl
按照上述输出的指示,配置kubectl以便普通用户可以使用:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. 验证Master节点状态
kubectl get nodes
此时,Master节点的状态应该是”NotReady”,因为我们还没有安装网络插件。
安装网络插件
Kubernetes集群需要一个网络插件来实现Pod之间的网络通信。常用的网络插件有Flannel、Calico、Weave Net等。本文以Flannel为例进行说明。
1. 安装Flannel网络插件
在Master节点上执行以下命令:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
2. 验证网络插件安装
等待几分钟后,检查Pod状态:
kubectl get pods -n kube-system
你应该能看到Flannel相关的Pod处于”Running”状态。
3. 验证节点状态
再次检查节点状态:
kubectl get nodes
现在Master节点的状态应该是”Ready”。
加入Worker节点
现在我们将Worker节点加入到Kubernetes集群中。在之前初始化Master节点时,我们已经获得了加入命令。如果忘记了,可以在Master节点上执行以下命令获取:
kubeadm token create –print-join-command
在所有Worker节点上执行加入命令:
sudo kubeadm join 192.168.1.10:6443 –token \
–discovery-token-ca-cert-hash sha256:
等待几分钟后,在Master节点上验证节点状态:
kubectl get nodes
你应该能看到所有节点(包括Master和Worker)的状态都是”Ready”。
部署Kubernetes Dashboard(可选)
Kubernetes Dashboard是一个基于Web的UI界面,用于管理Kubernetes集群。虽然不是必需的,但它提供了直观的集群管理方式。
1. 部署Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
2. 创建管理员用户
kubectl apply -f – << EOF 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 EOF 3. 获取访问令牌 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}}" 4. 访问Dashboard 默认情况下,Dashboard只能在集群内部访问。为了从外部访问,可以使用以下方法之一: 方法一:使用kubectl proxy kubectl proxy 然后通过以下URL访问Dashboard: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 方法二:使用NodePort kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec": {"type": "NodePort", "ports": [{"port": 443, "targetPort": 8443, "nodePort": 30000}]}}' 然后通过以下URL访问Dashboard: https:// :30000 使用前面获取的令牌登录Dashboard。 部署示例应用 现在我们已经成功搭建了Kubernetes集群,让我们部署一个示例应用来验证集群的功能。 1. 创建Nginx部署 kubectl create deployment nginx --image=nginx 2. 暴露服务 kubectl expose deployment nginx --port=80 --type=NodePort 3. 检查部署和服务状态 kubectl get deployments kubectl get pods kubectl get svc 4. 访问Nginx服务 获取NodePort: kubectl get svc nginx 输出类似如下: NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx NodePort 10.108.48.242 80:31234/TCP 1m
然后通过以下URL访问Nginx:
http://
:31234
5. 扩展应用
Kubernetes的一个强大功能是轻松扩展应用。让我们将Nginx副本数扩展到3个:
kubectl scale deployment nginx –replicas=3
检查Pod状态:
kubectl get pods
你应该能看到3个Nginx Pod正在运行。
集群管理与维护
1. 常用kubectl命令
以下是一些常用的kubectl命令:
# 查看集群信息
kubectl cluster-info

# 查看节点状态
kubectl get nodes

# 查看所有命名空间的Pod
kubectl get pods –all-namespaces

# 查看特定命名空间的Pod
kubectl get pods -n

# 查看Pod详细信息
kubectl describe pod -n

# 查看Pod日志
kubectl logs -n

# 在Pod中执行命令
kubectl exec -it -n — /bin/bash

# 删除Pod
kubectl delete pod -n

# 查看服务
kubectl get svc -n

# 查看部署
kubectl get deployments -n

# 查看配置映射
kubectl get configmaps -n

# 查看密钥
kubectl get secrets -n
2. 升级Kubernetes集群
升级Kubernetes集群需要谨慎操作,建议先在测试环境中验证。以下是升级的基本步骤:
2.1 升级Master节点
首先,检查可用的升级版本:
kubeadm upgrade plan
然后,升级控制平面:
sudo kubeadm upgrade apply v1.22.0 # 替换为你要升级到的版本
升级后,升级kubelet和kubectl:
sudo dnf update -y kubelet kubeadm kubectl –disableexcludes=kubernetes
sudo systemctl daemon-reload
sudo systemctl restart kubelet
2.2 升级Worker节点
在Worker节点上,先升级kubeadm:
sudo dnf update -y kubeadm –disableexcludes=kubernetes
然后,执行升级命令:
sudo kubeadm upgrade node
最后,升级kubelet和kubectl:
sudo dnf update -y kubelet kubectl –disableexcludes=kubernetes
sudo systemctl daemon-reload
sudo systemctl restart kubelet
3. 备份与恢复
3.1 备份etcd数据
etcd是Kubernetes的键值存储,保存了集群的所有状态信息。备份etcd非常重要:
# 获取etcd Pod名称
ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}’)

# 备份etcd数据
kubectl exec -n kube-system $ETCD_POD — etcdctl snapshot save /tmp/etcd-snapshot.db
kubectl cp -n kube-system $ETCD_POD:/tmp/etcd-snapshot.db ./etcd-snapshot.db
3.2 备份集群配置
# 备份所有命名空间的资源
kubectl get all –all-namespaces -o yaml > cluster-backup.yaml

# 备份特定命名空间的资源
kubectl get all -n -o yaml > namespace-backup.yaml
3.3 恢复集群
恢复集群是一个复杂的过程,具体步骤取决于集群的损坏程度。在严重情况下,可能需要重新初始化集群并从备份中恢复资源。
常见问题与解决方案
1. 节点处于NotReady状态
如果节点长时间处于”NotReady”状态,可能有以下原因:
1.1 网络插件未正确安装
检查网络插件Pod的状态:
kubectl get pods -n kube-system | grep -E ‘flannel|calico|weave’
如果Pod未运行,检查Pod日志:
kubectl logs -n kube-system
1.2 防火墙阻止了节点间通信
确保所有必要的端口都已开放,或者临时关闭防火墙进行测试:
sudo systemctl stop firewalld
1.3 cgroup驱动不匹配
确保Docker和kubelet使用相同的cgroup驱动:
sudo docker info | grep -i cgroup
sudo cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf | grep cgroup-driver
如果不匹配,修改Docker或kubelet的配置并重启服务。
2. Pod处于Pending状态
如果Pod长时间处于”Pending”状态,可能有以下原因:
2.1 资源不足
检查节点资源使用情况:
kubectl describe nodes | grep -i ‘capacity\|allocatable\|allocated’
如果资源不足,考虑添加更多节点或减少Pod的资源请求。
2.2 节点 tainted
检查节点是否有taint:
kubectl describe nodes | grep -i taint
如果有taint,可以考虑移除taint或在Pod spec中添加tolerations。
2.3 存储问题
如果Pod需要持久存储,确保存储类和持久卷声明正确配置:
kubectl get storageclass
kubectl get pvc
3. Pod处于CrashLoopBackOff状态
如果Pod反复崩溃并进入”CrashLoopBackOff”状态,可能是应用程序问题或配置错误。
3.1 检查Pod日志
kubectl logs kubectl logs –previous
3.2 检查Pod配置
kubectl describe pod 3.3 在Pod中调试
kubectl exec -it — /bin/bash
4. 服务无法访问
如果服务无法访问,可能有以下原因:
4.1 服务类型配置错误
检查服务类型和端口配置:
kubectl get svc
kubectl describe svc
4.2 端点未正确配置
检查服务端点:
kubectl get endpoints
如果端点为空,确保Pod标签正确匹配服务选择器。
4.3 网络策略阻止访问
如果有网络策略,确保允许必要的流量:
kubectl get networkpolicies
总结
本文详细介绍了在CentOS Stream上部署Kubernetes集群的完整过程,包括环境准备、Docker安装、Kubernetes组件安装、集群初始化、网络插件配置、节点加入、Dashboard部署以及应用部署等步骤。通过这些步骤,您可以快速搭建一个企业级的容器编排平台,实现应用的快速部署与弹性伸缩。
Kubernetes作为一个强大的容器编排平台,提供了丰富的功能和灵活的配置选项。在实际生产环境中,还需要考虑安全性、高可用性、监控、日志管理等方面。以下是一些额外的建议:
安全性
:启用RBAC(基于角色的访问控制)、网络策略、Pod安全策略等安全机制。
高可用性
:部署多个Master节点,使用负载均衡器分发API Server流量。
监控
:部署Prometheus、Grafana等监控工具,实时监控集群状态。
日志管理
:部署EFK(Elasticsearch、Fluentd、Kibana)或类似的日志收集系统。
CI/CD
:集成Jenkins、GitLab CI等CI/CD工具,实现自动化部署流程。
存储
:根据应用需求,配置合适的存储解决方案,如NFS、Ceph、GlusterFS等。
备份策略
:制定定期备份策略,确保集群数据安全。
通过合理配置和使用Kubernetes,您可以充分发挥容器技术的优势,提高应用部署效率,实现资源的弹性伸缩,为企业数字化转型提供强有力的技术支撑。
希望本文能帮助您成功部署和管理Kubernetes集群,如有任何问题或建议,欢迎交流讨论。