创建 Kubernetes 群集
使用此示例过程创建上游 Kubernetes 群集。
我们提供此示例过程纯出于信息目的。创建群集的方法多种多样。在本例中,我们使用 kubespray
为了使这些步骤更易于执行,我们使用单独的安装计算机来执行安装并运行 kubectl 和其他工具。
有关创建群集的更多信息,请参阅 Kubernetes 官方文档 (https://kubernetes.io/docs/home/)。
下面的命令行示例不显示目录路径。我们让您可以在目录结构中应用这些命令。
开始之前,请确保已启动计划用于群集节点的服务器或虚拟机。
- 在安装机上安装新操作系统,对操作系统进行最小配置,以用于以下各项:
- 静态 IP 地址和掩码(例如,我们的单个群集为 172.16.0.10/24)和网关
- 访问一个或多个 DNS 服务器
- SSH 连接,包括根 SSH 接入
- Ntp
- 从本地计算机,SSH 以 root 用户身份进入安装计算机。
- 安装 kubectl。在本示例中,我们在安装机器上运行 kubectl。如果要在另一台机器(例如,本地计算机)上运行 kubectl,请改为在此机器上下载并安装 kubectl。
- 此下载 kubectl 版本 1.24.3:
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.24.3/bin/linux/amd64/kubectl
- 使文件可执行,并将其移动到路径中的目录(例如/usr/local/bin)。
chmod +x kubectl
sudo mv kubectl /usr/local/bin
- 此下载 kubectl 版本 1.24.3:
- 为运行的 Python 版本安装 Python 虚拟环境。在本例中,我们运行的是 Python 3.8
python3 --version
apt install -y python3.8-venv
- 如果要安装 Contrail Analytics,请安装 Helm 3.0 或更高版本。
有关如何安装 Helm 的信息,请参阅 https://helm.sh/docs/intro/install/。
- 配置从安装计算机到控制平面和工作节点的无 SSH 密码 root 访问。当您以后运行指南时,这允许 ansible 登录到这些节点。
- 创建 SSH 密钥。
ssh-keygen
在本示例中,我们将 SSH 密钥存储在其默认位置 ~/.ssh/id_rsa.pub。
- 将密钥复制到控制平面和工作节点上的根用户。例如:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.0.11
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.0.12
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.0.13
- 创建 SSH 密钥。
- 克隆 kubespray 目录。在本例中,我们要克隆 2.20 版
例如:
git clone https://github.com/kubernetes-sigs/kubespray -b release-2.20
- 安装所需的软件包,以运行此版本的 kubespray。必需的软件包在 kubespray/requirements.txt 中列出。我们将这些软件包安装在 Python 虚拟环境中
- 设置虚拟环境。
cd kubespray
python3 -m venv env
source env/bin/activate
- 在虚拟环境中安装所需的软件包。
pip3 install -r requirements.txt
注意:在此虚拟环境中执行后续步骤,直至设置群集。此虚拟环境可确保您为这个版本的 kubespray 运行正确版本的 ansible。
- 设置虚拟环境。
- 如果需要,配置 Pod 和服务子网。
kubespray 使用的默认子网在 kubespray/roles/kubespray-defaults/defaults/main.yaml 文件中定义。在该文件中查找以下参数并相应地更改。
kube_service_addresses: 10.233.0.0/18 kube_pods_subnet: 10.233.64.0/18 kube_service_addresses_ipv6: fd85:ee78:d8a6:8607::1000/116 kube_pods_subnet_ipv6: fd85:ee78:d8a6:8607::1:0000/112
注意:如果要创建多群集 CN2 设置,则必须在每个群集上配置不同的 Pod 和服务子网。这些子网在整个多群集中必须是唯一的。
如果您遵循本文档中的多群集示例,请将中央群集上的子网保留为默认值,并在工作负载群集上配置子网,如下所示:
kube_service_addresses: 10.234.0.0/18 kube_pods_subnet: 10.234.64.0/18 kube_service_addresses_ipv6: fd85:ee78:d8a6:8608::1000/116 kube_pods_subnet_ipv6: fd85:ee78:d8a6:8608::1:0000/112
- 如果您在群集中运行 DPDK,请配置 multus。
运行 DPDK 时需要多点。
- 启用多云。
在 kubespray/roles/kubespray-defaults/defaults/main.yaml 中,enable multus:
kube_network_plugin_multus: true
- 将多图版本设置为 0.3.1,这是运行 DPDK 所需的版本。您可以在两个文件中设置版本。
在 kubespray/roles/network_plugin/multus/defaults/main.yml 中,配置 multus 版本:
multus_cni_version: "0.3.1"
在 kubespray/extra_playbooks/roles/network_plugin/multus/defaults/main.yml 中,配置 multus 版本:multus_cni_version: "0.3.1"
- 启用多云。
- 创建供 ansible 使用的库存文件。例如:
all: hosts: # list all nodes here k8s-cp0: # desired hostname ansible_host: 172.16.0.11 k8s-worker0: ansible_host: 172.16.0.12 k8s-worker1: ansible_host: 172.16.0.13 vars: ansible_user: root artifacts_dir: /tmp/mycluster cluster_name: mycluster.contrail.lan container_manager: crio # container runtime download_container: false download_localhost: true download_run_once: true enable_dual_stack_networks: true enable_nodelocaldns: false etcd_deployment_type: host host_key_checking: false kube_network_plugin: cni kube_network_plugin_multus: false kube_version: v1.24.3 kubeconfig_localhost: true kubectl_localhost: true kubelet_deployment_type: host override_system_hostname: true kube-master: hosts: # hostname of control plane node (from hosts section) k8s-cp0: kube-node: hosts: # hostnames of worker nodes (from hosts section) k8s-worker0: k8s-worker1: etcd: hosts: # hostname of control plane node (from hosts section) k8s-cp0: k8s-cluster: children: kube-master: kube-node:
参数设置为
true
后override_system_hostname
,您在文件中指定的主机名 (k8s-cp0
,k8s-worker0
k8s-worker1
, ) 将自动在节点上配置。注意:如果要创建多群集 CN2 设置,则必须为多群集中的每个节点配置不同的节点名称。在整个多群集中,节点名称必须是唯一的。
注意:如果您运行的是 DPDK,请设置
kube_network_plugin_multus: true
。如果要使用不同的容器运行时运行,请更改
container_manager
上述值。确保
enable_nodelocaldns
设置为false
。如果要使用不同数量的控制平面和工作节点运行,请相应地调整库存。
- 根据 inventory.yaml 文件的内容,检查 ansible 是否可以 SSH 进入控制平面和工作节点。在此示例中,inventory.yaml 文件位于 ~/contrail 目录中。
ansible -i inventory.yaml -m ping all
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details k8s-cp0 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } k8s-worker0 | SUCCESS => {ansi "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } k8s-worker1 | SUCCESS => {ansi "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
- 要创建群集,请从 kubespray 目录中运行操作指南。调整以下命令以引用目录结构中的 inventory.yaml。
ansible-playbook -i inventory.yaml cluster.yml
这一步可能需要一个小时或更多时间才能完成,具体取决于群集的大小。注意:您可以安全地忽略网络和 CNI 警告和错误,因为您尚未配置 CNI。
- 或者,停用 Python 虚拟环境。我们已经完成了运行 ansible,因此不再需要虚拟环境。
deactivate
- 将群集的安全令牌复制到默认的 ~/.kube/config 位置。kubeconfig 必须在该默认位置,CN2 工具才能工作。
您可以从 inventory.yaml 文件中找到安全令牌位置。如果您在此示例中使用清单文件,则令牌位于 /tmp/mycluster 中。
mkdir ~/.kube
cp /tmp/mycluster/admin.conf ~/.kube/config
注意:如果您的 kubeconfig 已为现有群集保留令牌,则需要进行合并,而不是覆盖 ~/.kube/config 文件。
- 使用标准 kubectl 命令检查群集的运行状况。
- 显示节点的状态。
kubectl get nodes
NAME STATUS ROLES AGE VERSION k8s-cp0 NotReady control-plane,master 4m57s v1.20.7 k8s-worker0 NotReady <none> 3m17s v1.20.7 k8s-worker1 NotReady <none> 2m45s v1.20.7 user@installer:~$ kubectl describe node k8s-cp0 <trimmed> Conditions: Type Status <trimmed> Reason Message ---- ------ ------ ------- MemoryPressure False KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False KubeletHasSufficientPID kubelet has sufficient PID available Ready False KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: No CNI configuration file in /etc/cni/net.d/. Has your network Addresses: <trimmed>
- 显示 Pod 的状态。
kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE <trimmed> kube-system coredns-657959df74-rprzv 0/1 Pending 0 6m44s <none> <none> <none> <none> kube-system dns-autoscaler-b5c786945 0/1 Pending 0 6m40s <none> <none> <none> <none> kube-system kube-apiserver-k8s-cp0 1/1 Running 0 9m27s 172.16.0.11 k8s-cp0 <none> <none> kube-system kube-controller-manager- 1/1 Running 0 9m27s 172.16.0.11 k8s-cp0 <none> <none> kube-system kube-proxy-k5mcp 1/1 Running 0 7m28s 172.16.0.13 k8s-worker1 <none> <none> kube-system kube-proxy-sccjm 1/1 Running 0 7m28s 172.16.0.11 k8s-cp0 <none> <none> kube-system kube-proxy-wqbt8 1/1 Running 0 7m28s 172.16.0.12 k8s-worker0 <none> <none> kube-system kube-scheduler-k8s-cp0 1/1 Running 0 9m27s 172.16.0.11 k8s-cp0 <none> <none> kube-system nginx-proxy-k8s-worker0 1/1 Running 0 8m2s 172.16.0.12 k8s-worker0 <none> <none> kube-system nginx-proxy-k8s-worker1 1/1 Running 0 7m30s 172.16.0.13 k8s-worker1 <none> <none>
- 显示节点的状态。