springcloud微服务+Kubernetes集群部署实战 (一)

859 阅读6分钟

必读:

首先说一下本次的搭建文章是本人实战过的,目前已用于公司的生产环境。

本次文章内容将从k8s集群的搭建,代码仓库,镜像仓库,持续集成,日志监控等多个方面进行详细的介绍。

本文不是基础的k8s教学,而是让大家在实际工作中能够快速上手并投入生产。所以安装方式都是采用的脚本安装,并不会一步一步的对其内部组件进行讲解。具体详细原理内部组件后续有时间再补上。

硬件最低要求

  • 节点数量:3
  • 单节点内存信息:8G及以上
  • 单节点处理器信息:2核2线程及以上
  • 硬盘总容量:100G及以上
  • 系统版本:CentOS7.4及以上

以上是我测试搭建时的配置,正式环境是用的阿里云。

测试服务器信息

192.168.10.111 root root

192.168.10.112 root root

192.168.10.113 root root

网络要求

  • 各个服务器之间内网互通内网带宽建议1Gbps以上
  • 各个服务器能够访问外网

技术栈

Kubernetes(v1.18.6)+Helm(v3.2.4)+NFS 服务器+Minio+Mysql+Redis+Gitlab+Gitlab Runner+Harbor+Nexus+Jenkins+skywalking+loki+prometheus

微服务采用是是gitee上开源的pigx

Kubernetes集群部署

基于kubeadm-快速搭建k8s集群

环境准备

# 在192.168.10.111中安装 git 命令行
cd /root
sudo yum install git -y
# 克隆本项目代码
git clone https://github.com/choerodon/kubeadm-ha.git
# 进入项目目录
cd kubeadm-ha
# 安装 ansible 环境
sudo ./install-ansible.sh

拷贝项目下的 /root/kubeadm-ha/example/hosts.m-master.ip.ini 文件至项目根目录下,命名为 inventory.ini,修改各服务器的 IP 地址、用户名、密码,并维护好各服务器与角色的关系。

inventory.ini文件示例

; 将所有节点的信息在这里填写
;    第一个字段                  为节点内网IP,部署完成后为 kubernetes 节点 nodeName
;    第二个字段 ansible_port     为节点 sshd 监听端口
;    第三个字段 ansible_user     为节点远程登录用户名
;    第四个字段 ansible_ssh_pass 为节点远程登录用户密码
[all]
c7n-node1 ansible_host=192.168.10.111 ansible_port=22 ansible_user="root" ansible_ssh_pass="root"
c7n-node2 ansible_host=192.168.10.112 ansible_port=22 ansible_user="root" ansible_ssh_pass="root"
c7n-node3 ansible_host=192.168.10.113 ansible_port=22 ansible_user="root" ansible_ssh_pass="root"
 
; 私有云:
;    VIP 负载模式:
;       也就是负载均衡器 + keepalived 模式,比如常用的 haproxy + keepalived。
;       本脚本中负载均衡器有 nginx、openresty、haproxy、envoy 可供选择,设置 lb_mode 即可进行任意切换。
;       设置 lb_kube_apiserver_ip 即表示启用 keepalived,请先与服务器提供部门协商保留一个IP作为 lb_kube_apiserver_ip,
;       一般 lb 节点组中有两个节点就够了,lb节点组中第一个节点为 keepalived 的 master 节点,剩下的都为 backed 节点。
;
;    节点本地负载模式:
;       只启动负载均衡器,不启用 keepalived(即不设置 lb_kube_apiserver_ip),
;       此时 kubelet 链接 apiserver 地址为 127.0.0.1:lb_kube_apiserver_port。
;       使用此模式时请将 lb 节点组置空。
;
; 公有云:
;    不推荐使用 slb 模式,建议直接使用节点本地负载模式。
;    若使用 slb 模式,请先使用节点本地负载模式进行部署,
;    部署成功后再切换至 slb 模式:
;       将 lb_mode 修改为 slb,将 lb_kube_apiserver_ip 设置为购买到的 slb 内网ip,
;       修改 lb_kube_apiserver_port 为 slb 监听端口。
;    再次运行初始化集群脚本即可切换至 slb 模式。
[lb]
 
; 注意etcd集群必须是1,3,5,7...奇数个节点
[etcd]
c7n-node1
c7n-node2
c7n-node3
 
[kube-master]
c7n-node1
c7n-node2
 
 
[kube-worker]
c7n-node1
c7n-node2
c7n-node3
 
; 预留组,后续添加master节点使用
[new-master]
 
; 预留组,后续添加worker节点使用
[new-worker]
 
