k8s 快速入门
k8s初识
学习目标
-
了解容器是什么
-
了解容器管理工具有哪些
-
了解容器编排部署工具有哪些
-
了解kubernetes
容器
基本了解
为了降低虚拟机造成的物理主机资源浪费,提高物理主机的资源利用率,并能够提供像虚拟机一样良好的应用程序隔离运行环境,人们把这种轻量级的虚拟机,称为"容器"。
- 主机

- 虚拟机:和主机共享硬件

-
容器:和主机共享硬件和操作系统


容器管理工具
容器管理工具类似于虚拟机管理工具,主要用于容器的创建、启动、关闭、删除等。
容器管理工具有:
-
docker公司的docker
-
国内阿里公司的Pouch
-
LXC、LXD、RKT等等
容器编排部署工具
容器管理工具可以完成容器的基础管理,但是容器的应用并不是只能进行简单应用部署的,可以使用容器完成企业中更加复杂的应用部署,当需要对多应用的系统进行部署时,就需要更加复杂的工具来完成对容器运行应用的编排,这就是我们所说的容器编排部署工具。
容器编排部署工具有:
-
docker 三剑客
-
docker machine
-
docker compose
-
docker swarm
-
-
mesos + marathon
-
mesos主要作用是在分布式计算过程中,对计算机资源进行管理和分配
-
是基于Mesos的私有Paas,它实现了Mesos的Framework。Marathon实现了服务发现和负载平衡、为部署提供REST API服务、授权和SSL、配置约束等功能,Marathon支持通过Shell命令和Docker部署应用。
提供Web界面、支持cpu/mem、实例数等参数设置,支持单应用的Scale,但不支持复杂的集群定义。
-
Mesos和Marathon的关系
如果将Mesos类比为操作系统的内核,负责资源调度。则Marathon可以类比为服务管理系统,比如init,systemd或upstart等系统,用来管理应用的状态信息。Marathon将应用程序部署为长时间运行的Mesos任务。
-
-
kubernetes
- 主要用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,提供了应用部署、规划、更新、维护的一种机制。
kubernetes
k8s 由来
-
希腊语:舵手、飞行员
-
来自于谷歌Borg系统开源
-
简称于k8s
-
现归属于CNCF
-
云原生计算基金会
-
是一个开源软件基金会,致力于式云计算普遍性和持续性
-
k8s 意思
kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Google生产环境运行工作负载15年的经验,并吸收了来自于社区的最佳想法和实践。
k8s 功能
-
自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器
-
自我修复
-
当容器失败时,会对容器进行重启
-
当所部署的Node节点有问题时,会对容器进行重新部署和重新调度
-
当容器未通过监控检查时,会关闭此容器
-
直到容器正常运行时,才会对外提供服务
-
-
水平扩展
- 通过简单的命令、用户UI界面或基于CPU等资源使用情况,对应用容器进行规模扩大或规模剪裁
-
服务发现
- 用户不需要使用额外的服务发现机制,就能够基于Kubernetes自身能力实现服务发现和负载均衡。
-
滚动更新
- 可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
-
版本回退
- 可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
-
密钥和配置管理
- 在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署
-
存储编排
-
自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要
-
存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph、Cinder等)、公共云存储服务等
-
Node及Pod支持
-
Node(节点)数支持
-
早期版本管理100台
-
现版本可以管理2000台
-
-
pod管理支持
-
早期版本管理1000个
-
现版本管理150000个
-
k8s架构
应用部署架构分类
-
无中心节点架构
- GlusterFS
-
有中心节点架构
-
HDFS
-
K8S
-
k8s集群架构

k8s集群架构节点角色功能
-
Master Node
-
k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
-
Master Node 由 API Server、Scheduler、Cluster State Store ( ETCD数据库 ) 和 Controller Manger Server 所组成
-
-
Worker Node
-
集群工作节点,运行用户业务应用容器;
-
Worker Node 包含 kubelet、kube proxy 和 Container Runtime
-

