Kubernetes 作为当今最流行的容器编排平台,提供了强大的功能来管理和扩展容器化应用。除了使用 kubeadm
等工具简化集群的创建过程外,直接通过二进制文件安装 Kubernetes 组件也是一种常见的方法。这种方式给予用户更多的控制权,并且适用于那些希望深入理解 Kubernetes 内部工作原理的人。本文将详细介绍如何通过二进制方式搭建一个功能齐全的 Kubernetes 集群,并分享一些实用技巧和注意事项。
在开始之前,请确保您的环境满足以下条件:
在所有节点上执行如下命令以更新软件包列表并安装必要的依赖项:
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
为了加快 Docker 的安装速度,我们将使用阿里云提供的 Docker 源。
# 添加阿里云 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
# 创建或编辑 /etc/yum.repos.d/docker-ce.repo 文件
cat <
启动并启用 Docker 服务:
sudo systemctl start docker
sudo systemctl enable docker
接下来,在所有节点上下载所需的 Kubernetes 组件(kubelet
、kubectl
、kubeadm
)。虽然我们这里不使用 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 的服务器,并执行以下步骤:
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。同样地,我们需要编写一个 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
等待几分钟直到所有组件都成功启动。
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 状态。
当 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 提供了更大的灵活性,但在实际应用中也要注意以下几点:
感谢您的阅读!如果您对 Kubernetes 或者二进制方式搭建集群有任何疑问或见解,欢迎继续探讨。