前言

使用kubeadm或者二进制直接搭建k8s集群非常麻烦,如何简答而快速的搭建k8s高可用集群?

kubeasz 官方地址: https://github.com/easzlab/kubeasz

高可用集群架构

如果k8s集群中,属于一主多从,那么当master节点宕机后,服务将不可用。
 

上面的高可用集群有两个worker node,三个master node,两个负载均衡服务器,三个etcd数据库。

主机规划

类型 IP 系统信息 配置
master01 192.168.88.23 Centos 7.9.2009 2核1G 50G磁盘
master02 192.168.88.24 Centos 7.9.2009 2核1G 50G磁盘
master03 192.168.88.25 Centos 7.9.2009 2核1G 50G磁盘
node1 192.168.88.26 Centos 7.9.2009 2核1G 50G磁盘
node2 192.168.88.27 Centos 7.9.2009 2核1G 50G磁盘
lb01 192.168.88.21 Centos 7.9.2009 2核1G 50G磁盘
lb02 192.168.88.22 Centos 7.9.2009 2核1G 50G磁盘
etcd1 192.168.88.23 Centos 7.9.2009 2核1G 50G磁盘
etcd2 192.168.88.24 Centos 7.9.2009 2核1G 50G磁盘
etcd3 192.168.88.25 Centos 7.9.2009 2核1G 50G磁盘

注意: etcd数据库需要是奇数个,1,3,5,…,如果是生成环境建议不少不低于3个。这里etcd复用了master机器。

服务器的安装过程: 请见vmware安装centos7并制作多副本

ansible部署k8s集群

可以在master或者集群外的一台机器上操作,需要该主机到所有其它主机的免密登录,

1、 配置ssh免密码登录,需要从操作机到集群其它机器的免密登录;

请见:如何配置ssh免密登录

2、 安装ansible;

yum install epel-release -y
yum install ansible -y

1、 下载ezdown;

export release=3.1.0

# 国外地址(由于网络原因,可能需要多次尝试才能下载成功)
curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown

# 国内地址 (国内下载地址,不会失败)
curl -C- -fLO --retry 3  https://github.91chi.fun//https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown

# 修改文件的执行权限
chmod +x ezdown

# ezdown执行下载文件(根据网络情况,下载可能需要几分钟)
./ezdown -D

 

1、 创建k8s集群,并修改配置文件;

# 切换目录
cd /etc/kubeasz/

# 创建一个集群,名称为k8s
./ezctl new k8s

 

1、 修改/etc/kubeasz/clusters/k8s/hosts文件;

vim /etc/kubeasz/clusters/k8s/hosts

 
6、 执行集群安装,安装完成后如下;

# 执行安装,这个过程根据网络和服务器的速度而定,可能需要30分钟左右
./ezctl setup k8s-01 all

 
7、 查看节点信息;

kubectl get node

 

服务部署测试

1、 创建deployment.yaml,内容如下;

apiVersion: apps/v1  版本号
kind: Deployment   类型
metadata:  元数据
  name: pc-deployment   rs名称
  namespace: dev  所属命名空间
spec: 详情
  replicas: 3副本数量3
  selector:选择器,通过它指定该控制器管理哪些pod
    matchLabels:labels匹配规则,用于匹配template
      app: nginx-pod
  template: 模板,当副本数量不足时,会根据模板创建pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.1
          ports:
            - containerPort: 80

创建deployment

