SaltStack自动化部署HA-Kubernetes

  • 本项目在GitHub上,会不定期更新,大家也可以提交ISSUE,地址为:https://github.com/skymyyang/salt-k8s-ha
  • SaltStack自动化部署Kubernetes v1.12.5版本(支持HA、TLS双向认证、RBAC授权、Flannel网络、ETCD集群、Kuber-Proxy使用LVS等)。
  • SaltStack自动化部署 Kubernetes v1.13.4 版本,请切换到 1.13-Release 分支.

版本明细:Release-v1.12.5

  • 测试通过系统:Centos 7.6
  • salt-ssh:salt-ssh 2018.3.3 (Oxygen)
  • Kubernetes: v1.12.5
  • Etcd:v3.3.10
  • Docker:最新版本即可
  • Flannel:v0.10.0
  • CNI-Plugins:v0.7.0
  • 建议部署节点:最少三个Master节点,请配置好主机名解析(必备)

架构介绍

  1. 使用Salt Grains进行角色定义,增加灵活性。
  2. 使用Salt Pillar进行配置项管理,保证安全性。
  3. 使用Salt SSH执行状态,不需要安装Agent,保证通用性。
  4. 使用Kubernetes当前稳定版本v1.12.5,保证稳定性。
  5. 使用HaProxy和keepalived来保证集群的高可用。

0.系统初始化(必备)

  1. 设置主机名!!!

    [root@linux-node1 ~]# cat /etc/hostname
    linux-node1 [root@linux-node2 ~]# cat /etc/hostname
    linux-node2 [root@linux-node3 ~]# cat /etc/hostname
    linux-node3 [root@linux-node4 ~]# cat /etc/hostname
    linux-node4
  2. 设置/etc/hosts保证主机名能够解析
    [root@linux-node1 ~]# cat /etc/hosts
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    :: localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.150.141 linux-node1
    192.168.150.142 linux-node2
    192.168.150.143 linux-node3
    192.168.150.144 linux-node4
  3. 关闭SELinux和防火墙以及NetworkManager
     systemctl disable --now firewalld NetworkManager
    setenforce
    sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config
  4. 设置时间同步客户端
    yum install chrony -y
    
    cat <<EOF > /etc/chrony.conf
    server ntp.aliyun.com iburst
    stratumweight
    driftfile /var/lib/chrony/drift
    rtcsync
    makestep
    bindcmdaddress 127.0.0.1
    bindcmdaddress ::
    keyfile /etc/chrony.keys
    commandkey
    generatecommandkey
    logchange 0.5
    logdir /var/log/chrony
    EOF systemctl restart chronyd
    systemctl enable --now chronyd
  5. 升级内核
    #因为市面上包管理下内核版本过低,安装docker后无论centos还是ubuntu会有如下bug,.15的内核依然存在
    
    kernel:unregister_netdevice: waiting for lo to become free. Usage count = 
    
    #安装必要软件包
    
    yum install wget git  jq psmisc vim perl -y
    
    #升级内核需要使用 elrepo 的yum 源,首先我们导入 elrepo 的 key并安装 elrepo 源
    
    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm #查看可用内核
    yum --disablerepo="*" --enablerepo="elrepo-kernel" list available --showduplicates #自选版本内核安装方法
    export Kernel_Vsersion=4.18.-
    wget http://mirror.rc.usf.edu/compute_lock/elrepo/kernel/el7/x86_64/RPMS/kernel-ml{,-devel}-${Kernel_Vsersion}.el7.elrepo.x86_64.rpm
    yum localinstall -y kernel-ml* #查看这个内核里是否有这个内核模块
    find /lib/modules -name '*nf_conntrack_ipv4*' -type f #修改内核启动顺序,默认启动的顺序应该为1,升级以后内核是往前面插入,为0(如果每次启动时需要手动选择哪个内核,该步骤可以省略)
    grub2-set-default && grub2-mkconfig -o /etc/grub2.cfg #使用下面命令看看确认下是否启动默认内核指向上面安装的内核
    grubby --default-kernel #docker官方的内核检查脚本建议(RHEL7/CentOS7: User namespaces disabled; add 'user_namespace.enable=1' to boot command line),使用下面命令开启
    grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)" #重新加载内核
    reboot
  6. 设置IPVS模块所需加载的模块(所有机器)
    $ :> /etc/modules-load.d/ipvs.conf
    $ module=(
    ip_vs
    ip_vs_lc
    ip_vs_wlc
    ip_vs_rr
    ip_vs_wrr
    ip_vs_lblc
    ip_vs_lblcr
    ip_vs_dh
    ip_vs_sh
    ip_vs_fo
    ip_vs_nq
    ip_vs_sed
    ip_vs_ftp
    )
    $ for kernel_module in ${module[@]};do
    /sbin/modinfo -F filename $kernel_module |& grep -qv ERROR && echo $kernel_module >> /etc/modules-load.d/ipvs.conf || :
    done
    $ systemctl enable --now systemd-modules-load.service
  7. 需要设定/etc/sysctl.d/k8s.conf的系统参数
    $ cat <<EOF > /etc/sysctl.d/k8s.conf
    # https://github.com/moby/moby/issues/31208
    # ipvsadm -l --timout
    # 修复ipvs模式下长连接timeout问题 小于900即可
    net.ipv4.tcp_keepalive_time =
    net.ipv4.tcp_keepalive_intvl =
    net.ipv4.tcp_keepalive_probes =
    net.ipv6.conf.all.disable_ipv6 =
    net.ipv6.conf.default.disable_ipv6 =
    net.ipv6.conf.lo.disable_ipv6 =
    net.ipv4.neigh.default.gc_stale_time =
    net.ipv4.conf.all.rp_filter =
    net.ipv4.conf.default.rp_filter =
    net.ipv4.conf.default.arp_announce =
    net.ipv4.conf.lo.arp_announce =
    net.ipv4.conf.all.arp_announce =
    net.ipv4.ip_forward =
    net.ipv4.tcp_max_tw_buckets =
    net.ipv4.tcp_syncookies =
    net.ipv4.tcp_max_syn_backlog =
    net.ipv4.tcp_synack_retries =
    net.bridge.bridge-nf-call-ip6tables =
    net.bridge.bridge-nf-call-iptables =
    net.netfilter.nf_conntrack_max =
    fs.inotify.max_user_watches=
    fs.may_detach_mounts =
    fs.file-max =
    fs.nr_open =
    net.bridge.bridge-nf-call-arptables =
    vm.swappiness =
    vm.overcommit_memory=
    vm.panic_on_oom=
    EOF $ sysctl --system
  8. 以上条件必须严格检查,否则,一定不会部署成功!

