kubernetes

kubernetes是什么

kubernetes 是一个开源的容器编排引擎

功能:自动化、大规模、可伸缩的管理部署容器化应用,让部署容器化的应用简单并且高效

--轻量级(golang语言开发,相比于mesos)

--开源

--弹性伸缩(根据需求扩容缩服务数量)

--负载均衡(自动创建负载均衡)

曾经的竞争对象:

docker swarm:中小型企业

apache mesos:推特

kubernetes:FNCF borg(Google)

brg工作原理

中心化服务

高可用:包含五个副本,共识算法下支持2次损坏

Paxos持久化存储,键值对数据库,保存集群中的所有配置

scheduler:调度,分配任务(管理者角色)

工作节点:参与实际工作

Pod最小调度单位

Pod特性:

Pod初始化第一个启动的contianer是Pause

Pod 可以封装多个container(可以通过模块分割)

同一个Pod中的不同contianer间共享网络栈共享存储卷

逻辑上是Pod,实际上是多个容器

注意:pod使用同一网络栈,不能使用同一端口否则后一个服务无法启动

分类:自主式 Pod     控制器管理 Pod(可控,常用)

控制器管理的Pod

RC RS Deloyment ——支持无状态服务

statefulset——支持有状态的服务

稳定的存储

稳定的网络标识

有序扩容缩

DaemonSet 当前节点上有且只有一个Pod被运行(MFS zabbix适用)

Job DaemonSet(之前都是守护进程,这个是运行脚本,可以判断返回码是否为0)

控制器管理 Pod版本

ReplicationController 用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来替代;而如果异常多出来的容器也会自动回收。

在新版本的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationControlle

——保证期望,当服务数量不满足期望时,自动创建满足期望

ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector

——rcplus版,支持子集运算(通过标签选择服务、容器)

虽然 ReplicaSet 可以独立使用,但一般还是建议使用 Deployment 来自动管理 ReplicaSet ,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持)

——max版,设置容器资源最小值和最大值

容器是否能部署数据库目前还在争议!!!

能部署处于行业高呼声,很多软件正在保证有状态服务在容器中运行

有些服务必须每个节点都只有一个Pod

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

使用 DaemonSet 的一些典型用法:

  * 运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph。

  * 在每个 Node 上运行日志收集 daemon,例如fluentd、logstash。

  * 在每个 Node 上运行监控 daemon,例如 Prometheus Node

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

可用作数据库备份

可用作定时备份

Cron Job 管理基于时间的 Job,即:

  * 在给定时间点只运行一次

  * 周期性地在给定时间点运行

补充:

apache

PHP php.so

nginx

PHP php-fpm(进程)

kubernetes组件、插件

kubernetes框架图

master端:

组件 Kubernetes API Server

本质是web服务器(无状态协议),通过连接ectd实现持久化

作为 Kubernetes 系统的入口,其封装了核心对象的增删改查操作,以 RESTful API 接口方式提供给外部客户和内部组件调用。维护的 REST 对象持久化到 Etcd 中存储

组件 etcd 键值对数据库(core os 公司开发)

算法:Raft共识算法(投票)

要求:master数量大于是1的奇数个

leader(领导者)、follower(跟随者)、cadidate(竞选者)

一个服务器只能有一个领导者,其余都是跟随者,当领导者挂了,开始竞争

存储单位:key-value

分布式存储:将数据存放在多台服务器上,保护数据的安全性

跨主机的通讯协议都是采用https协议

WAL:预写入日志(断电,可还原数据恢复)

组件 Kubernetes Scheduler

调度器,用户将下发请求到达api后scheduler负责分配给哪个Pod负责该任务

新建立的 Pod 进行节点 (node) 选择(即分配机器),负责集群的资源调度。组件抽离,可以方便替换成其他调度器

node节点——工作节点

kubernetes使用O-CRI规范,docker使用CRI规范(容器引擎)

垫片:将kubernetes调用的O-CRI规范转换为CRI规范,就能直接调用docker容器

之前kubernetes维护,目前docker维护

组件 Controller Manager

RC,副本控制器(容器管家),管理Pod,Pod是最小的kubernetes管理单位

负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

组件 Kubelet(上层和下层的中转站)

对接容器引擎CRI,创建容器,负责维护容器的生命周期,同时也负责 Volume(数据卷)(CSI容器存储接口,接口标准)和网络(CNI容器网络接口,接口标准)的管理;

组件 Kube-proxy

负责为 Service 提供 cluster 内部的服务发现和负载均衡

组件 Container runtime

负责镜像管理以及 Pod 和容器的真正运行(CRI);

根据需求选择容器引擎,百分之九十从业人员使用docker

插件 CoreDNS

在集群内部提供内网的域名解析,目的:稳定网络标识

pod死亡重启后,ip地址会发生变化,DNS会自动解析到最新版本的pod上

插件 Ingress Controller

为 K8S 中的服务提供外网入口,为kubernetes提供了七层的代理,通过封装nginx提供七层代理

四层:并发量高,不支持主机域名的识别,只有一次tcp连接

七层:并发量低,支持主机域名的识别,有两次tcp连接

插件 Prometheus

为整个集群提供资源监控能力,云时代最主流的监控服务器(通过容器开启一个小web接口收集数据)

zabbix需要有agent端,放在容器中非常不便

插件 Dashboard

