k8s是资源管理器:为了给容器做集群化
使用的是apache的开源协议;是一个开源的分布式资源管理框架;
谷歌有一个组件叫做borg,是管理容器的资源管理器,当时只有谷歌自己可以用,后来用go语言采用corg设计思路创造出k8s
k8s特点:
轻量级(消耗资源少);开源;弹性伸缩(控制节点的数量);负载均衡(不需要自己搭负载调度器,采用ipvs框架)
服务分类:
有状态服务:DBMS ,本身要存放数据
无状态服务:LVS Apache 本身不需要存放数据
borg调度器架构:
borgmaster是专门负责请求的分发,整个架构的大脑,为了解决单节点故障有很多borgmaster,最好是奇数个,防止无法判断谁是主
borglet是工作节点,给容器提供计算的
浏览器,命令行,文件读取,进行调度集群管理
scheduler是调度器,所有的请求到这里会被分发至不同的节点去运行,它不和borglet交互,它会把数据写入至paxos(键值对数据库)paxos会存储数据,borglet会监听paxos,如果有自己的请求,它就会把请求取出去处理任务
K8s架构图:
Kubernetes将集群中的机器划分为一个Master节点和一群工作节点(Node)。其中,Master节点上运行着集群管理相关的一组进程etcd、API Server、Controller Manager、Scheduler,后三个组件构成了Kubernetes的总控中心,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且全都是自动完成。在每个Node上运行Kubelet、Proxy、Docker daemon三个组件,负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能。
Master节点:
API Server所有服务访问统一入口,API Server对外暴露了API,提供web服务
controller Manager维持副本期望值数目,负责维护集群的状态,比如故障检测、自动扩展、滚动更新
Scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
etcd是分布式键值对数据库,存储k8s集群所有持久化数据,可以说是存了整个集群的状态
Node节点:
Pod在k8s里最小的部署单位不是容器而是Pod,所以讲dockerfile需要转化成Pod对象,再交由k8s创建
Kubelet是直接跟容器引擎交互实现容器的生命周期管理,它和Master节点协作,实现Pod的创建、启动、监控、重启、等集群管理工作
kube-proxy负责写入规则值防火墙,实现服务的负载均衡和反向代理
docker负责用于运行容器(Pod)
fluentd有助于提供集群层面日志
网络:不同pod之间,同物理机:通过Docker0网桥进行数据交换;不同物理机:Flannel通过基于UDP数据报文进行二次封装的数据转换模式
同pod中的不同容器:lo
控制器:RS RC Deplyment Daemonset statufulset job cronjob
软路由设置:
k8s的安装:
kubeadm安装工具:mater节点给node节点分配请求任务,node里有多个pod,一个pod里有多个容器
- 实验准备:
一个master节点,两个node节点,一个软路由
- master节点
配置要两核四G
指定网关给ikuai,dns给ikuai,DNS1=192.168.66.29是因为ikuai也是DNS服务器
- 两个Node节点
配置要一核三G
初始化
修改主机名,为了让node节点显示信息更为详细;给三台主机的/etc/hosts文件设置DNS解析,让其互相解析
[root@localhost ~]# hostnamectl set-hostname k8s-master01 [root@localhost ~]# hostnamectl set-hostname k8s-node01 [root@localhost ~]# hostnamectl set-hostname k8s-node02
[root@localhost ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.66.11 k8s-master01 m1 192.168.66.12 k8s-node01 n1 192.168.66.13 k8s-node02 n2
安装依赖包:
yum install -y conntrack ntpdate ntp ipvsadm ipset iptables curl sysstat libseccomp wget vim net-tools git
设置防火墙为iptables并设置控规则:
systemctl stop firewalld && systemctl disable firewalld yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
关闭交换分区:因为k8s调用的时候如果把swap内存当做真内存用的话,速度会很慢
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
调整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
调整系统时区
# 设置系统时区为 中国/上海 timedatectl set-timezone Asia/Shanghai # 将当前的 UTC 时间写入硬件时钟 timedatectl set-local-rtc 0 # 重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond
关闭系统不需要的服务
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(查看内核版本)
#将内核4.4版本软件包拉到三台机器中进行安装 kernel-lt-4.4.222-1.el7.elrepo.x86_64.rpm yun安装 cat /boot/grub2/grub.cfg | grep 4.4 #查看内核名称 #指定内核名字: grub2-set-default 'CentOS Linux (4.4.222-1.el7.elrepo.x86_64) 7 (Core)'
重启机器:reboot
kubeadm部署安装:
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
安装最新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 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" }, "insecure-registries": ["harbor.hongfu.com"] } EOF mkdir -p /etc/systemd/system/docker.service.d # 重启docker服务 systemctl daemon-reload && systemctl restart docker && systemctl enable docker
安装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
将kubeadm镜像拉到master中
kubeadm-basic.images.tar.gz tar -zxvf kubeadm-basic.images.tar.gz #解压软件包 vim 1.sh #编写一个将kubadm里的东西一次放到/tmp/cache.txt #!/bin/bash cd /root/kubeadm-basic.images ls /root/kubeadm-basic.images > /temp/cache.txt for i in $( cat /tmp/cache.txt ) do docker load -i $i done rm -rf /temp/cache.txt #执行脚本 ./1.sh
初始化主节点:
kubeadm config print init-defaults > kubeadm-config.yaml vim kubeadm-config.yaml advertiseAddress: 192.168.66.11 kubernetesVersion: v1.15.1 networking下添加 podSubnet: "10.244.0.0/16" 在尾部添加 --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration featureGates: SupportIPVSProxyMode: true mode: ipvs
初始化
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config添加工作节点
三个机器都执行,此条命令要在这条命令执行后cat /usr/local/kubernetes/init/kubeadm-init.log的最后一条才能看到 kubeadm join 192.168.66.11:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:520b14db81a03717634f28e592d54de74356608252e752887d9e4ae736a29be5
再次查看
#查看集群名称、当前的节点,当前的版本kubectl get node [root@k8s-master01 manifests]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master01 NotReady master 16m v1.15.1 k8s-node01 NotReady <none> 29s v1.15.1 k8s-node02 NotReady <none> 54s v1.15.1
将flannel.tar.gz拖到linux中解压
mkdir /usr/local/kubernetes/flannel mv * /usr/local/kubernetes/flannel/ cd !$ docker load -i flannel.tar scp flannel.tar root@n1:/root/;docker load -i flannel.tar scp flannel.tar root@n2:/root/;docker load -i flannel.tar
运行:
kubectl apply -f kube-flannel.yml 再次查看kubectl get node,都已经成为ready状态 #查看所有名称空间信息 [root@k8s-master01 flannel]# kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-5c98db65d4-282xj 1/1 Running 0 45m kube-system coredns-5c98db65d4-v9p52 1/1 Running 0 45m kube-system etcd-k8s-master01 1/1 Running 0 44m kube-system kube-apiserver-k8s-master01 1/1 Running 0 44m kube-system kube-controller-manager-k8s-master01 1/1 Running 0 44m kube-system kube-flannel-ds-amd64-5n6wr 1/1 Running 0 92s kube-system kube-flannel-ds-amd64-dfqzn 1/1 Running 0 92s kube-system kube-flannel-ds-amd64-mv8fs 1/1 Running 0 92s kube-system kube-proxy-bvxtg 1/1 Running 0 45m kube-system kube-proxy-h872k 1/1 Running 0 29m kube-system kube-proxy-kj64m 1/1 Running 0 29m kube-system kube-scheduler-k8s-master01 1/1 Running 0 44m
什么是pod:
- 两种:自主式pod;控制器管理的pod
自主式pod:不被管理器管理的pod,如果gg了不会自己重启
控制管理器的pod:被管理器管理的pod,如果gg了会自动重启满足期望值
一个pod里有多个容器,pod里默认有一个pause容器,会随着pod启动而启动,容器公用pause的网络栈,存储卷;但是pod里的容器的进程的独立的
- 控制器:RS Deployment Service
RS:如果有pod gg了就会有新的pod启动来满足期望值;虽然RS可以独立使用,但是还是用Deployment来管理RS,因为它支持滚动更新(滚动更新就是可以将老版本更新成新版本),Deployment并不支持pod的创建,更新的时候它负责创建新的RS,RS负责创建pos
同一组pod(被同一个RS管理的pos)才能被访问
- 网络实现:
同一个pod内的多个容器之间互相访问:pod网络栈的lo网卡
各个pod之间的通讯:overlay network
pod与service之间的通讯:
overlay network是如何实现的:
kubectl:客户端控制工具 kubeadm:集群化管理工具 kubelet要设置为开机自启
systemctl enable kubelet