1.设置部署节点到其它所有节点的SSH免密码登录(包括本机)

[root@linux-node1 ~]# ssh-keygen -t rsa
[root@linux-node1 ~]# ssh-copy-id linux-node1
[root@linux-node1 ~]# ssh-copy-id linux-node2
[root@linux-node1 ~]# ssh-copy-id linux-node3
[root@linux-node1 ~]# ssh-copy-id linux-node4
[root@linux-node1 ~]# scp /etc/hosts linux-node2:/etc/
[root@linux-node1 ~]# scp /etc/hosts linux-node3:/etc/
[root@linux-node1 ~]# scp /etc/hosts linux-node4:/etc/

2.安装Salt-SSH并克隆本项目代码。

2.1 安装Salt SSH(注意:老版本的Salt SSH不支持Roster定义Grains,需要2017.7.4以上版本)

[root@linux-node1 ~]# yum install -y https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
[root@linux-node1 ~]# sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-latest.repo
[root@linux-node1 ~]# yum install -y salt-ssh git unzip

2.2 获取本项目代码,并放置在 /srv 目录

[root@linux-node1 ~]# git clone https://github.com/skymyyang/salt-k8s-ha.git
[root@linux-node1 ~]# cd salt-k8s-ha/
[root@linux-node1 ~]# mv * /srv/
[root@linux-node1 srv]# /bin/cp /srv/roster /etc/salt/roster
[root@linux-node1 srv]# /bin/cp /srv/master /etc/salt/master

2.3 下载二进制文件,也可以自行官方下载,为了方便国内用户访问,请在百度云盘下载,下载k8s-v1.12.5-auto.zip。 下载完成后,将 files 目录移动到 /srv/salt/k8s/ 目录下,并解压 Kubernetes二进制文件下载地址: https://pan.baidu.com/s/1Ag2ocpVmkg-uEoV13A7HFw

