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

  

posted @ 2022-03-07 08:57  QiuPing  阅读(630)  评论(0编辑  收藏  举报