快速开始
2 分钟阅读
简要概述
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 -