k8s集群部署
场景
-
k8s集群部署工具有哪些?
-
需要几台物理服务器?
-
物理服务器硬件配置有哪些?
-
每台物理服务器部署什么组件?
-
部署结束后应该如何测试集群可用性?
学习目标
-
了解k8s集群部署工具
-
掌握使用kubeadm部署k8s集群方法
-
掌握验证k8s集群可用性方法
k8s集群部署工具
二进制源码包部署
-
获取源码包
-
部署在各节点中
-
启动服务
-
Master
-
api-server
-
etcd
-
scheduler
-
controller manager
-
-
Worker
-
kublet
-
kube-proxy
-
docker
-
-
生成证书
-
http
-
https
-
-
使用kubeadm部署
-
安装软件 kubelet kubeadm kubectl
-
初始化集群
-
添加node到集群中
-
证书自动生成
-
集群管理系统是以容器方式存在,容器运行在master
-
容器镜像是谷歌提供
-
阿里云下载容器镜像,需要重新打标记
-
谷歌下载
-
使用kubeadm部署kubernetes集群方法
使用kubeadm部署单Master节点k8s集群
主机要求
实际生产中,适当提高硬件配置
-
硬件
主机名 操作系统 CPU MEM 角色要求 master1 CentOS7.6 2 2G master work1 CentOS7.6 2 2G worker work2 CentOS7.6 2 2G worker
主机准备
所有主机要配置
主机操作系统
| 主机操作系统 | 硬件配置 | 硬盘分区 | IP |
|---|---|---|---|
| CentOS7u6 最小化 | 2C 2G 100G | /boot、/ | 192.168.216.100 |
| CentOS7u6 最小化 | 2C 2G 100G | /boot、/ | 192.168.216.101 |
| CentOS7u6 最小化 | 2C 2G 100G | /boot、/ | 192.168.216.102 |
配置步骤
1.创建存储主机的文件夹

-
下载vm,在vm新建虚拟机

-
前面硬件兼容性默认选择,操作系统稍后处理,选择Linux操作系统,版本为centos 7 64位,设置虚拟机名称和对应位置

-
2个单核CPU

-
选择网络

-
设置磁盘大小100G

-
接下来完成即可,按照上面的步骤创建worker1,2
需要去下载centos7-x86-64的iso文件,设置iso文件后开启虚拟机

-
设置自己舒服的语言

- 设置网络


- 设置时间为上海时间

- 设置磁盘分区


-
设置主机用户密码

-
等待系统安装重启
主机名
[root@xxx ~]# hostnamectl set-hostname xxx
主机名列表
192.168.216.100 master1
192.168.216.101 worker1
192.168.216.102 worker2

主机IP地址
IP地址根据主机实际情况进行配置
本次使用VMWare Workstation Pro虚拟机部署,需要注意网关设置
[root@xxx ~]# cat /etc/sysconfig/network-scripts/ifcfg-enc33
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.216.xxx
NETMASK=255.255.255.0
GATEWAY=192.168.216.2
DNS1=119.29.29.29


