Kubernetes The Hard Way 项目:控制平面组件部署指南
kubernetes-the-hard-way 项目地址: https://gitcode.com/gh_mirrors/kub/kubernetes-the-hard-way
前言
在 Kubernetes 集群中,控制平面(Control Plane)是整个系统的"大脑",负责管理和维护集群的状态。本文将详细介绍如何在 Kubernetes The Hard Way 项目中部署高可用的控制平面组件,包括 API Server、Controller Manager 和 Scheduler。
控制平面组件概述
Kubernetes 控制平面由三个核心组件组成:
- API Server:集群的入口点,处理所有 REST 请求
- Controller Manager:运行各种控制器,确保集群状态与期望状态一致
- Scheduler:负责将 Pod 调度到合适的节点上
在生产环境中,建议使用奇数个控制平面节点(如3个或5个),以确保 etcd 集群的领导者选举和仲裁机制能够正常工作。本教程为了节省资源,使用两个节点进行演示。
准备工作
在开始之前,请确保:
- 已完成前期的证书和密钥生成工作
- 准备了两台控制平面节点(controlplane01 和 controlplane02)
- 已安装必要的工具如 tmux(用于并行操作)
部署步骤详解
1. 下载和安装 Kubernetes 二进制文件
首先需要下载 Kubernetes 官方发布的二进制文件:
KUBE_VERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)
wget -q --show-progress --https-only --timestamping \
"https://dl.k8s.io/release/${KUBE_VERSION}/bin/linux/${ARCH}/kube-apiserver" \
"https://dl.k8s.io/release/${KUBE_VERSION}/bin/linux/${ARCH}/kube-controller-manager" \
"https://dl.k8s.io/release/${KUBE_VERSION}/bin/linux/${ARCH}/kube-scheduler" \
"https://dl.k8s.io/release/${KUBE_VERSION}/bin/linux/${ARCH}/kubectl"
安装这些二进制文件:
{
chmod +x kube-apiserver kube-controller-manager kube-scheduler kubectl
sudo mv kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/local/bin/
}
2. 配置 Kubernetes API Server
将证书和密钥移动到安全位置:
{
sudo mkdir -p /var/lib/kubernetes/pki
sudo cp ca.crt ca.key /var/lib/kubernetes/pki
for c in kube-apiserver service-account apiserver-kubelet-client etcd-server kube-scheduler kube-controller-manager
do
sudo mv "$c.crt" "$c.key" /var/lib/kubernetes/pki/
done
sudo chown root:root /var/lib/kubernetes/pki/*
sudo chmod 600 /var/lib/kubernetes/pki/*
}
设置必要的环境变量:
LOADBALANCER=$(dig +short loadbalancer)
CONTROL01=$(dig +short controlplane01)
CONTROL02=$(dig +short controlplane02)
POD_CIDR=10.244.0.0/16
SERVICE_CIDR=10.96.0.0/16
创建 API Server 的 systemd 服务文件:
cat <<EOF | sudo tee /etc/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
ExecStart=/usr/local/bin/kube-apiserver \\
--advertise-address=${PRIMARY_IP} \\
--allow-privileged=true \\
--apiserver-count=2 \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/var/log/audit.log \\
--authorization-mode=Node,RBAC \\
--bind-address=0.0.0.0 \\
--client-ca-file=/var/lib/kubernetes/pki/ca.crt \\
--enable-admission-plugins=NodeRestriction,ServiceAccount \\
--enable-bootstrap-token-auth=true \\
--etcd-cafile=/var/lib/kubernetes/pki/ca.crt \\
--etcd-certfile=/var/lib/kubernetes/pki/etcd-server.crt \\
--etcd-keyfile=/var/lib/kubernetes/pki/etcd-server.key \\
--etcd-servers=https://${CONTROL01}:2379,https://${CONTROL02}:2379 \\
--event-ttl=1h \\
--encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \\
--kubelet-certificate-authority=/var/lib/kubernetes/pki/ca.crt \\
--kubelet-client-certificate=/var/lib/kubernetes/pki/apiserver-kubelet-client.crt \\
--kubelet-client-key=/var/lib/kubernetes/pki/apiserver-kubelet-client.key \\
--runtime-config=api/all=true \\
--service-account-key-file=/var/lib/kubernetes/pki/service-account.crt \\
--service-account-signing-key-file=/var/lib/kubernetes/pki/service-account.key \\
--service-account-issuer=https://${LOADBALANCER}:6443 \\
--service-cluster-ip-range=${SERVICE_CIDR} \\
--service-node-port-range=30000-32767 \\
--tls-cert-file=/var/lib/kubernetes/pki/kube-apiserver.crt \\
--tls-private-key-file=/var/lib/kubernetes/pki/kube-apiserver.key \\
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
3. 配置 Controller Manager
移动 kubeconfig 文件:
sudo mv kube-controller-manager.kubeconfig /var/lib/kubernetes/
创建 Controller Manager 的 systemd 服务文件:
cat <<EOF | sudo tee /etc/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
ExecStart=/usr/local/bin/kube-controller-manager \\
--allocate-node-cidrs=true \\
--authentication-kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\
--authorization-kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\
--bind-address=127.0.0.1 \\
--client-ca-file=/var/lib/kubernetes/pki/ca.crt \\
--cluster-cidr=${POD_CIDR} \\
--cluster-name=kubernetes \\
--cluster-signing-cert-file=/var/lib/kubernetes/pki/ca.crt \\
--cluster-signing-key-file=/var/lib/kubernetes/pki/ca.key \\
--controllers=*,bootstrapsigner,tokencleaner \\
--kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\
--leader-elect=true \\
--node-cidr-mask-size=24 \\
--requestheader-client-ca-file=/var/lib/kubernetes/pki/ca.crt \\
--root-ca-file=/var/lib/kubernetes/pki/ca.crt \\
--service-account-private-key-file=/var/lib/kubernetes/pki/service-account.key \\
--service-cluster-ip-range=${SERVICE_CIDR} \\
--use-service-account-credentials=true \\
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
4. 配置 Scheduler
移动 kubeconfig 文件:
sudo mv kube-scheduler.kubeconfig /var/lib/kubernetes/
创建 Scheduler 的 systemd 服务文件:
cat <<EOF | sudo tee /etc/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
ExecStart=/usr/local/bin/kube-scheduler \\
--kubeconfig=/var/lib/kubernetes/kube-scheduler.kubeconfig \\
--leader-elect=true \\
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
5. 安全设置
确保 kubeconfig 文件权限正确:
sudo chmod 600 /var/lib/kubernetes/*.kubeconfig
6. 启动服务
在所有控制平面节点上执行:
{
sudo systemctl daemon-reload
sudo systemctl enable kube-apiserver kube-controller-manager kube-scheduler
sudo systemctl start kube-apiserver kube-controller-manager kube-scheduler
}
等待约10秒让 API Server 完全初始化。
负载均衡器配置
为了提供高可用性,我们需要在前端配置一个负载均衡器。
安装和配置 HAProxy
在负载均衡器节点上:
sudo apt-get update && sudo apt-get install -y haproxy
创建 HAProxy 配置文件:
cat <<EOF | sudo tee /etc/haproxy/haproxy.cfg
frontend kubernetes
bind ${LOADBALANCER}:6443
option tcplog
mode tcp
default_backend kubernetes-controlplane-nodes
backend kubernetes-controlplane-nodes
mode tcp
balance roundrobin
option tcp-check
server controlplane01 ${CONTROL01}:6443 check fall 3 rise 2
server controlplane02 ${CONTROL02}:6443 check fall 3 rise 2
EOF
重启 HAProxy 服务:
sudo systemctl restart haproxy
验证部署
验证控制平面组件状态:
kubectl get componentstatuses --kubeconfig admin.kubeconfig
预期输出应显示所有组件为 Healthy 状态。
验证负载均衡器:
curl -k https://${LOADBALANCER}:6443/version
应返回 Kubernetes 版本信息。
总结
通过以上步骤,我们成功部署了一个高可用的 Kubernetes 控制平面。关键点包括:
- 正确配置各组件间的 TLS 通信
- 确保证书和密钥的安全存储
- 合理设置服务参数
- 通过负载均衡器提供高可用性
在生产环境中,建议至少使用三个控制平面节点,并考虑更精细的安全配置和监控方案。
kubernetes-the-hard-way 项目地址: https://gitcode.com/gh_mirrors/kub/kubernetes-the-hard-way
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考