[root@linux-node1 ~]# cd /srv/salt/k8s/
[root@linux-node1 k8s]# unzip k8s-v1.12.5-auto.zip
[root@linux-node1 k8s]# rm -f k8s-v1.12.5-auto.zip
[root@linux-node1 k8s]# ls -l files/
total
drwxr-xr-x root root Jan : cfssl-1.2
drwxr-xr-x root root Jan : cni-plugins-amd64-v0.7.4
drwxr-xr-x root root Jan : etcd-v3.3.10-linux-amd64
drwxr-xr-x root root Jan : flannel-v0.10.0-linux-amd64
drwxr-xr-x root root Jan : k8s-v1.12.5

3.Salt SSH管理的机器以及角色分配

  • k8s-role: 用来设置K8S的角色
  • etcd-role: 用来设置etcd的角色,如果只需要部署一个etcd,只需要在一台机器上设置即可
  • etcd-name: 如果对一台机器设置了etcd-role就必须设置etcd-name
[root@linux-node1 ~]# vim /etc/salt/roster
linux-node1:
host: 192.168.150.141
user: root
priv: /root/.ssh/id_rsa
minion_opts:
grains:
k8s-role: master
etcd-role: node
etcd-name: etcd-node1 linux-node2:
host: 192.168.150.142
user: root
priv: /root/.ssh/id_rsa
minion_opts:
grains:
k8s-role: master
etcd-role: node
etcd-name: etcd-node2 linux-node3:
host: 192.168.150.143
user: root
priv: /root/.ssh/id_rsa
minion_opts:
grains:
k8s-role: master
etcd-role: node
etcd-name: etcd-node3 linux-node4:
host: 192.168.150.144
user: root
priv: /root/.ssh/id_rsa
minion_opts:
grains:
k8s-role: node

4.修改对应的配置参数,本项目使用Salt Pillar保存配置

[root@k8s-m1 ~]# vim /srv/pillar/k8s.sls
#设置Master的IP地址(必须修改)
MASTER_IP_M1: "192.168.150.141"
MASTER_IP_M2: "192.168.150.142"
MASTER_IP_M3: "192.168.150.143"
#设置Master的HOSTNAME完整的FQDN名称(必须修改)
MASTER_H1: "linux-node1"
MASTER_H2: "linux-node2"
MASTER_H3: "linux-node3" #设置ETCD集群访问地址(必须修改)
ETCD_ENDPOINTS: "https://192.168.150.141:2379,https://192.168.150.142:2379,https://192.168.150.143:2379" FLANNEL_ETCD_PREFIX: "/kubernetes/network" #设置ETCD集群初始化列表(必须修改)
ETCD_CLUSTER: "etcd-node1=https://192.168.150.141:2380,etcd-node2=https://192.168.150.142:2380,etcd-node3=https://192.168.150.143:2380" #通过Grains FQDN自动获取本机IP地址,请注意保证主机名解析到本机IP地址
NODE_IP: {{ grains['fqdn_ip4'][] }}
HOST_NAME: {{ grains['fqdn'] }}
#设置BOOTSTARP的TOKEN,可以自己生成
BOOTSTRAP_TOKEN: "be8dad.da8a699a46edc482"
TOKEN_ID: "be8dad"
TOKEN_SECRET: "da8a699a46edc482"
ENCRYPTION_KEY: "8eVtmpUpYjMvH8wKZtKCwQPqYRqM14yvtXPLJdhu0gA="
#配置Service IP地址段
SERVICE_CIDR: "10.1.0.0/16" #Kubernetes服务 IP (从 SERVICE_CIDR 中预分配)
CLUSTER_KUBERNETES_SVC_IP: "10.1.0.1" #Kubernetes DNS 服务 IP (从 SERVICE_CIDR 中预分配)
CLUSTER_DNS_SVC_IP: "10.1.0.2" #设置Node Port的端口范围
NODE_PORT_RANGE: "20000-40000" #设置POD的IP地址段
POD_CIDR: "10.2.0.0/16" #设置集群的DNS域名
CLUSTER_DNS_DOMAIN: "cluster.local." #设置Docker Registry地址
#DOCKER_REGISTRY: "https://192.168.150.135:5000" #设置Master的VIP地址(必须修改)
MASTER_VIP: "192.168.150.253" #设置网卡名称
VIP_IF: "ens32"