[root@centos7 home]# vim deployment.yaml
[root@centos7 home]# kubectl create -f deployment.yaml 
deployment.apps/pc-deployment created
[root@centos7 home]# kubectl get pods -n dev -o wide
NAME                             READY   STATUS              RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
nginx                            1/1     Running             0          63m   172.20.2.5   192.168.88.27   <none>           <none>
pc-deployment-5ffc5bf56c-5t4d6   1/1     Running             0          13s   172.20.2.6   192.168.88.27   <none>           <none>
pc-deployment-5ffc5bf56c-dc9z4   0/1     ContainerCreating   0          13s   <none>       192.168.88.26   <none>           <none>
pc-deployment-5ffc5bf56c-h768h   0/1     ContainerCreating   0          13s   <none>       192.168.88.26   <none>           <none>
[root@centos7 home]# kubectl get pods -n dev -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
nginx                            1/1     Running   0          63m   172.20.2.5   192.168.88.27   <none>           <none>
pc-deployment-5ffc5bf56c-5t4d6   1/1     Running   0          31s   172.20.2.6   192.168.88.27   <none>           <none>
pc-deployment-5ffc5bf56c-dc9z4   1/1     Running   0          31s   172.20.3.5   192.168.88.26   <none>           <none>
pc-deployment-5ffc5bf56c-h768h   1/1     Running   0          31s   172.20.3.4   192.168.88.26   <none>           <none>

1、 创建service-nodeport.yaml,内容如下;

apiVersion: v1  版本号
kind: Service   类型
metadata:  元数据
  name: service-nodeport   svc名称
  namespace: dev  所属命名空间
spec: 详情
  selector:选择器,通过它指定该控制器管理哪些pod
    app: nginx-pod
  type: NodePort
  ports:
    - port: 80   Service端口
      nodePort: 30002指定绑定的node的端口(默认的取值范围是30000~32767),如果不指定,会默认分配
      targetPort: 80pod端口

创建service

[root@centos7 home]# kubectl create -f service-nodeport.yaml 
service/service-nodeport created
[root@centos7 home]# kubectl get svc -n dev -o wide
NAME               TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service-nodeport   NodePort   10.68.244.39   <none>        80:30002/TCP   12s   app=nginx-pod

1、 打开浏览器访问,可以看到部署的nginx可以被访问到;
  2、 宕机测试,直接关闭一台master节点,一台etcd(etcd复用了master机器),一台worker节点,此时集群为一主一从再次访问服务,可以发现服务依然可用;
 
 

添加一个master

# 向集群名为k8s的集群中添加一台master
ezctl add-master k8s 192.168.88.25

 

其它ezctl指令

# 帮助
[root@centos7 kubeasz]# ezctl help
Usage: ezctl COMMAND [args]
-------------------------------------------------------------------------------------
Cluster setups:
    list		             to list all of the managed clusters
    显示集群
    checkout    <cluster>            to switch default kubeconfig of the cluster
    切换集群
    new         <cluster>            to start a new k8s deploy with name 'cluster'
    创建新集群
    setup       <cluster>  <step>    to setup a cluster, also supporting a step-by-step way
    执行集群的操作
    start       <cluster>            to start all of the k8s services stopped by 'ezctl stop'
    启动该所有被停止的k8s 服务
    stop        <cluster>            to stop all of the k8s services temporarily
    停止所有的k8s服务
    upgrade     <cluster>            to upgrade the k8s cluster
    升级
    destroy     <cluster>            to destroy the k8s cluster
    销毁
    backup      <cluster>            to backup the cluster state (etcd snapshot)
    备份etcd
    restore     <cluster>            to restore the cluster state from backups
    回复etcd
    start-aio		             to quickly setup an all-in-one cluster with 'default' settings
    使用默认设置all-in-one部署集群

Cluster ops:
    add-etcd    <cluster>  <ip>      to add a etcd-node to the etcd cluster
    添加etcd数据库
    add-master  <cluster>  <ip>      to add a master node to the k8s cluster
    添加master
    add-node    <cluster>  <ip>      to add a work node to the k8s cluster
    添加worker node
    del-etcd    <cluster>  <ip>      to delete a etcd-node from the etcd cluster
    删除etcd
    del-master  <cluster>  <ip>      to delete a master node from the k8s cluster
    删除master
    del-node    <cluster>  <ip>      to delete a work node from the k8s cluster
    删除worker node

Extra operation:
    kcfg-adm    <cluster>  <args>    to manage client kubeconfig of the k8s cluster
    管理k8s集群的配置

Use "ezctl help <command>" for more information about a given command.
[root@centos7 kubeasz]#