主机名称解析
[root@xxx ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4
localhost4. localdomain4
::1 localhost localhost.localdomain localhost6
localhost6.localdomain6
192.168.216.100 master1
192.168.216.101 worker1
192.168.216.102 worker2
三台主机进行文件的修改

验证一下

主机安全配置
关闭firewalld
[root@xxx ~]# systemctl stop firewalld
[root@xxx ~]# systemctl disable firewalld
确认是否运行
[root@xxx ~]# firewall-cmd --state
not running
SELINUX配置
做出下述修改,一定要重启系统才能生效
[root@xxx ~]# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
主机时间同步
由于最小化安装系统,需要单独安装ntpdate
[root@xxx ~]# yum -y install ntpdate
[root@xxx ~]# crontab -l
0 */1 * * * ntpdate time1.aliyun.com

永久关闭swap分区
使用kubeadm部署必须关闭swap分区,修改配置文件后需要重启操作系统
[root@xxx ~]Z# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Mar 5 11:40:30 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) fro more info
#
/dev/mapper/centos-root / xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
在swap文件系统对应的行,行首添加#表示注释


添加网桥过滤
添加网桥过滤及地址转发
[root@xxx ~]# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
加载br_netfilter模块
[root@xxx ~]# modprobe br_netfilter
查看是否加载
[root@xxx ~]# lsmod | grep br_netfilter
br_netfilte 22256 0
bridge 151336 1 br_netfilter
加载网桥过滤配置文件
[root@xxx ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0


开启ipvs
安装ipset及ipvsadm
[root@xxx ~]# yum -y install ipset ipvasadm

在所有节点执行如下脚本
[root@xxx ~]# 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


授权、运行、检查是否加载
[root@xxx ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

检查是否加载
[root@xxx ~]# lsmod | grep -e ip_vs -3 nf_conntrack_ipv4

在master节点及worker节点安装指定版本的docker-ce
yum源获取
建议使用清华镜像源,官方提供的镜像源由于网络速度原因下载较慢
[root@xxx ~]# wget -o /etc/yum.repos.d/docker-ce.repo
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/docker-ce.repo


查看docker-ce版本
对版本进行排序
[root@xxx ~]# yum list docker-ce.x86_64 --showduplicates | sort -r

安装docker-ce
安装指定版本docker-ce,此版本不需要修改服务启动文件及iptables默认规则链策略
[root@xxx ~]# yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7


应用docker并启动


修改docker-ce服务配置文件
修改其目的是为了后续使用/etc/docker/daemon.json来进行更多配置
修改内容如下
[root@xxx ~]# cat /usr/lib/systemd/system/docker.service
[unit]
...
[Service]
...
ExecStart=/usr/bin/dockerd #如果原文件此行后面有-H选项,请删除-H(含)后面所有内容
...
[Install]
...
注意:有些版本不需要修改
# 在/etc/docker/daemon.json添加如下内容:
[root@localhost ~]# cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}


部署软件及集群软件准备
软件安装
所有k8s集群节点均需安装,默认YUM源是谷歌,可以使用阿里云YUM
| 需求 | kubeadm | kubelet | kubectl | docker-ce |
|---|---|---|---|---|
| 值 | 初始化集群、管理集群等,版本为:1.17.2 | 用于接收api-server指令,对pod生命周期进行管理,版本为:1.17.2 | 集群命令行管理工具,版本:1.17.2 | 18.06.3 |
- 谷歌YUM源

- 阿里云YUM源



-
安装指定版本kubeadm kubelet kubectl
[root@xxx ~]# yum list kubeadm.x86_64 --showduplicates | sort -r [root@xxx ~]# yum -y install --setopt=obsoletes kubeadm-1.17.2-0 kubelet-1.17.2-0 kubectl-1.17.2-0

软件设置
主要配置kubelet,如果不配置可能会导致k8s集群无法启动
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容
[root@xxx ~]# vim /etc/sysconfig/kubelet
KUELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置为开机启动即可,由于没有生成配置文件,集群初始化后自动启动
[root@xxx ~]# systemctl enable kubelet
k8s集群容器镜像准备
由于使用kubeadm部署集群,集群所有核心组件均以pod运行,需要为主机准备镜像,不同角色主机准备不同镜像
建议使用科学上网方式下载镜像
Master主机镜像
查看集群使用的容器镜像
[root@master ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.17.2
k8s.gcr.io/kube-controller-manager:v1.17.2
k8s.gcr.io/kube-scheduler:v1.17.2
k8s.gcr.io/kube-proxy:v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
列出镜像列表到文件中,便于下载使用
[root@master ~]# kubeadm config images list >> image.list
查看已列出镜像文件列表
[root@master ~]# cat image.pull
#!/bin/bash
img_list='
k8s.gcr.io/kube-apiserver:v1.17.2
k8s.gcr.io/kube-controller-manager:v1.17.2
k8s.gcr.io/kube-scheduler:v1.17.2
k8s.gcr.io/kube-proxy:v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
'
for img in $img_list
do
docker pull $img
done
执行镜像下载脚本
[root@master ~]# sh image.pull
查看已下载镜像
[root@master ~]# docker images

worker主机镜像
保存镜像为tar
[root@master ~]# docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy:v1.17.2
[root@master ~]# docker save -o pause.tar k8s.gcr.io/pause:3.1
[root@master ~]# ls
kube-proxy.tar pause.tar
复制tar到worker节点
[root@master1 ~]# scp kube-proxy.tar pause.tar work1:/root
[root@master1 ~]# scp kube-proxy.tar pause.tar work2:/root
在worker节点导入镜像
[root@work1 ~]# ls
kube-proxy.tar pause.tar
[root@work1 ~]# docker load -i kube-proxy.tar
[root@work1 ~]# docker load -i pause.tar


k8s集群初始化
在master节点操作
[root@master1 ~]# kubeadm init --kubernetes-version=v1.17.2 --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.216.100


根据上图进行相应的操作

每台主机导入相应的镜像


修改calico资源清单文件

应用calio资源清单文件
在应用caclico资源清单文件之前,需要把calico所有的镜像导入到node节点中。

worker节点加入集群



验证k8s集群可用性方法


学习总结

k8s集群客户端工具 kubectl
了解kubectl命令帮助方法
了解kubectl子命令使用分类
kubectl帮助方法
检查kubectl是否安装
rpm -qa | grep kubectl
获取kubectl帮助方法
kubectl --help
kubectl子命令使用分类
-
基础命令
-
create(通过文件名或标准输入创建资源)
-
expose(将一个资源公开为一个新的Service)
-
run(在集群中运行一个特定的镜像)
-
set(在对象上设置特定的功能)
-
get(显示一个或多个资源)
-
explain(文档参考资料)
-
edit(使用默认的编辑器编辑一个资源)
-
delete(通过文件名、标准输入、资源名称或标签选择器来删除资源)
-
-
部署命令
-
rollout(管理资源的发布)
-
rollin-update(对给定的复制控制器滚动更新)
-
scale(扩容或缩容pod数量,Deployment、ReplicaSet、RC或Job)
-
autoscale(创建一个自动选择扩容或缩容并设置pod数量)
-
-
集群管理命令
-
certificate(修改证书资源)
-
cluster-info(显示集群信息)
-
top(显示资源使用。需要Heapster运行)
-
cordon(标记节点不可调度)
-
-
故障诊断和调试命令
-
describe(显示特定资源或资源组的详细信息)
-
logs(在一个Pod中打印一个容器日志,如果Pod只有一个容器,容器名称是可选的)
-
attach(附加到一个运行的容器)
-
exec(执行命令到容器)
-
port-forward(转发一个或多个本地端口到一个pod)
-
proxy(运行一个proxy到kubernetes API server)
-
cp(拷贝文件或目录到容器中)
-
auth(检查授权)
-
-
高级命令
-
apply(通过文件名或标准输入对资源应用配置)
-
patch(使用补丁修改、更新资源的字段)
-
replace(通过文件名或标准输入替换一个资源)
-
convert(不同的API版本之间转换配置文件)
-
-
设置命令
-
label(更新资源上的标签)
-
annotate(更新资源上的注释)
-
completion(用于实现kubect工具自动补全)
-
-
其他命令
-
api-version(打印受支持的API版本)
-
config(修改kubeconfig文件 用于访问api,比如配置认证信息)
-
help(所有命令帮助)
-
plugin(运行一个命令行插件)
-
version(打印客户端和服务版本信息)
-
使用kubectl命令必要环境
在worker节点如何使用kubectl命令管理k8s集群?
准备集群管理配置文件
mkdir .kube
scp master1:/root/.kube/config .kube/
使用命令验证
kubectl get nodes


总结

K8s集群资源清单(YAML)文件书写方法
YAML文件书写格式
yaml介绍
yaml:仍是一种标记语言
为了强调这种语言以数据作为中心,而不是以标记语言为重点
YAML是一种可读性高,用来表达序列的格式
基本语法
-
使用空格作为缩进
-
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
-
低版本缩进时不允许使用Tab键,只允许使用空格
-
使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
YAML支持的数据结构
-
对象
-
键值对的集合
-
又称为映射(mapping)/哈希(hashes)/字典(dictionary)
-
# 对象类型:对象的一组键值对,使用冒号结构表示
name: Tom
age: 18
# Yaml 也允许另一种写法,将所有键值对写成一个行内对象
hash: {name: Tom, age: 18}
-
数组
-
一组按次序排列的值
-
又称为序列(sequence)/列表(list)
-
# 数组:一组连词线开头的行,构成一个数组
People
- Tom
- Jack
# 数组也可以采用行内表示法
People: [Tom, Jack]
-
纯量(scalars):
- 单个的、不可再分的值
# 纯量:纯量是最基本的、不可再分的值。以下数据类型都属于纯量
# 数值直接以字面量的形式表示
number: 12.30
# 布尔值用true和fa1se表示
isset: true
# null 用 ~ 表示
parent: ~
# 时间采用 IS08601 格式
1s08601: 2001-12-14t21:59:43.10-05:00
# 日期采用符合 IS08601 格式的年、月、日表示
date: 1976-07-31
# YAML允许使用两个感叹号,强制转换数据类型
e: !!str 123
f: !!str true
# 字符串默认不使用引号表示
str: 这是一行字符串
# 如果字符串之中包含空格或特殊字符,需要放在引号之中
str: '内容: 字符串'
# 单引号和双引号都可以使用,双引号不会对特殊字符转义
s1: '内容\n字符串'
s2: "内容\n字符串"
# 单引号之中如果还有单引号,必须连续使用两个单引号转义
str: 'labor''s day'
#字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
str: 这是一段
多行
字符串
# 多行字符串可以使用|保留换行符,也可以使用>折叠换行
this: |
Foo
Bar
that
Foo
Bar
资源清单描述方法
常用字段
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| version | String | 这里是指的是 K8s API的版本,目前基本上是v1,可以用kubectl api-versions命令查询 |
| kind | String | 这里指的是yaml文件定义的资源类型和角色,比如:Pod |
| metadata | Object | 元数据对象,固定值就写metadata |
| metadata.name | String | 元数据对象的名字,这里由我们编写,比如命名Pod名字 |
| metadata.namespace | String | 元数据对象的命名空间,这里由我们定义 |
| spec | Object | 详细定义对象,固定值就写Spec |
| spec.containers\[\].name | String | 这里定义容器的名字 |
| spec.containers\[\].image | String | 这里定义要用到的镜像名称 |
| spec.containers\[\].imagePullPolicy | String | 定义镜像拉取策路,有Always、Never、IfNotPresent三个值可选 (1)Always: 意思是每次都尝试重新拉取镜像 (2)Never: 表示仅使用本地镜像 (3)IfNotPresent: 如果本地有镜像就使月本地镜像,没有就拉取在线镜像。 上面三个值都没设置的话,默认是Always。 |
| spec containers\[\].command\[\] | List | 指定容器启动命令,因为是数组可以指定多个。不指定则使用镜像打包时使用的启动命令。 |
| spec.containers\[\].args | List | 指定容器启动命令参数,因为是数组可以指定多个 |
| spec.cantainers\[\].workDir | String | 指定容器的工作目录 |
| spec.containers\[\].yolumeMounts\[\] | List | 指定容器内部的存储卷配置 |
| spec.containers\[\].yolumeMounts\[\].name | String | 指定可以被容器挂截的存储卷的名称 |
| spec.containers\[\]. volumeMounts\[\].mountPath | String | 指定可以被容器捱戴的存储卷的路径 |
| spec.containers\[\].volumeMounts\[\].readOnly | String | 设置存储卷路径的读写模式,ture或者false,默认为读写模式 |
| spec.containers \[\].ports\[\] | String | 指定容器需要用到的端口列表 |
| spec.containers \[\].ports\[\].name | String | 指定端口名称 |
| spec.dontainers \[\].ports\[\].containerPort | String | 指定容器需要监听的端口号 |
| spec.containers .ports\[.hostPort | String | 指定容所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突) |
| spec.containers\[\].ports\[\].protocol | String | 指定端口协议,支持TCP和UDP,默认值为TCP |
| spec.containers \[\].env\[\] | List | 指定容器运行前需设的环境变量列表 |
| spec.containers \[\].env\[\].name | String | 指定环境变量名称 |
| spec.containers \[\].env\[\].value | String | 指定环境变量值 |
| spec.containers\[\].resources | Object | 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限) |
| spec.containers\[\].resources.limit | Object | 指定设置容器运行时资源的运行上限 |
| spec.containers\[\].resources.limit.cpu | String | 指定CPU限制,单位为core数,将用于docker run --cpu -shares 参数 |
| spec.containers\[\].resources.limits.memory | String | 指定MEM内存的限制,单位为MiB、GiB |
| spec.containers\[\].resources.requests | Object | 指定容器启动和调度时的限制设置 |
| spec.containers\[\].resources.requests.cpu | String | CPU请求,单位为core数,容器启动时初始化可用数量 |
| spec.containers\[\].resources.requests.memory | String | 内存请求,单位为MiB、GiB,容器启动时初始化可用数量 |
| spec.restartPolicy | String | 定义Pod的重启策略,可选值为Always、OnFailure,默认值为Always。 1.Always:Pod一旦终止运行,则无论容器时如何终止的,kubelet服务都将重启它。 2.OnFailure:只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为O),则kubelet将不会重启它。 3.Never:Pod终止后,kubelet将退出码报告给Master,不会重启该Pod。 |
| spec.nodeSelector | Object | 定义NodeLabel过滤标签,以key:value格式指定。 |
| spec.imagePullSecrets | Object | 定义pul镜像时使用secret-名称,以name:secretkey格式指定。 |
| spec.hostNetwork | Boolean | 定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法在同一台宿主机上自动第二个副本。 |
举例说明
-
创建一个namespace
apiVersion: v1 kind: Namespace metadata: name: test -
创建一个Pod
apiVersion: v1 kind: Pod metadata: name: pod1 spec: containers: - name: nginx-containers images: nginx:latest
K8s集群Namespace(命名空间)
Namespace介绍
-
命名空间
-
作用:多租户情况下,实现资源隔离
-
属于逻辑隔离
-
属于管理边界
-
不属于网络边界
-
可以针对每个namespace做资源配额
查看Namespace
命令
[root@master1 ~]kubectl get namespace

说明
default用户创建的pod默认在此命名空间
kube-pub1ic 所有用户均可以访问,包括未认证用户
kube-node-lease kubernetes集群节点租约状态v1,13加入
kube-system kubernetes集群在使用
创建Namespace
通过kubectl命令行创建
命令
[root@master1 ~]kubectl create namespace test

命令
[root@master1 ~]kubectl get namespace

通过kubectl命令应用资源清单文件创建
准备资源清单文件
[root@master1 yamldir]#cat 01-create-ns.yaml
输出
apiversion:v1
kind:Namespace
metadata:
name:demons1

命令
应用资源清单文件
[root@master1 yamldir]kubectl apply -f 01-create-ns.yaml

命令
[root@master1 yamldir]kubectl get namespace

删除Namespace
删除命名空间时,命名空间中包含的所有资源对象同时被删除
通过kubectl命令行删除
命令
查看namespace
[root@master1 yamldir]kubectl get namespace

命令
kubectl命令行删除
[root@master1 yamldir]kubectl delete namespace test1

资源清单删除

命令
应用资源清单文件
[root@master1 yamldir]kubectl delete -f 01-create-ns.yaml

k8s集群核心概念 Pod
Pod介绍
-
Pod是kubernetes集群能够调度的最小单元
-
Pod是容器的封装
查看Pod
命令及输出
查看default命名空间中的Pod
[root@master1 ~]kubectl get pod
No resources found.
或
[root@master1 ~]kubectl get pods
No resources found.
或
[root@master1 ~]kubectl get pods --namespace default
No resources found.
或
[root@master1 ~]kubectl get pod --namespace default
No resources found.
创建Pod
由于网络原因,建议提前准备好容器镜像。本次使用nginx:latest容器镜像

编写用于创建Pod资源清单文件
[root@masterl yamldir]#cat 02-create-pod.yaml
apiVersion: v1
kind:Pod
metadata:
name: pod1
spec:
containers:
- name: ngninx-pod
image: nginx:latest
ports:
- name: nginxport
containerPort: 80
命令
应用资源清单文件
[root@master1 yamldir]kubectl apply -f 02-create-pod.yaml -n default[命名空间]

验证Pod是否创建
命令
查看default命名空间中的Pod
[root@master1 ~]kubectl get pods

命令
查看pod更加详细信息
[root@master1 ~]kubectl get pods -o wide

Pod访问
命令
[root@master1 ~]curl http://IP


删除Pod
可通过命令行删除,也可通过资源清单(YAML)文件删除
kubectl命令行删除
命令
查看default命名空间中的Pod
[root@master1 ~]kubectl delete pods pod1

资源清单文件删除
命令
查看default命名空间中的Pod
[root@master1 ~]kubectl delete -f 02-create-pod.yaml

k8s集群核心概念Controller(控制器)
Controller介绍
-
控制器
-
用于对应用运行的资源对象进行监控
-
当Pod出现问题时,会把Pod重新拉起,以达到用户的期望状态
Controller分类
常见Pod控制器:
| 控制器名称 | 作用 |
|---|---|
| Deployment | 声明式更新控制器,用于发布无状态应用 |
| ReplicaSet | 副本集控制器,用于对Pod进行副本规模扩大或剪裁 |
| StatefulSet | 有状态副本集,用于发布有状态应用 |
| DaemonSet | 在k8s集群每一个Node上运行一个副本,用于发布监控或日志收集类等应用 |
| Job | 运行一次性作业任务 |
| CronJob | 运行周期性作业任务 |
Deployment控制器介绍
-
具有上线部署、滚动升级、创建副本、回滚到以前某一个版本(成功/稳定)等功能
-
Deployment包含ReplicaSet,除非需要自定义升级功能或者根本不需要升级Pod,否则还是建议使用Deployment而不直接使用ReplicaSet
创建Deployment控制器类型应用
通过kubectl命令行创建
命令
[root@masterl1 ~]kubect1 run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2

说明
nginx-app是deployment控制器类型的应用名称
nginx:latest是应用运行的Pod中的Container所使用的镜像
IfNotPresent是Container容器镜像下载策略,如果本地有镜像,使用本地,如果本地没有镜像,下载镜像
--rep1icas=2是指应用运行的Pod共计2个副本,这是用户的期望值,
Deployment控制器中的Replicaset控料器会一直监控此应用运行的Pod副本状态,如果数量达不到用户期望,就会重新拉起一个新的Pod,会让Pod数量一直维持在用户期望值数量。
命令
查看Deployment:控制器类型应用
[root@master1 ~]kubectl get deployment.apps

命令
[root@master1 ~]kubectl get replicaset.apps

命令
[root@master1 ~]kubectl get pods -o wide

通过资源清单文件创建
[root@master1 -]cat 03-creat-deployment-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-apps
labels:
app: nginx
spec:
replicas: 1 #副本数
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginxapp
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

命令
kubectl apply -f 03-create-deployment-nginx-app2.yaml

删除Deployment控制器类型应用
带有控制器的Pod不能随便删除,如果必须删除,请删除控制器类型的应用名称
通过kubectl命令行删除
带有控制器的Pod不能删除会被重新启动

命令
[root@master1 ~]kubectl get deployment.apps
命令
[root@master1 ~]kubectl delete deployment.apps nginx-app

通过资源清单文件删除
命令
kubectl delete -f 03-create-deployment-nginx-app2.yaml

k8s集群核心概念Service
发现一个问题,由于Pod的状态不是人为控制的Pod IP是在创建时分配 的,如果在Pod被误删除,被Controller重新拉起一个新的Pod时,我们发现Pod IP地址是变化着的,我们如果访问必须更换P地址,这样对于大量的Pod运行应用来说,我们对Pod完全无法控制的,因此在k8s集群中我们引入另一个概念Service。
Service介绍
-
不是实体服务
-
是一条iptables或ipvs的转发规则
Service作用
-
通过Service为pod客户端提供访问pod方法,即客户端访问pod入口
-
Service通过Pod标签与Pod进行关联

Service类型
-
ClusterlP
- 默认,分配一个集群内部可以访问的虚拟P
-
NodePort
- 在每个Node上分配一个端口作为外部访问入口
-
LoadBalancer
- 工作在特定的Cloud Provider.上,例如Google Cloud,AWS,OpenStack
-
ExternalName
- 表示把集群外部的服务引入到集群内部中来,即实现了集群内部印od和集群外部的服务进行通信
Service参数
-
port 访问service使用的端口
-
targetPort Pod中容器端口
-
NodePort 通过Node实现外网用户访问k8s集群内service(30000-32767)
Service创建
通过命令行创建
默认创建Service为ClusterlP:类型
创建Deployment
命令
[rootamaster1 ~]kubectl run nginx-app --image=nginx:latest
-image-pull-policy=IfNotPresent --replicas=1


创建Service与Deployment类型应用关联
命令
创建service
[root@master1 ~]kubectl expose deployment.apps nginx-app -
type=clusterIP --target-port=80--port=80

说明
expose 创建service
deployment.apps 控制器类型
nginx-app 应用名称,也是service名称
--type=ClusterIP 指定service类型
--target-port=80 指定Pod中容器端口
--port=80指定service端口
访问Servicel以实现访问Pod目的
命令
查看Service创建情况
[root@master1~]# kubectl get service

命令
访问Service
[root@master1~]# curl http://ClusterlP


通过资源清单文件Yaml创建


命令
kubectl apply -f 03-create-deployment-service-clusterip.yaml

验证资源对象创建结果


检验一下service负载均衡的效果


基于资源清单YAML文件创建NodePort类型Service


执行命令

效果

可以进行外部访问

删除Service
通过命令行删除
命令
查看Service创建情况
[root@master1~]# kubectl get service

命令
查看Service创建情况
[root@master1~]# kubectl delete service nginx-app1

通过资源清单文件删除
