K8S

k8s是资源管理器:为了给容器做集群化

使用的是apache的开源协议;是一个开源的分布式资源管理框架;

谷歌有一个组件叫做borg,是管理容器的资源管理器,当时只有谷歌自己可以用,后来用go语言采用corg设计思路创造出k8s

k8s特点:

轻量级(消耗资源少);开源;弹性伸缩(控制节点的数量);负载均衡(不需要自己搭负载调度器,采用ipvs框架)

服务分类:

有状态服务:DBMS ,本身要存放数据

无状态服务:LVS Apache  本身不需要存放数据

borg调度器架构:

K8S_第1张图片

borgmaster是专门负责请求的分发,整个架构的大脑,为了解决单节点故障有很多borgmaster,最好是奇数个,防止无法判断谁是主

borglet是工作节点,给容器提供计算的

浏览器,命令行,文件读取,进行调度集群管理

scheduler是调度器,所有的请求到这里会被分发至不同的节点去运行,它不和borglet交互,它会把数据写入至paxos(键值对数据库)paxos会存储数据,borglet会监听paxos,如果有自己的请求,它就会把请求取出去处理任务

K8s架构图:

K8S_第2张图片

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_第3张图片K8S_第4张图片K8S_第5张图片K8S_第6张图片K8S_第7张图片

K8S_第8张图片

K8S_第9张图片

K8S_第10张图片

K8S_第11张图片

K8S_第12张图片

K8S_第13张图片

K8S_第14张图片

K8S_第15张图片

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 <

调整系统时区

# 设置系统时区为 中国/上海
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 <

升级系统内核为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 <

安装最新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 <

安装kubeadm

cat < /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      29s   v1.15.1
k8s-node02     NotReady      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

 

 

你可能感兴趣的:(K8S)