; 预留组,后续添加etcd节点使用
[new-etcd]
 
; 预留组,后续删除worker角色使用
[del-worker]
 
; 预留组,后续删除master角色使用
[del-master]
 
; 预留组,后续删除etcd角色使用
[del-etcd]
 
; 预留组,后续删除节点使用
[del-node]
 
;-------------------------------------- 以下为基础信息配置 ------------------------------------;
[all:vars]
; 是否跳过节点物理资源校验,Master节点要求2c2g以上,Worker节点要求2c4g以上
skip_verify_node=true
; kubernetes版本
#kube_version="1.20.1"
kube_version="1.18.6"
; 容器运行时类型,可选项:containerd,docker;默认 containerd
container_manager="docker"
 
; 负载均衡器
;   有 nginx、openresty、haproxy、envoy  和 slb 可选,默认使用 nginx
lb_mode="nginx"
; 使用负载均衡后集群 apiserver ip,设置 lb_kube_apiserver_ip 变量,则启用负载均衡器 + keepalived
; lb_kube_apiserver_ip="192.168.56.15"
; 使用负载均衡后集群 apiserver port
lb_kube_apiserver_port="8443"
 
; 网段选择:pod 和 service 的网段不能与服务器网段重叠,
; 若有重叠请配置 `kube_pod_subnet` 和 `kube_service_subnet` 变量设置 pod 和 service 的网段,示例参考:
;    如果服务器网段为:10.0.0.1/8
;       pod 网段可设置为:192.168.0.0/18
;       service 网段可设置为 192.168.64.0/18
;    如果服务器网段为:172.16.0.1/12
;       pod 网段可设置为:10.244.0.0/18
;       service 网段可设置为 10.244.64.0/18
;    如果服务器网段为:192.168.0.1/16
;       pod 网段可设置为:10.244.0.0/18
;       service 网段可设置为 10.244.64.0/18
; 集群pod ip段,默认掩码位 18 即 16384 个ip
kube_pod_subnet="10.244.0.0/18"
; 集群service ip段
kube_service_subnet="10.244.64.0/18"
; 分配给节点的 pod 子网掩码位,默认为 24 即 256 个ip,故使用这些默认值可以纳管 16384/256=64 个节点。
kube_network_node_prefix="24"
 
; node节点最大 pod 数。数量与分配给节点的 pod 子网有关,ip 数应大于 pod 数。
; https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr
kube_max_pods="110"
 
; 集群网络插件,目前支持flannel,calico;calico性能更好
network_plugin="calico"
 
; 若服务器磁盘分为系统盘与数据盘,请修改以下路径至数据盘自定义的目录。
; Kubelet 根目录
kubelet_root_dir="/data/lib/kubelet"
; docker容器存储目录
docker_storage_dir="/data/lib/docker"
; containerd容器存储目录
containerd_storage_dir="/data/lib/containerd"
; Etcd 数据根目录
etcd_data_dir="/data/lib/etcd"

根据你的配置改动一下两处

我的所有服务器都统一外挂一个磁盘目录 /data

其他的如父节点等信息情节和服务器数量自行选定,注意容器类型和网路插件的选择。

记得修改文件/root/kubeadm-ha/roles/plugins/kubernetes-dashboard/templates/kubernetes-dashboard.yaml.j2

设置集群外部访问端口

# 设置外部访问端口
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 31443

部署集群:

  1. # 在项cd /root/kubeadm-ha目录下执行
  2. ansible-playbook -i inventory.ini 90-init-cluster.yml

查看等待 pod 的状态为 runnning(时间较长请耐心等待):

  1. # 任意master节点下执行
  2. kubectl get po --all-namespaces -w

如果部署失败,想要重置集群,执行:

  1. # 在项目根目录下执行
  2. ansible-playbook -i inventory.ini 99-reset-cluster.yml

安装kubernetes-dashboard监控页面

创建dashboard管理员(否则进去页面会报错)

创建两个文件

dashboard-admin.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: dashboard-admin
  namespace: kubernetes-dashboard

dashboard-admin-bind-cluster-role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin-bind-cluster-role
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard

将两个文件放入192.168.10.111服务器的/root/kubeadm-ha下

#执行以下命令创建账号
kubectl create -f dashboard-admin.yaml
为用户分配权限
kubectl create -f dashboard-admin-bind-cluster-role.yaml
#查看并复制用户Token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')

将token保存下来,登录dashboard页面需要用到

访问页面https://192.168.10.111:31443/,输入token即可。

到这里k8s集群已经搭建完毕,后续有时间我会持续更新。喜欢的从朋友可以关注我,有问题的话请在下方留言。