使用Docker容器化封装应用程序的意义(好处)
三个统一有着跨时代的意义
1、docker引擎统一了基础设施环境 - docker环境 硬件的配置 操作系统的版本 运行时环境的异构 2、docker引擎统一了程序打包(装箱)方式- docker镜像 java程序 python程序 nodejs程序 3、docker引擎统一了程序部署(运行)方式-docker容器 java-jar … ->docker run… python manage.py runserver …-> docker run … npm run dev-> docker run …
使用docker容器化封装应用程序的缺点(坏处)
1、单机使用,无法有效集群 2、随着容器数量的额上升,管理成本攀升 3、没有有西欧昂的容灾/自愈机制 4、没有与设编程的版本,无法实现快速,大规模容器调度 5、没有统一的配置管理中心工具 6、没有容器生命周期的管理工具 (状态没人管) 7、没有图形化运维管理工具
----- 因此,我们需要一套容器编排的工具 基于docker容器的引擎的开源容器编排工具目前在市场上主要有: docker compose 。docker swarm Mesosphere + Maratheon kubernetes (k8s) ----谷歌开源的管理容器的工具 占领市场,拥有话语权
k8s安装部署的环境准备
k8s的概述::::
- 官网地址:https://kubernetes.io/ 有空了可以多看看
- https://github.com/kubernetes/kubernetes
- https://www.kubernetes.org.cn/replication-controller-kubernetes
什么是k8s:::简单的介绍下 Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验 的基础上,结合了社区中最好的想法和实践。 - 开源容器编排框架工具(生态极其丰富)
- 学习k8s的意义::解决了裸跑docker的若干痛点
kubernetes优势
1、自动装箱,水平扩展,自我修复
2、服务发现和负载均衡
3、自动发布(默认滚滚动发布模式)和回滚
4、集中化配置管理和秘钥管理
5、存储编排
6、任务批处理运行
官网介绍:
kubernetes快速入门
四组基本概念
- pod/pod控制器
- name/namespace
- Label/Label选择器
- Service/Ingress
Pod
- pod是k8s里能够运行的最小的逻辑单元(原子单元)
- 1个pod里面可以运行多个容器,它们共享UTS+NET+IPC名称空间
- 可以把Pod理解为豌豆荚,而同一个Pod内的每个容器是一颗颗豌豆
- 一个Pod里运行多个容器,又叫:边车(SideCar)默认
Pod控制器
- Pod控制器是Pod启动的一个模板,用来保证在K8S里启动的Pod应始终按照人们的预期运行(副本数,声明周期,健康状态检查。。)
- k8s内提供了众多的Pod控制器,常用的有以下几种
-
-
-
-
-
-
Name
- 由于k8s内部,使用资源来定义每一种逻辑概念(功能),故每一种资源,都应该有自己的名称
- 资源有api版本(APIVersion)类表(kind)元数据(metadata),定义清单(spec),状态(status)等配置信息
- 名称 通常顶一个在资源的元数据信息里
Namespace
- 随着项目的增多,人员的增加,集群规模的扩大,需要一种能够隔离k8s内部各种资源的方法,就是名称空间
- 名称空间可以理解为k8s内部的虚拟集群组
- 不同名称空间内的资源,名称可以相同,相同名称空间内的同种资源,名称不能相同
- 合理的使用k8s的名称空间,使得集群管理员能够更好的对交付到k8s的服务进行分类管理和浏览
- k8s里默认存在的名称空间有:default,kube-system ,kube-public
- 查看询k8s特定的资源要带上相应的名称空间
Label
- 标签是k8s特色的管理方式,便于分类管理对象
- 一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系
- 一个资源拥有多个标签,可以实现 不同维度的管理
- 标签的组成: key=value
- 与标签类似的,还有一个注解(annotations)
Label选择器
- 给资源打上标签后,可以使用标签选择器过滤指定的标签
- 标签选择器目前有两个:基于等值关系(等于,不等于)和基于集合关系(属于,不属于,存在)
- 许多资源致辞内嵌标签选择器字段
-
-
- matchExpressions
官网::https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/labels/
Service
- 在k8s的世界里,虽然每个Pod都会被分配一个单独的IP地址,但这一个IP地址会随着Pod的销毁而消失
- Service(服务)就是用来解决这个问题的核心概念
- 一个service可以看做一组提供服务的Pod的对外访问的接口
- service作用于哪些Pod是通过标签选择器来定义的
Ingress
- Ingress是k8s集群里工作在OSI网络模型参考下,第7层的应用,对外暴露的接口
- Service只能进行L4浏览调度,表现形式是ip+port
- Ingress则可以调度不同业务域,不同URL访问路径的业务流量
Ingress先去找service,,然后service再去找pod实现功能
k8s的三条网络了解
核心组件
- 配置存储中心–》etcd服务
-------理解etcd就相当于四zookeeper一样主要存储是k8s集群的主要信息,可以在理解为mysql一样的,也有自己的高可用机制,其是以键值对方式存储的。 - 主控(master)节点
-
- kube-apiserver服务
---------主要是提供了集群的REST API接口(包括鉴权,数据效验以及集群状态变更),,负责其他模块之间的数据交互,承担通信枢纽功能,,是资源配额控制的入口,,,提供完备的集群安全机制。。 -
- kube-controller-manager服务
--------有一系列控制器组成,通过apiservice监控整个集群的状态,并确保集群处于预期的工作状态-- Node Controller ; Deployment Controller ;Service Controller ;Volume Controller ; ENDpoint Controller ;Garbage Controller ;Namespace Controller ;Job Controller ; Resource quta Controller。。。。 -
- kube-scheduler服务
-------主要功能是接收调度pod到适合的运算节点上,,预算策略(predict)优选策略(priorities) - 运算节点
-
- kube-kubelet服务
-------简单的说,kubelet的主要功能就是定时从其某个地方后去节点pod的预期状态,(运行什么容器,运行的副本数量,网络或者存储如何配置等待),并调用对应的容器平台接口达到这个状态,,,定时汇报当前节点的状态给apiservice,一供调度的时候使用,,,镜像和容器的清理工作,保证节点上镜像补全占满磁盘空间,退出的容器不会占用太多资源 -
- kube-proxy服务
--------是k8s在每个节点上运行网络代理,service资源的载体,,,建立了pod网络和集群网络的关系(clusterip–podip) -------常用三种流量调度模式 -------------Userspace(废弃) -------------Iptables(濒临废弃) -------------Ipvs(推荐)----就是在k8s里面内嵌一套lvs -------负责建立和删除包括更新调度规则,通知apiservice自己的更新,或者从apiservice哪里获取其他kube-proxy的调度规则变化来更新自己的
k8s的网络模型
service网络在实验的时候是一个虚的网络。。用192.168.0.0/16位表示 地址简单规划 4代表的是机房,7代表的是不同的环境。。自己规划的时候有这个想法就行。。
CLI客户端
核心附件
- CNI网络插件–》flannel/calico
- 服务发现用插件–》coredns
- 服务暴露用插件–》traefik
- GUI管理插件–》Dashboard
实验架构部署
实验架构图
要想多加一台需要在11上多加一个节点
常见的k8s安装部署方法
- Minikube 单节点微型看是(仅供学习,预览使用)
----官方网站:https://kubernetes.io/docs/tutorials/hello-minikube/ 和网络快慢有关,,自己去看就行哈 - 二进制安装部署(生产首选,新手推荐)
- 使用kubeadmin进行部署,k8s的部署工具,跑在k8s里(相对简单,熟手推荐)
准备k8s部署需要的主机–虚拟机
10.4.7.11 10.4.7.12 10.4.7.21 10.4.7.22 10.4.7.200 网络调整通,然后就是保证能ping通百度。。 另外我这边做了一个工作就是准备了自己的yum仓库配置。。
1、修改主机的名称
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
附加工作------ 配置ansible和为每台主机配置免交互,,这里我以200位例子。 下面是使用脚本进行 首先需要配置yum仓库
[root@hdss7-200 yum.repos.d]
bak local.repo
[root@hdss7-200 yum.repos.d]
mount /dev/cdrom /mnt/
touch /etc/yum.repos.d/local.repo
mkdir /etc/yum.repos.d/bak
cd /etc/yum.repos.d && \
mv C* bak/
echo -e '[base]\nname=CentOS7.6\nbaseurl=file:///mnt\nenabled=1\ngpgcheck=0\n#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7'>/etc/yum.repos.d/local.repo
echo '/dev/cdrom iso9660 defaults 0 0' >>/etc/fstab
yum clean all
yum makecache
systemctl stop firewalld
systemctl disable firewalld
se_cnf="/etc/selinux/config"
find_key="SELINUX="
setenforce 0 &>/dev/null
sed -ri "/^$find_key/c${find_key}disabled" $se_cnf
result="`getenforce`"
if [ $result = Enforing ];then
echo "selinux关闭失败!"
exit 10
else
echo "selinux关闭成功!"
fi
cd /etc/yum.repos.d/
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
echo "或者用下面的源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo"
然后下面的是安装ansible和配置让200主机给所有的主机配置免交互
#!/bin/bash
echo -e -n "请输入\033[34mroot\033[0m用户密码 >>> "
read -p "" pwd
echo -e -n "请输入\033[34m本地ip\033[0m[如:192.168.2.10] >>> "
read -p "" local_ip
subnet=$(echo ${local_ip}|awk -F '.' '{print $1"."$2"."$3}')
yum_task(){
cmd_exist=$(which $1)
if [ -z ${cmd_exist} ]
then
yum install $1 -y
fi
}
yum -y install expect
create_key(){
/usr/bin/expect <<EOF
# 设置捕获字符串后,期待回复的超时时间
set timeout 10
# 发送公钥给对方服务器
spawn ssh-keygen -t rsa
expect {
"Enter file" { send "\n"; exp_continue }
"Enter passphrase" { send "\n"; exp_continue }
"Enter same" { send "\n"}
}
expect eof
EOF
}
copy_key () {
/usr/bin/expect <<EOF
# 设置捕获字符串后,期待回复的超时时间
set timeout 30
# 发送公钥给对方服务器
spawn ssh-copy-id root@$1
expect {
"yes/no" { send "yes\n"; exp_continue }
"password:" { send "${pwd}\n"}
}
expect eof
EOF
}
ssh_port_check(){
echo '' | telnet $1 22 |grep -o -i Connected
}
[ -z $(rpm -qa |grep epel-release) ] && yum install -y epel-release
yum_task nmap
yum_task telnet
yum_task ansible
all_ip_list=$(nmap -sP ${subnet}.* | grep -o ${subnet}.*)
host_ip_list=''
for i in ${all_ip_list}
do
tag=$(ssh_port_check $i 2>/dev/null)
if [ ! -z ${tag} ]
then
host_ip_list="$i ${host_ip_list}"
fi
sleep 0.5
done
host_ip_list=${host_ip_list}
if [ ! -f /etc/ansible/hosts-bak ]
then
cp -p /etc/ansible/hosts /etc/ansible/hosts-bak
fi
if [ ! -f /root/.ssh/id_rsa.pub ]
then
create_key
fi
echo [group] > /etc/ansible/hosts
for host in ${host_ip_list}
do
echo ${host} >> /etc/ansible/hosts
done
for host in $(ansible all --list-hosts |awk 'NR>1 {print $1}')
do
echo $host
copy_key $host
done
ssh-agent bash
/usr/bin/expect <<EOF
# 设置捕获字符串后,期待回复的超时时间
set timeout 30
# 发送公钥给对方服务器
spawn ssh-add
expect {
"id_rsa:" { send "${pwd}\n"}
}
expect eof
EOF
|