Kubernetes的概念

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。由于Kubernetes中首尾字母中间有8个字母,所以Kubernetes也被叫做K8S。所以下文提到的K8S均指的是Kubernetes。

为什么要使用?

  • 对于开发人员
      1)、大大降低日志收集和操作时间
      由于公司业务多,开发环境、测试环境、预生产环境和生产环境都是隔离的,而且除了生产环境,为了节省成本,其他环境是没有日志收集的,在没有用k8s的时候,查看线下测试的日志,需要开发或者测试人员,找到对应的机器,在找到对应的容器,然后才能查看日志,在用了k8s之后,开发和测试可以直接在k8s的dashboard到对应的namespace,即可定位到业务的容器,然后可以直接通过控制台查看到对应的日志,大大降低了操作时间。
      2)、大大提高开发效率
      把应用部署到k8s之后,代码的发布、回滚,以及蓝绿发布、金丝雀发布等都变得特别简单,不仅加快了业务代码迭代的速度,而且全程无需人工干预。目前我们使用jenkins、gitrunner进行发版或者回滚等,从开发环境到测试环境,到最后的生产环境,完全遵守一次构建,多集群、多环境部署,通过不同的启动参数、不同的环境变量、不同的配置文件实现区分不同的环境。目前已经实现Python、Java、PHP、NodeJS、Go、.NET Core等多种语言的一键式发版、一键式回滚,大大提高了开发人员的开发效率。
      3)、侧重点更集中,更关注于代码本身
      在使用服务网格后,开发人员在开发应用的过程中,不用再关心代码的网络部分,这些功能都被服务网格实现,让开发人员可以只关心代码逻辑部分,即可实现网络部分的功能,比如:断流、分流、路由、负载均衡、限速和触发故障等功能。
      4)、部署测试更容易、更便捷、更高效
      测试过程中,可能同时多套环境,当然也会需要再创建一套测试环境,之前测试环境的创建,需要找运维或者自行手工搭建。在迁移至k8s集群后,只需要在jenkins上点点鼠标即可在k8s集群上创建一套新的测试环境。
  • 对于运维人员
      1)、大大降低运维成本
      如果你是一名运维人员,可能经常因为一些重复、繁琐的工作感觉厌倦。比如:这个需要一套新的测试环境,那个需要一套新的测试环境,之前可能需要装系统、装依赖环境、开通权限等等。而如今,可以直接用镜像直接部署一套新的测试环境,甚至全程无需自己干预,开发人员通过jenkins或者自动化运维平台即可一键式创建,大大降低了运维成本。
      2)、容错率和自动解决错误提高
      一开始,公司业务故障,可能是因为基础环境不一致、依赖不一致、端口冲突等等问题,现在实现镜像部署,所有的依赖、基础都是一样的,大大减少了因为这类基础问题引发的故障。也有可能公司业务是由于服务器宕机、网络等问题,造成服务不可用,此类情况均需要运维人员及时去修复,而如今,可能在你收到告警信息的时候,k8s已经帮你恢复了。
      3)、大大提高资源利用率
      在没有使用k8s时,业务应用的扩容和缩容,都需要人工去处理,从采购服务器、上架、到部署依赖环境,不仅需要大量的人力物力,而且非常容易在中间过程出现问题,又要花费大量的时间去查找问题。成功上架后,还需要在前端反代端添加或该服务器,而如今,可以利用k8s的弹性计算,一键式进行扩容和缩容,不仅大大提高了运维效率,而且还节省了不少的服务器资源,提高了资源利用率。
      4)、对运维人员技术要求降低,更简单和易上手
      对于反代配置方面,比如可能你并不会,或者对nginx的配置规则并不熟悉,一些高级的功能你也不会实现,而如今,利用k8s的ingress即可简单的实现那些负责的逻辑。并且也不会在遇到nginx少加一个斜杠和多加一个斜杠的问题。
      5)、自动扩容和管理
      对于负载均衡方面,之前负载均衡可能是Nginx、LVS、HAProxy、F5等,云上可能是云服务商提供的不在均衡机制。每次添加删除节点时,都需要手动去配置前端负载均衡,手动去匹配后端节点,而如今,使用k8s内部的service可以动态发现实现自动管理节点,并且支持自动扩容缩容。之前遇到高峰流量时,经常服务器性能不够,需要临时加服务器面对高峰流量,而如今对于高性能k8s集群,无需管理,自动扩容。
      6)、大大降低的出错率
      对于高可用方面,k8s天生的高可用功能,彻底释放了双手,无需再去创建各类高可用工具、检测检查脚本。k8s支持进程级别的健康检查,如发现接口超时或者返回值不正确,会自动处理该问题。
      7)、对于中间件搭建方面,根据定义好的deploy文件,可以实现秒级搭建各类中间件高可用集群,如Redis、RabbitMQ、Zookeeper等,并且大大减少了出错的概率。
      8)、统一配置、统一管理、自动实现负载均衡
      对于应用端口方面,传统行业中,一个服务器可能跑了很多进程,每个进程都有一个端口,需要人为的去配置端口,并且还需要考虑端口冲突的问题,如果有防火墙的话,还需要配置防火墙,在k8s中,端口统一管理,统一配置,每个应用的端口都可设置成一样的,之后通过service进行负载均衡。
    总结
      综上所述,无论是对于开发人员、测试人员还是运维人员,k8s的诞生,不仅减少了工作的复杂性,还减少了各种成本。上述带来的变革只是其中比较小的一部分,更多优点只有用了才能体会到。

