一、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

  

最新文章

  1. android html.fromHtml 用例
  2. Windows 10系统更换Windows 7系统磁盘分区注意事项一
  3. (原创)如何使用selenium 驱动chrome浏览器并且打开方式为手机模式-转载请注明出处
  4. PHP扩展开发入门
  5. mysql 启动失败
  6. python核心编程学习记录之函数与函数式编程
  7. (转) CCTextFieldTTF输入框
  8. magento首页调用最新产品
  9. 二十四种设计模式:外观模式(Facade Pattern)
  10. ASP.net中GridView中增加一行记录并默认显示为编辑状态
  11. SQLite入门与分析(七)---浅谈SQLite的虚拟机
  12. MVC3中使用AuthorizeAttribute特性来完成登陆权限的验证
  13. Android Dev
  14. 给id赋值
  15. HDU 5066 Harry And Physical Teacher(物理题)
  16. TCP通讯处理粘包详解
  17. 关于ckeditor过滤掉html样式标签之我见
  18. Java的参数传递是「值传递」还是「引用传递」?
  19. MariaDB Galera Cluster 部署 + keepalived实现高可用
  20. ionic3 应用内打开第三方地图导航 百度 高德

热门文章

  1. $forceUpdate和this.$set(&#39;userInfo&#39;,name,&#39;小红&#39;);
  2. fabric学习笔记5
  3. 数据每三位增加一个逗号(即千分符) js
  4. js 字符串中提取ip地址
  5. k8s 删除 node节点
  6. mysql拼接多条字段
  7. 常用 包vue-clipboard2
  8. nacos服务端和客户端版本不一致的时候,客户端无限刷日志
  9. Zabbix3.4 安装配置
  10. Foxmail配置Exchange报错:RPC 服务器不可用 的解决方法