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 < 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 < [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
源放在国外,下载速度很慢!(使用本地已下载的)
方法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 < #!/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 < { "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 < [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/*