首先我在这里说明一下我为什么学习K8S,现在的大型联网公司基本都镜像的方式进行一个管理(docker教程),但是当镜多的时候就不方便管理和维护所以就产生了Kubernetes这个组件。

在这里插入图片描述

一、什么是Kubernetes

         Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

二、Kubernetes 的特点

  1. 轻量级:消耗资源小
  2. 弹性伸缩
  3. 负载均衡:IPVS

三、Kubernetes 架构

在这里插入图片描述

etcd 的官方将它定位成一个可信赖的分布式键值存储服务,它能高为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。

组件介绍
APISERVER: 所有服务统一入口
CrontrollerManager:维持副本期望数目
Scheduler:负责介绍任务,选择合适的节点进行分配任务
ETCD:键值对数据库 储存K8S集群所有重要信息(持久化)
Kubelet:直接跟容器引擎交互实现容器的生命周期管理
Kube-proxy:负责写入规则至 IPTABLES、IPVS 实现服务映射访问的
COREDNS:可以为集群中的SVC创建一个域名IP的对应关系解析
DASHBOARD:给 K8S 集群提供一个 B/S 结构访问体系
INGRESS CONTROLLER:官方只能实现四层代理,INGRESS 可以实现七层代理
FEDERATION:提供一个可以跨集群中心多K8S统一管理功能
PROMETHEUS:提供K8S集群的监控能力
ELK:提供 K8S 集群日志统一分析介入平台

四、Pod的概念

4.1 Replication Controller与Replicaset与Deployment区别

Replication Controller 用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收在新版本的 Kubernetes中建议使用 Replicaset来取代 Replication Controlle

Replicaset跟 Replication Controller没有本质的不同,只是名字不一样,并且Replicaset支持集合式的 selector虽然 Replicaset可以独立使用,但一般还是建议使用 Deployment来自动管理Replicaset,这样就无需担心跟其他机制的不兼容问题(比如 Replicaset不支持rolling- update但 Deployment支持)

Deployment (Replicaset)

Deployment为Pod和 Replicaset提供了一个声明式定义( declarative)方法,用来替代以前的 Replication Controller来方便的管理应用。典型的应用场景包括

  • 定义 Deployment来创建Pod和 Replicaset
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续 Deployment

4.2 HPA(Horizontalpodautoscale)

         Horizontal Pod Autoscaling仅适用于 Deployment和 Replicaset,在V1版本中仅支持根据Pod的CPU利用率扩所容,在 vlalpha版本中,支持根据内存和用户自定义的 metric扩缩容。

4.3 Statefullset

Statefulset是为了解决有状态服务的问题(对应 Deployments和 Replicasets是为无状态服务而设计),其应用场景包括

  • 稳定的持久化存備,即Pod重新调度后还是能访问到相同的持久化数据,基于PWC来实现
  • 稳定的网络标志,即Pod重新调度后其 Podname和 Hostname不变,基于 Headless Servi(即没有 Cluster IP的 Service)来实现
  • 有序部署,有序扩展,即Pod是有顺序的,在部暑或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是 Running和 Ready状态)基于 init containers来实现
  • 有序收缩,有序删除(即从N-1到0)

4.4 Daemonset

Daemonset确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除 Daemonset将会删除它创建的所有Pod

使用 Daemonset的一些典型用法

  • 运行集群存储 daemon,例如在每个Node上运行 cluster、ceph
  • 在每个Node上运行日志收集 daemon,例如f1 went、1 ogstash
  • 在每个Node上运行监控 daemon,例如 Prometheus Node Exporter

4.5 Job, Cron job

Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束Cron Job管理基于时间的Job,即

  • 在给定时间点只运行一次
  • 周期性地在给定时间点运行

五、网络通讯方式

同一个Pod内部通讯:同一个Pod共享同一个网络命名空间,共享同一个 Linux协议栈

