K8s试验环境搭建(一)
一、kubernetes简介
1、什么是kubernetes?
kubernetes是google公司用go语言开发的一套容器编排系统,简称k8s;它主要用于容器编排;所谓容器编排简单的我们可以理解为管理容器;这个有点类似openstack,不同的是openstack是用来管理虚拟机,而k8s中是管理的pod(所谓pod就是容器的一个外壳,里面可以跑一个或多个容器,可以理解为pod就是将一个或多个容器逻辑的组织在一起);k8s除了可以全生命周期的管理pod,它还可以实现pod的自动化部署,自动修复以及动态的扩缩容等功能;
2、k8s架构
提示:k8s是master/node模型,master是整个k8s的管理端,其上主要运行etcd,api server ,scheduler,controllermanager以及网络相关插件;其中etcd是一个kv键值存储数据库,主要存放k8s中所有配置信息以及pod状态信息,一旦etcd宕机,k8s整个系统将不可用;apiserver主要用来接收客户端请求,也是k8s中唯一的入口;用户的所有管理操作都是将请求发送给apiserver;scheduler主要用来调度用户请求,比如用户要在k8s系统上运行一个pod,至于这个pod该运行在那个node节点,这个就需要scheduler的调度;controllermanager主要用来管理以及监控pod状态;对于scheduler调度的结果,controlmanager就负责让对应节点上的对应pod精准处于调度的状态;node的节点是k8s的工作节点,主要用于运行pod;node节点主要运行的应用有docker,kubelet,kube-proxy;其中docker是用来运行容器的,kubelet主要负责执行master端controllermanager下发的任务;kube-proxy主要用来生成pod网络相关iptables或ipvs规则的;
3、k8s工作过程
提示:k8s工作过程如上图所示,首先用户将请求通过https发送给apiserver,apiserver收到请求后,首先要验证客户端证书,如果通过验证,然后再检查用户请求的资源是否满足对应api请求的语法,满足则就把对应的请求资源以及资源状态信息存放在etcd中;scheduler和controllermanager以及kubelet这三个组件会一直监视着apiserver上的资源变动,一旦发现有合法的请求进来,首先scheduler会根据用户请求的资源,来评判该资源该在那个节点上创建,然后scheduler把对应的调度信息发送给apiserver,然后controllermanager结合scheduler的调度信息,把对应创建资源的方法也发送给apiserver;最后是各节点上的kubelet通过scheduler的调度信息来判断对应资源是否在本地执行,如果是,它就把controllermanager发送给apiserver的创建资源的方法在本地执行,把对应的资源在本地跑起来;后续controllermanager会一直监视着对应的资源是否健康,如果对应资源不健康,它会尝试重启资源,或者重建资源,让对应资源处于我们定义的状态;
详细工作过程参见https://www.cnblogs.com/QiuPing-blog/p/15976611.html
二、部署说明
部署k8s集群的方式有两种,一种是在各节点上把对应的组件运行为容器的形式;第二种是将各组件运行为守护进程的方式;对于不同的环境我们部署的方式也有不同,对于测试环境,我们可以使用单master节点,单etcd实例,node节点按需而定;生产环境首先是etcd要高可用,我们要创建etcd高可用集群,一般创建3个或5个或7个节点;其次master也要高可用,高可用master我们需要注意apiserver是无状态的可多实例,前端使用nginx或haproxy做调度即可;对于scheduler和controller这两个组件各自只能有一个活动实例,如果是多个实例,其余的只能是备用;
测试环境部署k8s,将各组件运行为容器
#测试环境 子网掩码:255.255.255.0 网关:172.168.30.1 DNS:183.221.253.100 k8s-master01 -->centos7.9-4核8G-100G --> 172.168.30.110 k8s-node01 -->centos7.9-4核4G-100G --> 172.168.30.111 k8s-node02 -->centos7.9-4核4G-100G --> 172.168.30.112 harbor -->centos7.9-4核4G-100G --> 172.168.30.113 openWrt(软路由) -->centos7.9-4核8G-300M --> 172.168.30.114
三、集群搭建
参考视频:https://www.bilibili.com/video/BV1w4411y7Go?p=12
1、更改主机名称
hostnamectl set-hostname k8s-master01 hostnamectl set-hostname k8s-node01 hostnamectl set-hostname k8s-node02
2、更改host对应
172.168.30.110 k8s-master01 172.168.30.111 k8s-node01 172.168.30.112 k8s-node02 #复制host到111,112 scp /etc/hosts root@k8s-node01:/etc/hosts scp /etc/hosts root@k8s-node02:/etc/hosts
3、更改yum源
#备份现有源配置 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak #下载并替代本地源 yum install -y wget wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache #添加epel源 rpm -qa |grep epel rpm -e epel-release wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo yum clean all yum makecache
4、yum升级
yum -y update
5、安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
6、关闭防火墙
systemctl stop firewalld && systemctl disable firewalld yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
7、关闭selinux
vim /etc/selinux/config SELINUX=disabled
8、调整内核参数
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
9、调整系统时区
timedatectl set-timezone Asia/Shanghai timedatectl set-local-rtc 0 systemctl restart rsyslog systemctl restart crond
10、关闭系统不需要的服务
systemctl stop postfix && systemctl disable postfix
11、设置日志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
12、升级系统内核
#CentOS 7.x系统自带的内核存在一下bug,导致运行docker、kubernetes不稳定 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.189-1.el7.elrepo.x86_64) 7(Core)'
13、kube-proxy开启ipvs的前置条件
modprobe br_netfilter cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
14、安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum update -y && yum install -y docker-ce ##创建/etc/docker目录 mkdir /etc/docker #配置daemon cat > /etc/docker/daemon.json <<EOF {"exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": {"max-size": "100m" }} EOF mkdir -p /etc/systemd/system/docker.service.d #重启docker服务 systemctl daemon-reload && systemctl restart docker && systemctl enable docker
15、安装kubeadm(主从配置)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1 systemctl enable kubelet.service
16、初始化主节点
#安装kubeadm yum install -y kubeadm kubeadm config print init-defaults > kubeadm-config.yaml
#修改kubeadm-config.yam文件,advertiseAddress为本机IP地址,podSubnet: "10.244.0.0/16" localAPIEndpoint: advertiseAddress: 172.168.30.110 networking: podSubnet: "10.244.0.0/16" serviceSubnet: 10.96.0.0/12 #初始化master kubeadm init --pod-network-cidr="10.244.0.0/16" \ --kubernetes-version="v1.20.0" \ --image-repository="registry.aliyuncs.com/google_containers" \ --ignore-preflight-errors=Swap #在家目录创建目录 mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config #查看当前节点 kubectl get node
17、部署网络
mkdir install-k8s/core mv kubeadm-init.log kubeadm-config.yaml install-k8s/core cd install-k8s/ && mkdir plugin && cd plugin && mkdir flannel && cd flannel wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl create -f kube-flannel.yml kubectl get pod -n kube-system kubectl get node
18、添加node节点(后面有添加需求时)
#重新生成新的token kubeadm token create #查看是否存在有效的token kubadm token list #获取ca证书 sha256编码hash值 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' #执行node节点加入 kubeadm join 172.168.30.110:6443 --token vy68f1.208g2lcj84d6enk8 --discovery-token-ca-cert-hash sha256:a584f95229df14847b242cdc617a959dd0db425a60973bb9ba10cd478cd1d826 #k8s master端验证是否正常 kubectl get nodes