文章目录

  • 前言
  • 高可用集群架构
  • 主机规划
  • ansible部署k8s集群
  • 服务部署测试
  • 添加一个master
  • 其它ezctl指令


前言

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

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

高可用集群架构

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

在k8s上部署ES集群 k8s es集群_nginx

上面的高可用集群有两个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

在k8s上部署ES集群 k8s es集群_运维_02

  1. 创建k8s集群,并修改配置文件
# 切换目录
cd /etc/kubeasz/

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

在k8s上部署ES集群 k8s es集群_linux_03

  1. 修改/etc/kubeasz/clusters/k8s/hosts文件
vim /etc/kubeasz/clusters/k8s/hosts

在k8s上部署ES集群 k8s es集群_linux_04


6. 执行集群安装,安装完成后如下。

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

在k8s上部署ES集群 k8s es集群_运维_05


7. 查看节点信息

kubectl get node

在k8s上部署ES集群 k8s es集群_服务器_06

服务部署测试

  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: 80 #pod端口

创建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. 在k8s上部署ES集群 k8s es集群_nginx_07

  3. 宕机测试,直接关闭一台master节点,一台etcd(etcd复用了master机器),一台worker节点,此时集群为一主一从。再次访问服务,可以发现服务依然可用。
  4. 在k8s上部署ES集群 k8s es集群_在k8s上部署ES集群_08


  5. 在k8s上部署ES集群 k8s es集群_linux_09

添加一个master

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

在k8s上部署ES集群 k8s es集群_在k8s上部署ES集群_10

其它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]#