Pod1至Pod2

  • Pod1与Pod2不在同一台主机,Pod的地址是与 docker0在同一个网段的,但 docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问
  • Pod1与Pod2在同一台机器,由 Dockert0网桥直接转发请求至Pod2,不需要经过 Flannel

Pod至 Service的网络:目前基于性能考虑,全部为 iptables维护和转发

  • Pod到外网:Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后, iptables执行 Masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求

  • 外网访问Pod: Service

六、K8S的安装

环境准备:
我们需要大家三台节点 1台master 2台node节点
我这里是重新搭建的虚拟机

6.1 设置系统主机名以及 Host 文件的相互解析

hostnamectl  set-hostname  k8s-master01
hostnamectl  set-hostname  k8s-node01
hostnamectl  set-hostname  k8s-node02

6.2 安装依赖包

注意一下内容需要三台节点都需要执行

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wgetvimnet-tools git

6.3 设置防火墙为 Iptables 并设置空规则

systemctl  stop firewalld  &&  systemctl  disable firewalld
yum -y install iptables-services  &&  systemctl  start iptables  &&  systemctl  enable iptables&&  iptables -F  &&  service iptables save

6.4 关闭 SELINUX

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

6.5 调整内核参数,对于 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

6.6 调整系统时区

# 设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

6.7 关闭系统不需要服务

systemctl stop postfix && systemctl disable postfix

6.8 设置 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=yesSyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000

# 最大占用空间 
10GSystemMaxUse=10G

# 单日志文件最大 200M
SystemMaxFileSize=200M

# 日志保存时间 2 周
MaxRetentionSec=2week

# 不将日志转发到 
syslogForwardToSyslog=no

EOF
systemctl restart systemd-journald

6.9 升级系统内核为 4.44

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)'

6.10 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

6.11 安装 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

6.12 安装 Kubeadm (主从配置)

vim  /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

yum -y  install  kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
systemctl enable kubelet.service

6.13 添加需要的镜像

在这里插入图片描述
我会提供一个 kubeadm-basic.images.tar.gz 压缩包解压 load 即可添加到镜像中最后面会有获取方式

#解压文件 kubeadm-basic.images.tar.gz
tar -zxvf kubeadm-basic.images.tar.gz 
#编写一个脚本执行加载
#!/bin/bash
ls /root/kubeadm-basic.images >/tmp/image-list.txt
cd /root/kubeadm-basic.images
for i in $(cat /tmp/image-list.txt)
do
      docker load -i $i
done
rm -rf /tmp/image-list.txt

6.14 初始化主节点

#初始化k8s获取模板 
kubeadm config print init-defaults > kubeadm-config.yaml
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.100.141
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.15.1
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
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

查看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

如果想让其他节点加进来需要执行以下命令
在这里插入图片描述

6.15 部署网络

# 获取yml 文件
wget  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 获取成功进行创建 注意由于可能网络运行获取失败 我这里也为你们提供了这个文件
kubectl create -f kube-flannel.yml

6.16 测试

集群搭建成功
测试命令: kubectl get node
在这里插入图片描述

七、总结

         好了,说了这么多终于是了解了什么是k8s,和部署一个k8s集群了,可能小伙伴们在部署的过程中会遇到各种问题,可以在评论留言我们大家一起沟通解决。后面的文章会进行更新关于k8s的内容,我们下期见~~~~

八、粉丝福利及软件获取

         有的小伙伴刚开始学习k8s的没有目标,不知道该怎么学,以及k8s有哪些内容该怎么学。我在这里为大家准备了一个学习流程图感兴趣的小伙伴可以进行获取 微信搜索【大数据老哥】回复【k8s学习流程图】 即可获取。
在这里插入图片描述

软件获取

小伙伴们在安装的是后可能会需要很多镜像文件下载是非常的漫长,大数据老哥在这里为你们准备了, 微信搜索公众号【大数据老哥】 回复【k8s软件包】即可获取

其他福利

微信公众号搜索【大数据老哥】可以获取 200个为你定制的简历模板、大数据面试题、企业面试题…等等。
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