快速开始

简要概述

k8s生态组件过多,对新人入门并不友好,本项目在于结合当前生产集群维护经验,总结一套标准的部署模版,接入内部gitlab ci实现集群基础设施的自动化管理,同时也会不断迭代优化,以实现快速搭建一套生产可用的环境。

前置说明

操作系统

操作系统支持:ubuntu 20.04 或 debian11

  • ubuntu 20.04

选择最小化,同时安装sshd服务

主机拓扑

角色 建议数量 CPU架构 示例IP
ansible中控 1 amd64 192.168.31.200
负载均衡器 至少1 amd64 192.168.31.200
k8s控制节点 1、3、5 amd64 192.168.31.201/202/203
k8s工作节点 至少1 amd64 192.168.31.204

中控必须配置好免密ssh登录其他节点,如果仅用于部署测试负载均衡器可与中控共用,生产环境负载均衡器必须至少2节点且支持VIP。

环境部署

ansible中控

在中控执行以下步骤:

  • 安装基础软件

ubuntu20.04

apt install -y git ansible
  • 获取部署代码
git clone https://github.com/opsaid/deploy-k8s.git
  • 配置ssh免密登录
ssh-copy-id -p 22 root@192.168.31.20X

负载均衡器

TODO

部署控制平面

步骤1:首次初始化前配置

  • 必要更改的文件
ansible/hosts.ini
ansible/group_vars/all.yaml
  • 可选更改的文件
ansible/group_vars/default.yaml
ansible/group_vars/component-v1.22.yaml
ansible/group_vars/component-v1.26.yaml

选择 component-v1.22 或 compoent-v1.26 是由部署的 k8s 版本所决定。

  • 云提供商个性参数
ansible/group_vars/cloud-provider/private.yaml
ansible/group_vars/cloud-provider/alibaba-cloud.yaml

根据目标主机提供商上,按需更改相应参数。

步骤2:下载依赖的镜像包

方式1:预先下载安装包(推荐)

二进制文件包与镜像包

https://github.com/opsaid/deploy-k8s/releases

方式2:在线下载构建

# 由于网络原因,需要代理 HTTPS 配置用于加速通道传输(127.0.0.1:1087仅为示例)
#export HTTPS_PROXY=http://127.0.0.1:1087

yum install -y docker
systemctl start docker

# 编译制作 pause 镜像需要
yum install -y gcc glibc-static

ansible-playbook -i hosts.ini deploy.yaml -t binary

步骤3:生成集群依赖证书

ansible-playbook -i hosts.ini deploy.yaml -t pki

步骤4:系统公共组件安装

ansible-playbook -i hosts.ini deploy.yaml -t common

确保主机节点已在 host.ini 配置项 [kube_control_plane]

步骤5:部署控制平面节点

ansible-playbook -i hosts.ini deploy.yaml -t control

确保主机节点已在 host.ini 配置项 [kube_control_plane]

步骤6:验证控制平面组件

登录任一控制节点,查看关键组件的运行状态(可能需等待一段时间)

  • 通过 crictl 查看本节点容器
crictl ps

其中"kube-apiserver"、“kube-controller-manager”、“etcd”、“kube-scheduler"组件,必须是"Running"状态。

  • 通过 kubectl 查看所有节点容器
kubectl get pods -n kube-system

其中"kube-apiserver”、“kube-controller-manager”、“etcd”、“kube-scheduler"组件,在各节点必须是"Running"状态。

  • 通过 kubectl 为节点添加标签

当控制平面 Pod 均正常运行时,为控制平面节点添加特殊标签:

for i in $(kubectl get node -o=template --template='{{ range .items }} {{ .metadata.name }} {{end }}')
do
  kubectl label node $i node-role.kubernetes.io/master=
  kubectl label node $i node-role.kubernetes.io/control-plane=
done
  • 通过 kubectl 查看节点状态
kubectl get nodes

确认节点列表 “ROLES” 中均包含 “control-plane,master” 内容。

步骤7:部署集群基础组件

在 k8s 1.26 及之后使用 “cilium” 作为 CNI 并替换 “calico”、“kube-proxy”、“ingress-nginx” 组件功能。

登录任意一个控制平面节点,部署 addons

  • 部署 CNI
kubectl apply -k /etc/kubernetes/addons/cilium/
  • 部署 kube-system 权限等
kubectl apply -k /etc/kubernetes/addons/kube-system/
  • 部署 CoreDNS 等
kubectl apply -k /etc/kubernetes/addons/coredns/
kubectl apply -k /etc/kubernetes/addons/metrics-server/

也可使用 kustomize 替代 kubectl apply -k,如:kustomize build /etc/kubernetes/addons/coredns | kubectl apply -f -

步骤8:本地配置存储集群

  • 存储 kubeadm 配置至集群 ConfigMap

其中配置取 “ClusterConfiguration” 类型 同步至 “kube-system” 下 ConfigMap “kubeadm-config”

kubeadm init phase upload-config kubeadm --config /etc/kubernetes/kubeadm/config.yaml
  • 存储 kubelet 配置至集群 ConfigMap

其中 kubelet 配置取 KubeletConfiguration 同步至 “kube-system” 下 ConfigMap “kubelet-config”

kubeadm init phase upload-config kubelet --config /etc/kubernetes/kubeadm/config.yaml
  • 存储证书至空间 “kube-system” 下 Secret 资源
kubeadm init phase upload-certs --upload-certs --config /etc/kubernetes/kubeadm/config.yaml

其中 “kubeadm-certs” 包含以下几个证书文件:

etcd-ca.crt
etcd-ca.key
front-proxy-ca.crt
front-proxy-ca.key
sa.key
sa.pub
ca.crt
ca.key

步骤9:控制平面相关维护

常见问题

新增工作节点

步骤1:在ansible的host.ini中添加节点

[all]
......
node4 ansible_host=192.168.31.204 ansible_port=22 ip=192.168.31.204

[kube_node]
......
node4

步骤2:ansible中控节点可ssh节点

$HOME/.ssh/authorized_keys

步骤3:系统公共组件安装

ansible-playbook -i hosts.ini deploy.yaml -t common

步骤4:添加集群工作节点

ansible-playbook -i hosts.ini deploy.yaml -t worker

步骤5:验证允许节点加入

  • 查看节点加入请求
kubectl get csr

其中"CONDITION”=“Pending"状态;

  • 授权制定节点的加入
kubectl certificate approve ${node-csr-XXXX}
  • 等待节点加入并状态为可用
kubectl get nodes

在任一控制平面节点执行

完成验收与后续

TODO

使用 calico 作为 CNI

kustomize build /etc/kubernetes/addons/calico/ | kubectl apply -f -
  • 其他可选
kustomize build /etc/kubernetes/addons/ingress-nginx/ | kubectl apply -f -
kustomize build /etc/kubernetes/addons/kube-proxy/ | kubectl apply -f -