1 kubernetes介绍
1.1 kubernetes功能
自动装箱
- 基于容器对应用运行环境的资源配置要求自动部署应用容器
自我修复(自愈能力)
- 当容器失败时,会对容器进行重启
- 当所部署的Node节点有问题时,会对容器进行重新部署和重新调度
- 当容器未通过监控检查时,会关闭此容器
- 直到容器正常运行时,才会对外提供服务
水平扩展
- 通过简单的命令、用户UI界面或基于CPU等资源使用情况,对应用容器进行规模扩大或规模剪裁
服务发现
- 用户不需要使用额外的服务发现机制,就能够基于Kubernetes自身能力实现服务发现和负载均衡
滚动更新
- 可以根据应用的变化,对应用容器运行的应用,进行一
次性或批量式更新
版本回退
- 可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
密钥和配置管理
- 在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
存储编排
- 自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要
- 存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph、Cinder等)、公共云存储服务等
1.2 kubernetes架构
应用部署分类
无中心节点架构
- GlusterFS
有中心节点架构
- HDFS
- K8S
节点角色功能
Master Node
- k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
- Master Node由API Server、Scheduler、Cluster State Store(ETCD数据库)和Controller MangerServer所组成;
Worker Node
- 集群工作节点,运行用户业务应用容器;
- Worker Node包含kubelet、kube proxy和ContainerRuntime;
1.3 kubernetes组件
1.3.1 NameSpace
- 命名空间
- 作用:多租户情况下,实现资源隔离
- 属于逻辑隔离
- 属于管理边界
- 不属于网络边界
- 可以针对每个namespace做资源配额
1.3.2 pod
- Pod是kubernetes集群能够调度的最小单元
- Pod是容器的封装
1.3.3 controller
- 控制器
- 用于对应用运行的资源对象进行监控
- 当Pod出现问题时,会把Pod重新拉起,以达到用户的期望状态
常见的controller控制器
控制器名称 | 作用 |
---|---|
Deployment | 声明式更新控制器,用于发布无状态应用 |
ReplicaSet | 副本集控制器,用于对Pod进行副本规模 扩大或剪裁 |
StatefulSet | 有状态副本集,用于发布有状态应用 |
DaemonSet | 在k8s集群每一个Node上运行一个副本, 用于发布监控或日志收集类等应用 |
Job | 运行一次性作业任务 |
CronJob | 运行周期性作业任务 |
Deployment控制器介绍
- 具有上线部署、滚动升级、创建副本、回滚到以前某一版本(成功/ 稳定)等功能
- Deployment包含ReplicaSet,除非需要自定义升级功能或者根本不需要升级Pod,否则还是建议使用
Deployment而不直接使用Replica Set 。
1.3.4 Service
Service介绍
- 不是实体服务
- 是一条iptables或ipvs的转发规则
Service作用
- 通过Service为pod客户端提供访问pod方法,即客户端访问pod入口
- Service通过Pod标签与Pod进行关联
Service类型
- ClusterIP:默认,分配一个集群内部可以访问的虚拟IP
- NodePort:在每个Node上分配一个端口作为外部访问入口
- LoadBalancer:工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
- ExternalName:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信
Service参数
- port 访问service使用的端口
- targetPort Pod中容器端口
- NodePort 通过Node实现外网用户访问k8s集群内service(30000-32767)
Service创建
- Service的创建在工作中有两种方式,一是命令行创建,二是通过资源清单文件YAML文件创建
2 kubernetes安装
2.1 系统说明
主机名称 | IP地址 | 安装的软件 |
---|---|---|
k8s-master | 192.168.0.1 | kube-apiserver、kube-controller-manager、kube-scheduler、docker、etcd、calico |
k8s-node1 | 192.168.0.2 | kubelet、kubeproxy、docker |
k8s-node2 | 192.168.0.3 | kubelet、kubeproxy、docker |
2.2 集群安装
2.2.1 三台机器都需要操作的步骤
1.修改hostname及hosts文件
#自改hostname
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
#修改hosts文件
vim /etc/hosts
#追加内容
192.168.66.101 k8s-master
192.168.66.102 k8s-node1
192.168.66.103 k8s-node2
**2.**安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wgetvimnet-tools git
3.设置防火墙为 Iptables 并设置空规则
#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
#设置空规则
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables&& iptables -F && service iptables save
4.关闭防火墙和关闭SELinux
#临时关闭SELinux
setenforce 0
#永久关闭SELinux
vi /etc/sysconfig/selinux
#修改内容
SELINUX=disabled
5.设置系统参数
设置允许路由转发,不对bridge的数据进行处理
#创建文件
vi /etc/sysctl.d/k8s.conf
#内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 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
执行文件
sysctl -p /etc/sysctl.d/k8s.conf
6.调整系统时区
# 设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
7.关闭不需要服务
systemctl stop postfix && systemctl disable postfix
8.kube-proxy开启ipvs的前置条件
vim /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
#执行命令
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
9.所有节点关闭swap
#临时关闭
swapoff -a
#永久关闭
vi /etc/fstab
#注释掉以下字段
/dev/mapper/cl-swap swap swap defaults 0 0
10.设置 rsyslogd 和 systemd journald
mkdir /var/log/journal
# 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
#编辑文件
vim /etc/systemd/journald.conf.d/99-prophet.conf
#内容
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G