5.执行SaltStack状态

  1. 测试Salt SSH联通性

    [root@k8s-m1 ~]# salt-ssh '*' test.ping

    执行高级状态,会根据定义的角色再对应的机器部署对应的服务

  2. 部署Etcd,由于Etcd是基础组建,需要先部署,目标为部署etcd的节点
    [root@linux-node1 ~]# salt-ssh -L 'linux-node1,linux-node2,linux-node3' state.sls k8s.etcd
  3. 部署K8S集群
    [root@linux-node1 ~]# salt-ssh '*' state.highstate

    由于包比较大,根据电脑硬件配置,这里执行时间较长,5分钟+,喝杯咖啡休息一下,如果执行有失败可以再次执行即可!

6.测试Kubernetes安装

#先验证etcd
[root@linux-node1 ~]# source /etc/profile
[root@linux-node1 ~]# etcdctl --endpoints=https://192.168.150.141:2379 \
--ca-file=/opt/kubernetes/ssl/ca.pem \
--cert-file=/opt/kubernetes/ssl/etcd.pem \
--key-file=/opt/kubernetes/ssl/etcd-key.pem cluster-health
[root@linux-node1 ~]# etcdctl --endpoints=https://192.168.150.141:2379 \
--ca-file=/opt/kubernetes/ssl/ca.pem \
--cert-file=/opt/kubernetes/ssl/etcd.pem \
--key-file=/opt/kubernetes/ssl/etcd-key.pem member list
[root@linux-node1 ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd- Healthy {"health":"true"}
etcd- Healthy {"health":"true"}
etcd- Healthy {"health":"true"}
[root@k8s-m1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
linux-node1 Ready master 14m v1.12.5
linux-node2 Ready master 24m v1.12.5
linux-node3 Ready master 24m v1.12.5
linux-node4 Ready node 30m v1.12.5

7.测试Kubernetes集群和Flannel网络

[root@linux-node1 ~]# kubectl create deployment nginx --image=nginx:alpine
deployment.apps/nginx created
需要等待拉取镜像,可能稍有的慢,请等待。
[root@linux-node1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-54458cd494-8fj47 / Running 13s [root@linux-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-54458cd494-8fj47 / Running 111s 10.2.70.3 linux-node1 <none> <none> 测试联通性
[root@linux-node1 ~]# ping -c 10.2.70.3
PING 10.2.69.2 (10.2.69.2) () bytes of data.
bytes from 10.2.69.2: icmp_seq= ttl= time=2.02 ms --- 10.2.69.2 ping statistics ---
packets transmitted, received, % packet loss, time 0ms
rtt min/avg/max/mdev = 2.028/2.028/2.028/0.000 ms [root@linux-node1 ~]# curl --head http://10.2.70.3
HTTP/1.1 OK
Server: nginx/1.15.
Date: Wed, Feb :: GMT
Content-Type: text/html
Content-Length:
Last-Modified: Thu, Jan :: GMT
Connection: keep-alive
ETag: "5c53857b-264"
Accept-Ranges: bytes 测试扩容,将Nginx应用的Pod副本数量拓展到2个节点
[root@linux-node1 ~]# kubectl scale deployment nginx --replicas=
deployment.extensions/nginx scaled [root@linux-node1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-54458cd494-8fj47 / Running 5m4s
nginx-54458cd494-qzhpf / Running 17s

8.如何新增Kubernetes节点

  • 设置SSH无密码登录,并且在 /etc/hosts 中继续增加对应的解析。确保所有节点都能解析
  • 在 /etc/salt/roster 里面,增加对应的机器
  • 执行SaltStack状态 salt-ssh '*' state.highstate
[root@linux-node5 ~]# vim /etc/salt/roster
linux-node5:
host: 192.168.150.145
user: root
priv: /root/.ssh/id_rsa
minion_opts:
grains:
k8s-role: node
[root@linux-node1 ~]# salt-ssh 'linux-node5' state.highstate

9.下一步要做什么?

你可以安装Kubernetes必备的插件。如何安装必备的插件。请参考该项目的原地址。

基于saltstack自动化部署高可用kubernetes集群的更多相关文章

  1. 基于Containerd安装部署高可用Kubernetes集群

    转载自:https://blog.weiyigeek.top/2021/7-30-623.html 简述 Kubernetes(后续简称k8s)是 Google(2014年6月) 开源的一个容器编排引 ...

  2. hype-v上centos7部署高可用kubernetes集群实践

    概述 在上一篇中已经实践了 非高可用的bubernetes集群的实践 普通的k8s集群当work node 故障时是高可用的,但是master node故障时将会发生灾难,因为k8s api serv ...

  3. kubeasz 部署高可用 kubernetes 集群

    文章目录 环境准备 配置模板机 配置hosts解析 配置ssh 免密钥登陆 kubeasz 部署服务准备 配置主机清单 部署集群 环境准备 IP HOSTNAME SYSTEM 192.168.131 ...

  4. 高可用Kubernetes集群-16. ansible快速部署

    说明 本文档指导采用二进制包的方式快速部署高可用kubernetes集群. 脚本托管:k8s-ansible(持续更新) 参考:高可用kubernetes集群 组件版本 组件 版本 备注 centos ...

  5. 搭建高可用kubernetes集群(keepalived+haproxy)

    序 由于单master节点的kubernetes集群,存在master节点异常之后无法继续使用的缺陷.本文参考网管流程搭建一套多master节点负载均衡的kubernetes集群.官网给出了两种拓扑结 ...

  6. 高可用Kubernetes集群-3. etcd高可用集群

    五.部署高可用etcd集群 etcd是key-value存储(同zookeeper),在整个kubernetes集群中处于中心数据库地位,以集群的方式部署,可有效避免单点故障. 这里采用静态配置的方式 ...

  7. 高可用Kubernetes集群原理介绍

    ■ 文/ 天云软件 云平台开发工程师 张伟 1. 背景 Kubernetes作为容器应用的管理中心,对集群内部所有容器的生命周期进行管理,结合自身的健康检查及错误恢复机制,实现了集群内部应用层的高可用 ...

  8. 使用Kubeadm搭建高可用Kubernetes集群

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...

  9. 高可用Kubernetes集群-12. 部署kubernetes-ingress

    参考文档: Github:https://github.com/kubernetes/ingress-nginx Kubernetes ingress:https://kubernetes.io/do ...

随机推荐

  1. 《Linux就该这么学》第十五天课程

    本次课所学习的是DNS域名解析服务! 下面提供一些DNS有关的内容 如需进一步学习,请前往https://www.linuxprobe.com/chapter-13.html 工作模式: 1.主服务器 ...

  2. ajax相关知识总结

    一.原生AJAX的兼容版本实现 function createXhr(){ var Xhr = null; //浏览器的判断 if(window.XMLHttpRequest){ //ie789 ch ...

  3. C#项目学习记录

    1,   Visual Studio Code 添加VS 2017的开发人员命令提示符---C#编译环境 2,  C#编译器和CLI的安装 注意:自己的电脑上配置环境变量时,配置在系统变量的Path中 ...

  4. lwip协议栈移植(1)

    lwip移植分为两类: 1,只移植内核核心,用户应用程序编写只能基于raw/callback api进行 2,移植内核核心和上层API函数模块,用户可以使用所有三种API编程,即 raw/callba ...

  5. @RequestParam与@PathVariable

    @PathVariable 带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义 通过 @PathVariable 可以 ...

  6. window7 32位部署django

    window7 32位安装环境,所有的软件都用32位的,如果你想要用64位的软件需要操作系统和下面的相关软件都换成64位,我是在虚拟机上装了win7 32版做的测试. 软件下载地址: python2. ...

  7. 【转载】关于在centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法

    3.7版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装即可. #yum install libffi-devel -y #make install 原文:https://blo ...

  8. 解决nginx下connect() to 127.0.0.1:3000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: 错误信息

    尝试搭建nginx负载均衡,做域名转发时报如上错误,困扰了好长时间还好没放弃,还好百度找到解决办法: 是SeLinux导致: 1.执行下面的命令 setsebool -P httpd_can_netw ...

  9. linux根目录介绍

    1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...

  10. mysql case when then else end 的写法

    select t.colum1,t.colum2 (case when t.colum1 = '' then '' t.when colum2 = '' then '' else '' end ) a ...