kubernetes 集群搭建(二进制方式)

Kubernetes 作为当今最流行的容器编排平台,提供了强大的功能来管理和扩展容器化应用。除了使用 kubeadm 等工具简化集群的创建过程外,直接通过二进制文件安装 Kubernetes 组件也是一种常见的方法。这种方式给予用户更多的控制权,并且适用于那些希望深入理解 Kubernetes 内部工作原理的人。本文将详细介绍如何通过二进制方式搭建一个功能齐全的 Kubernetes 集群,并分享一些实用技巧和注意事项。

准备工作

在开始之前,请确保您的环境满足以下条件:

  • 操作系统:支持的操作系统包括 Ubuntu、CentOS 等主流 Linux 发行版。
  • 硬件要求:至少两台机器(一台作为 Master 节点,另一台或更多作为 Worker 节点),每台机器建议配置至少 2GB RAM 和 2 CPU 核心。
  • 网络连接:所有节点之间需要能够互相通信,最好是在同一个局域网内。
  • 时间同步:确保所有节点的时间一致,可以安装 NTP 服务来自动同步时间。
  • 防火墙设置:根据实际情况调整防火墙规则,允许必要的端口访问(如 6443, 2379-2380, 10250, 10251, 10252 等)。

安装依赖项

在所有节点上执行如下命令以更新软件包列表并安装必要的依赖项:

Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
CentOS
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

安装 Docker(使用国内镜像源)

为了加快 Docker 的安装速度,我们将使用阿里云提供的 Docker 源。

Ubuntu/Debian

# 添加阿里云 Docker 源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce

CentOS

# 创建或编辑 /etc/yum.repos.d/docker-ce.repo 文件
cat <

启动并启用 Docker 服务:

sudo systemctl start docker
sudo systemctl enable docker

下载 Kubernetes 组件

接下来,在所有节点上下载所需的 Kubernetes 组件(kubeletkubectlkubeadm)。虽然我们这里不使用 kubeadm 来初始化集群,但是它仍然可以用于某些辅助操作。我们将从官方 GitHub 发布页面获取这些组件的二进制文件。

下载二进制文件

假设我们要部署 Kubernetes v1.26.0 版本,可以根据官方文档找到对应的发布地址,并下载相应的 tarball 文件。然后解压并将可执行文件放置到 /usr/local/bin 目录下:

# 下载并解压 Kubernetes 二进制文件
wget https://dl.k8s.io/v1.26.0/kubernetes-server-linux-amd64.tar.gz
tar -xvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin/
sudo cp kubelet kubectl /usr/local/bin/

# 设置正确的权限
sudo chmod +x /usr/local/bin/kubelet
sudo chmod +x /usr/local/bin/kubectl

对于 kubectl,还可以选择将其配置为特定版本,以便与集群保持一致:

sudo mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

配置 Master 节点

现在我们已经准备好配置 Master 节点了。请登录到您计划用作 Master 的服务器,并执行以下步骤:

初始化 etcd

etcd 是 Kubernetes 的键值存储数据库,用于保存集群状态信息。您可以选择安装独立的 etcd 实例或者使用静态 Pod 来运行 etcd。在这里我们将介绍如何使用静态 Pod 启动 etcd。

首先,创建一个名为 etcd.yaml 的文件来定义 etcd Pod 的配置:

apiVersion: v1
kind: Pod
metadata:
  name: etcd
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - name: etcd
    image: quay.io/coreos/etcd:v3.5.0
    command:
      - "/usr/local/bin/etcd"
      - "--data-dir"
      - "/var/lib/etcd"
      - "--advertise-client-urls"
      - "http://127.0.0.1:2379"
      - "--listen-client-urls"
      - "http://0.0.0.0:2379"
      - "--initial-advertise-peer-urls"
      - "http://127.0.0.1:2380"
      - "--listen-peer-urls"
      - "http://0.0.0.0:2380"
      - "--initial-cluster"
      - "default=http://127.0.0.1:2380"
      - "--initial-cluster-token"
      - "etcd-cluster-0"
      - "--initial-cluster-state"
      - "new"
    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-storage
  volumes:
  - hostPath:
      path: /var/lib/etcd
    name: etcd-storage

保存后,使用 kubectl 应用此配置:

kubectl apply -f etcd.yaml --kubeconfig=/etc/kubernetes/admin.conf

配置 API Server