配置要求

为了能够搭建高效、稳定、安全的k8s高可用系统,需对服务器各项要素,进行周到的考虑:
硬件配置要求:参考自阿里云-集群管理最佳实践-ECS选型

master节点规格:

通过容器服务创建的Kubernetes集群,Master节点上运行着etcd、kube-apiserver、kube-controller等核心组件,对于Kubernetes集群的稳定性有着至关重要的影响,对于生产环境的集群,必须慎重选择Master规格。Master规格跟集群规模有关,集群规模越大,所需要的Master规格也越高。

  • 注:
    可从多个角度衡量集群规模,例如节点数量、Pod数量、部署频率、访问量。这里简单的认为集群规模就是集群里的节点数量
    对于常见的集群规模,可以参见如下的方式选择Master节点的规格(对于测试环境,规格可以小一些。下面的选择能尽量保证Master负载维持在一个较低的水平上)
    节点规模master规格
    1~5个节点4核8G(不建议2核4G)
    6~20个节点4核16G
    21~100个节点8核32G
    100~200个节点16核64G

Worker节点规格

  • 确定整个集群的日常使用的总核数以及可用度的容忍度。
    例如:集群总的核数有160核,可以容忍10%的错误。那么最小选择10台16核ECS,并且高峰运行的负荷不要超过16090%=144核。如果容忍度是20%,那么最小选择5台32核ECS,并且高峰运行的负荷不要超过16080%=128核。这样就算有一台ECS出现故障,剩余ECS仍可以支持现有业务正常运行。
  • 确定CPU:Memory比例。对于使用内存比较多的应用例如Java类应用,建议考虑使用1:8的机型。

    设置各个节点的IP为固定IP

    vim /etc/sysconfig/network-scripts/ifcfg-ens33
     1、将BOOTPROTO设置为 static
     2、将IPADDR设置成目标IP
     3、将子网掩码【NETMASK】设置成255.255.255.0
     4、将网关【GATEWAY】设置成和虚拟机一个网段 [和物理主机的网关和DNS保持一致;ipconfig/all]
     5、设置DNS
    

在这里插入图片描述

部署前或部署时,请使用以下命令将环境的各类信息清理干净:

df -h|grep kubelet |awk -F % '{print $2}'|xargs umount 
rm /var/lib/kubelet/* -rf
rm /etc/kubernetes/* -rf
rm /var/lib/rancher/* -rf
rm /var/lib/etcd/* -rf
rm /var/lib/cni/* -rf
iptables -F && iptables -t nat –F
ip link del flannel.1
docker ps -a|awk '{print $1}'|xargs docker rm -f
docker volume ls|awk '{print $2}'|xargs docker volume rm

初始化服务器

  • 1、安装依赖包
sudo yum update && sudo  yum install -y  yum-utils  device-mapper-persistent-data   lvm2   lrzsz  conntrack ntpdate ntp ipvsadm ipset iptables curl  sysstat libseccomp wget vim net-tools git
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum repolist
sudo yum install -y jq
  • 2、设置防火墙为Iptables并设置空规则
systemctl stop firewalld && systemctl disable firewalld # 关闭防火墙
yum -y install iptables-services && systemctl start iptables  &&  systemctl enable iptables && iptables -F && service iptables save
  • 3、关闭selinux
# 临时关闭
	setenforce 0
#永久关闭
	#方法1:
		sed -i 's/enforcing/disable/' /etc/selinux/config
	#方法2
		vim /etc/selinux/config
		SELINUX=enforcing 修改为SELINUX=disable
  • 4、配置名称解析以及配置主机名称
hostnamectl set-hostname 主机名
vim /etc/hosts   # 将所有的节点服务的IP和名称加入进去,如:192.168.0.12  K8SMaster
  • 5、配置时间同步
yum install ntpdate -y
ntpdate time.windows.com
  • 6、关闭swap交换分区
# 临时关闭
swapoff  -a 
# 永久关闭
	# 方法一  
		sed -ri 's/.*swap.*/#&/' /etc/fstab
	# 方法二
		vim  /etc/fstab  # 注释或删除掉  /dev/mapper/centos-swap行
# 检查是否关闭交换分区
free -m  # 若swap行出现的全部是0,则代表已经关闭
  • 7、调整系统时区
#设置系统时区为  中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的TTC时间写入硬件时钟
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl  restart rsyslog && systemctl  restart crond
  • 8、将桥接的ipv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system #生效
  • 9、添加阿里云的yum软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

kubeadm安装准备工作

  • 调整内核参数,对于k8s
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0  #禁止使用 swap空间,只有当系统OOM时才允许使用它
vm.overcommit_memory=1 #不检查物理内存是否够用
vm.panic_on_oom=0 #开启OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

##
cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf

关闭系统不需要的服务

systemctl stop postfix && systemctl disable postfix 

设置rsyslogd和systemd journald【日志保存方式】

mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d

cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
#持久化保存到磁盘
Storage=persistent
#压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
#最大占用空间 10G
SystemMaxUse=10G
#单个日志文件最大 200M
SystemMaxFileSize=200M
#日志保存时间 2周
MaxRetentionSec=2week
#不将日志转发到 syslog
ForwardToSyslog=no
EOF

systemctl restart systemd-journald

升级系统内核为4.44

centos7.x系统自带的3.10.x内核存在一些Bugs,导致运行的Docker、Kubernetes不稳定,例如:rpm -Uvh http://www.elrepo.org/elrepo-release-7.0.3.el7.elrepo.noarch.rpm

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

#安装完成后检查 /boot/grub2/grub.cfg中对应内核menuentry中是否包含initrd16配置,如果没有,在安装一次
yum --enablerepo=elrepo-kernel  install  -y kernel-lt 

#设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"

#以新的内核重新启动
reboot

#查看内核
uname -r

kube-proxy开启ipvs的前置条件

modprobe  br_netfilter

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#! /bin/bash
modprobe  --  ip_vs
modprobe  --  nf_conntrack_ipv4
modprobe  --  ip_vs_rr 
modprobe  --  ip_vs_wrr
modprobe  --  ip_vs_sh
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules  &&  bash   /etc/sysconfig/modules/ipvs.modules  &&  lsmod  |  grep -e ip_vs  -e  nf_conntrack_ipv4

Docker安装

yum  install -y  yum-utils  device-mapper-persistent-data   lvm2
#添加阿里镜像稳定版仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast  #更新yum缓存

yum list docker-ce --showduplicates|sort -r #查看选择docker-ce各版本

# 安装指定版本的docker-ce
sudo yum update -y &&  yum install docker-ce-19.03.9-3.el7 -y
#安装最新版本
sudo yum update -y && yum install docker-ce  -y

#创建/etc/docker
mkdir  /etc/docker

#配置daemon
cat > /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": ["https://hlusxtb4.mirror.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
        "log-opts": {
            "max-size": "100m"
        },
    "insecure-registries": ["192.168.10.130"]
}
EOF

mkdir  -p  /etc/systemd/system/docker.service.d

# 启动和设置自启
 systemctl  daemon-reload   &&  systemctl  start docker && systemctl enable docker

**以上所有操作和步骤就是搭建K8S的准备工作,往对各位有效

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