Kubernetes The Hard Way 项目:控制平面组件部署指南

Kubernetes The Hard Way 项目:控制平面组件部署指南

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 控制平面由三个核心组件组成:

  1. API Server:集群的入口点,处理所有 REST 请求
  2. Controller Manager:运行各种控制器,确保集群状态与期望状态一致
  3. 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 kubernetes-the-hard-way 项目地址: https://gitcode.com/gh_mirrors/kub/kubernetes-the-hard-way

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕素丽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值