基本介绍
Kubernetes是什么?
kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
由来
Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。
特点
- 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
- 可扩展: 模块化, 插件化, 可挂载, 可组合
- 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
Kubernetes功能
-
自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器
-
自我修复(自愈能力)
当容器失败时,会对容器进行重启
当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度
当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
-
水平扩展
通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
-
服务发现
用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和负载均衡
-
滚动更新
可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
-
版本回退
可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
-
密钥和配置管理
在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
-
存储编排
自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要。存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
-
批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景
K8s集群机构
集群节点功能
Master Node
k8s 集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成
Worker Node
集群工作节点,运行用户业务应用容器;
Worker Node 包含 kubelet、kube proxy 和 ContainerRuntime;
集群搭建
(kubeadm方式)
前置知识点
目前生产部署 Kubernetes 集群主要有两种方式:
- kubeadm
Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
- 二进制包
从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可 控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很 多工作原理,也利于后期维护。
kubeadm 部署方式介绍
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通
过两条指令完成一个 kubernetes 集群的部署:
-
创建一个 Master 节点
kubeadm init
-
将 Node 节点加入到当前集群中
$ kubeadm join <Master 节点的 IP 和端口 >
安装要求
-
一台或多台机器,操作系统 CentOS7.x-86_x64
-
硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多 - 集群中所有机器之间网络互通
-
可以访问外网,需要拉取镜像
-
禁止 swap 分区
最终目标
-
在所有节点上安装 Docker 和 kubeadm
-
部署 Kubernetes Master
-
部署容器网络插件
-
部署 Kubernetes Node,将节点加入 Kubernetes 集群中 (5)部署 Dashboard Web 页面,可视化查看 Kubernetes 资源
准备环境
角色 ip
K8s-master 192.168.10.101
K8s-node1 192.168.10.102
K8s-node2 192.168.10.103
系统初始化
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
关闭swap
swapoff -a # 临时
vim /etc/fstab # 永久
主机名
hostnamectl set-hostname <hostname>
<hostname>
写主机名,比如我写master-slave1-slave2
在master添加hosts
cat >> /etc/hosts << EOF
192.168.10.100 master
192.168.10.101 slave1
192.168.10.102 slave2
EOF
时间同步
yum install ntpdate -y
ntpdate time.windows.com
所有节点都安装docker、kubeadm、kubelet
Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker $ docker --version
添加阿里云yum源
设置仓库地址
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
添加yum源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubeadm,kubelet和kubectl
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
部署 Kubernetes Master
在192.168.10.100执行
kubeadm init --apiserver-advertise-address=192.168.10.100 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址
使用kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
安装Pod网络插件(CNI)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注意:这一步会报错,因为这个url被墙了,可以自行去github下载,输入flannel.yml就可以查到了,然后ftp传到虚拟机里面,通过本地路径yml替代url
加入 Kubernetes Node
在slave1和slave2分别执行
kubeadm join 192.168.10.100:6443 --token bnsum6.qsi5k3v2lo9pjsfo \
--discovery-token-ca-cert-hash sha256:dac18f053463f1070ab74e659464c1212485b608b22da2dd9586c06443c17941
这个是master中执行 kubeadm init最后会输出 出来的,如下图
测试 kubernetes 集群
如何查看node状态?
kubectl get node
踩坑:K8s问题记录
YAML 文件详解
YAML 文件概述
k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。
YAML 文件书写格式
YAML 介绍
YAML:仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。
YAML是一个可读性高,用来表达数据序列的格式。
YAML 基本语法
- 使用空格做为缩进
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 低版本缩进时不允许使用 Tab 键,只允许使用空格
- 使用#标识注释
YAML 支持的数据结构
- 对象
键值对的集合
#对象类型:对象的一组键值对 用冒号结构表示
name:Tom
age:18
#Yaml也允许另一种写法,将所有键值对写成一个行内对象
hash:{
name:Tom,
age:18
}
- 数组
一组按次序排列的值,又称序列、列表
#数组类型:一组连词线开头的行,构成一个数组
People
- Tom
- Jack
#数组也可以采用行内表示法
People:[Tom,Jack]
- 纯量
单个不可再分的值
#纯量:纯量是最基本的、不可再分。以下数据类型都属于纯量
#数值直接以字面量的形式表示
number:12.30
#布尔值用true和false表示
isSet:true
#null用~表示
parent:~
#时间采用 ISO8601格式
iso8601:2001-12-14t21:59:43.10-05:00
#日期采用复合 iso8601 格式的年、月、日表示
date:1976-07-31
#yaml使用两个感叹号强制转换数据类型
e: !!str 123
f: !!str true
#字符串默认不使用引号表示
str:这是一行字符串
#如果字符串之中包含空格或特殊字符,需要放在引号之中
str:'内容 : 字符串'
#单引号和双引号都可以使用,双引号不会对特殊字符转义
s1:'内容\n字符串'
s2:"内容\n字符串"
#单引号之中如果还有单引号 必须使用两个单引号转义
str:'larbor'
#字符串可以写成多行,从第二行开始,必须有一个但空格缩进。换行符会被转为空格
str:这是一段
多行
字符串
#多行字符串可以使用|保留换行符,也可以使用>折叠换行
this: |
Foo
Bar
that
Foo
Bar
资源清单描述方法
在 k8s 中,一般使用 YAML 格式的文件来创建符合我们预期期望的 pod,这样的 YAML 文件称为资源清单。
常用字段
- 必须存在的属性
- Spec 主要对象
![image-20201224161224377](/Users/janeroad/Library/Application Support/typora-user-images/image-20201224161224377.png)
- 额外的参数
举例说明
- 创建一个namespace
apiVersion: v1
kind: Namespace
matdata:
name: test
- 创建一个pod
apiVersion: v1
kind: Pod
matdata:
name: pod1
spec:
containers:
- name:nginx-containers
image:nginx:latest
命令行工具kubectl
kubectl概述
kubectl是kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署
语法
kubectl [command] [TYPE] [NAME] [flags]
-
command 指定要对资源执行的操作,例如create、get、describe和delete
-
TYPE 指定资源类型,区分大小写,可以用单数、复数和缩略的形式
kubectl get pod pod1
- NAME 指定资源名称,区分大小写
kubectl get pods
- flags:指定可选的参数。例如,可用-s 或者–server 参数指定 Kubernetes API server 的地址和端口。
kubectl --help
获取更多的帮助信息
kubectl子命令使用分类
基础命令
部署和集群管理命令
故障和调试命令
其他命令
Pod
Pod概述
Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在K8S上运行容器化应用的资源对象,其它的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,K8S不会直接处理容器,而是Pod,Pod是由一个或多个container组成。
Pod是Kubernetes的最重要概念,每一个Pod都有一个特殊的被称为 “根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。
Pod基本概念
- 最小部署的单元
- Pod里面是由一个或多个容器组成【一组容器的集合】
- 一个pod中的容器是共享网络命名空间
- Pod是短暂的
- 每个Pod包含一个或多个紧密相关的用户业务容器
Pod存在的意义
- 创建容器使用docker,一个docker对应一个容器,一个容器运行一个应用进程
- Pod是多进程设计,运用多个应用程序,也就是一个Pod里面有多个容器,而一个容器里面运行一个应用程序
- Pod的存在是为了亲密性应用
- 两个应用之间进行交互
- 网络之间的调用【通过127.0.0.1 或 socket】
- 两个应用之间需要频繁调用
Pod实现机制
主要有以下两大机制
- 共享网络
- 共享存储
共享网络
容器本身之间相互隔离的,一般是通过 namespace 和 group进行隔离,那么Pod里面的容器如何实现通信?
- 首先需要满足前提条件,也就是容器都在同一个namespace之间
关于Pod实现原理,首先会在Pod会创建一个根容器: pause容器
,然后我们在创建业务容器 【nginx,redis 等】,在我们创建业务容器的时候,会把它添加到 info容器
中
而在 info容器
中会独立出 ip地址,mac地址,port 等信息,然后实现网络的共享
完整步骤如下
- 通过 Pause 容器,把其它业务容器加入到Pause容器里,让所有业务容器