接下来是配置 API Server。同样地,我们需要编写一个 YAML 文件来描述 API Server 的配置。以下是 apiserver.yaml 的示例内容:

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - name: kube-apiserver
    image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.0
    command:
      - "/usr/local/bin/kube-apiserver"
      - "--etcd-servers=http://127.0.0.1:2379"
      - "--service-cluster-ip-range=10.96.0.0/12"
      - "--insecure-bind-address=0.0.0.0"
      - "--secure-port=6443"
      - "--allow-privileged=true"
      - "--advertise-address="
      - "--authorization-mode=Node,RBAC"
      - "--enable-admission-plugins=NodeRestriction"
      - "--tls-cert-file=/etc/kubernetes/pki/apiserver.crt"
      - "--tls-private-key-file=/etc/kubernetes/pki/apiserver.key"
      - "--client-ca-file=/etc/kubernetes/pki/ca.crt"
      - "--service-account-key-file=/etc/kubernetes/pki/sa.pub"
      - "--service-account-signing-key-file=/etc/kubernetes/pki/sa.key"
      - "--service-account-issuer=https://kubernetes.default.svc.cluster.local"
      - "--service-account-api-audiences=api"
      - "--proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt"
      - "--proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key"
      - "--requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt"
      - "--requestheader-allowed-names=front-proxy-client"
      - "--requestheader-extra-headers-prefix=X-Remote-Extra-"
      - "--requestheader-group-headers=X-Remote-Group"
      - "--requestheader-username-headers=X-Remote-User"
      - "--kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt"
      - "--kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key"
      - "--enable-bootstrap-token-auth=true"
      - "--token-auth-file=/etc/kubernetes/pki/tokens.csv"
      - "--audit-log-maxage=30"
      - "--audit-log-maxbackup=3"
      - "--audit-log-maxsize=100"
      - "--audit-log-path=/var/log/kube-apiserver/audit.log"
    volumeMounts:
    - mountPath: /etc/kubernetes/pki
      name: pki
    - mountPath: /var/log/kube-apiserver
      name: audit-log
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki
    name: pki
  - hostPath:
      path: /var/log/kube-apiserver
    name: audit-log

请注意替换 为实际 Master 节点的 IP 地址。此外,还需要提前生成所需的证书和密钥文件,这可以通过 cfssl 工具来完成。具体步骤可以参考官方文档。

配置其他控制平面组件

除了 API Server 和 etcd 外,Kubernetes 控制平面还包括 Scheduler 和 Controller Manager。它们也可以通过静态 Pod 的方式来配置。这里不再赘述详细的配置文件,因为其结构与上述类似,只是命令参数有所不同。

启动控制平面组件

当所有的控制平面组件配置完毕后,可以使用 kubectl 来启动它们:

kubectl apply -f .yaml --kubeconfig=/etc/kubernetes/admin.conf

等待几分钟直到所有组件都成功启动。

安装 Pod 网络插件

Kubernetes 需要一个 CNI (Container Network Interface) 插件来为 Pods 提供网络连接。有许多不同的 CNI 实现可供选择,例如 Flannel、Calico 等。在这里我们将使用 Flannel 作为示例:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

等待几分钟直到所有的 Pod 都变为 Running 状态。

加入 Worker 节点

当 Master 节点成功配置并且 Pod 网络插件已安装后,就可以让其他节点加入集群了。回到 Master 节点上,使用 kubeadm token create 命令生成一个新的加入令牌,然后在每个 Worker 节点上运行如下命令来加入集群:

kubeadm join : --token  --discovery-token-ca-cert-hash sha256:

注意,这个 token 是有时效性的,默认有效期为24小时,如果过期可以重新生成新的 token。

验证集群状态

最后,我们可以使用 kubectl get nodes 来查看当前集群中的所有节点及其状态。理想情况下,你应该看到 Master 和所有 Worker 节点都处于 Ready 状态。

kubectl get nodes

此外,还可以检查 Pod 和 Service 是否正常工作:

kubectl get pods --all-namespaces
kubectl get services --all-namespaces

注意事项

尽管通过二进制方式安装 Kubernetes 提供了更大的灵活性,但在实际应用中也要注意以下几点:

  • 安全性:确保正确设置了 RBAC 规则、网络策略等安全措施,防止潜在的安全漏洞。
  • 性能优化:合理配置资源限制和请求,避免不必要的浪费或争用。
  • 备份恢复:定期备份 etcd 数据库和其他重要配置文件,以便于灾难恢复。
  • 监控告警:集成 Prometheus、Grafana 等监控工具,实时掌握集群健康状况。
  • 日志管理:采用 ELK Stack 或其他日志聚合方案来集中收集和分析日志信息。

结语

感谢您的阅读!如果您对 Kubernetes 或者二进制方式搭建集群有任何疑问或见解,欢迎继续探讨。

你可能感兴趣的:(kubernetes,容器,云原生)