提供 B/S (浏览器/服务器)的访问体系,允许用户通过 web 进行集群管理及设置

插件 Federation

提供跨可用区的集群,提供不同数据中心的 K8S 集群的管理能力(只需要加标识即可)

插件 EFK

分布式收集日志工具

ELK    java开发(功能多)

EFK    golang开发(消耗资源小)

kubernetes安装

安装要求:

磁盘100GB以上

CPU分配2*2以上

内存3GB以上

yum能配置网络源可以通过虚拟nat模式或使用ikuai路由

虚拟机网段配置:

192.168.9.151

主节点  k8s-master01

别名m1

192.168.9.152

其余节点 k8s-node01

别名n1

192.168.9.153

其余节点 k8s-node02

别名n2

安装方式:

二进制版本的安装:https://cloudmessage.top/archives/2kubernetes%E5%AE%89%E8%A3%85md 后续

kubeadm:容器化的方案运行 Kubernetes   具备自愈性(Google镜像仓库,才https协议,证书有效期一年,需要改源码或者一年一更新)

UCLOUD

初始化系统

三台机器逐个设置系统主机名以及 Host 文件的相互解析

hostnamectl  set-hostname  k8s-master01

hostnamectl  set-hostname  k8s-node01

hostnamectl  set-hostname  k8s-node01

写入hosts文件

vim /etc/hosts

192.168.9.151 k8s-master01 m1

192.168.9.152 k8s-node01 n1

192.168.9.153 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

关闭 SELINUX以及交换分区

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

组建时间同步服务器

——9.151主服务器

vim /etc/chrony.conf

取消注释,修改内容:

server ntp1.aliyun.com iburst

server ntp2.aliyun.com iburst

allow 192.168.9.0/24

local stratum 10

systemctl restart chronyd

date

systemctl enable chronyd

——9.152/9.153

vim /etc/chrony.conf

server 192.168.9.151 iburst

systemctl restart chronyd

date

systemctl enable chronyd

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

scp kubernetes.conf  root@n1:/etc/sysctl.d/kubernetes.conf

scp kubernetes.conf  root@n2:/etc/sysctl.d/kubernetes.conf

sysctl -p /etc/sysctl.d/kubernetes.conf

会有报错,正常

关闭系统不需要服务

systemctl stop postfix && systemctl disable postfix

设置 rsyslogd 和 systemd journald

日志会书写两份,只使用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

<CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,例如: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm</u>

源放在国外,下载速度很慢!(使用本地已下载的)

方法1:网络下载

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

方法2:本地上传kernel-lt-4.4.222-1.el7.elrepo.x86_64.rpm

yum -y install kernel-lt-4.4.222-1.el7.elrepo.x86_64.rpm

# 设置开机从新内核启动

grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'

kubernetes部署

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"],

  "registry-mirrors": [" https://kfp63jaj.mirror.aliyuncs.com"]

}

EOF

mkdir -p /etc/systemd/system/docker.service.d

重启docker服务

systemctl daemon-reload && systemctl restart docker && systemctl enable docker

关机重启使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 config print init-defaults > kubeadm-config.yaml

vim kubeadm-config.yaml

逐条修改:

注意冒号后面一个空格

  advertiseAddress: 192.168.9.151

  

kubernetesVersion: v1.15.1

serviceSubnet下对齐并添加

      podSubnet: "10.244.0.0/16"

最后添加:

---

apiVersion: kubeproxy.config.k8s.io/v1alpha1

kind: KubeProxyConfiguration

featureGates:

  SupportIPVSProxyMode: true

mode: ipvs

因为无法连接谷歌,本地上传基础镜像:kubeadm-basic.images.tar.gz

tar -xvf kubeadm-basic.images.tar.gz

写一个自动导入脚本

vim load-images.sh

#!/bin/bash

ls /root/kubeadm-basic.images > /tmp/image.cache

for i in $( cat /tmp/image.cache )

do

        docker load -i /root/kubeadm-basic.images/$i

        echo $i

done

rm -rf /tmp/image.cache

chmod +x load-images.sh

./load-images.sh

master端:

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

查看node节点

kubectl get node

加入主节点以及其余工作节点

本地上传基础镜像kubeadm-basic.images.tar.gz并解压

书写脚本并导入镜像

最后执行安装日志中的加入命令即可

slave端:

在主节点上查看次内容复制粘贴执行

优化主节点目录

上传本地flannel.tar.gz文件

mkdir /usr/local/kubernetes

mkdir /usr/local/kubernetes/install

mv kubeadm-config.yaml kubeadm-init.log /usr/local/kubernetes/install

mv flannel.tar.gz /usr/local/kubernetes

cd

部署网络(主从节点都需要操作)

/usr/local/kubernetes/flannel

scp flannel.tar root@n1:/root

scp flannel.tar root@n2:/root

分别导入镜像

docker load -i flannel.tar

主节点创建资源

kubectl create -f kube-flannel.yml

等待一会儿

kubectl get node

状态变为ready

日志文件信息

第一套证书存放目录:/etc/kubernetes/pki/——用于其余端与api之间的认证

第二套证书存放目录:/etc/kubernetes/pki/etcd/——用于api与etcd之间的认证

两套CA证书——服务器有两套(api s端-其余c端,etcd s端-api c端)

启动流程:

Linux > systemd >kubelet > /usr/local/kubernetes/mainfests/*

Logo

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

更多推荐