k8s无疑是未来替代docker的虚拟化技术。
1、kubernetes是一个开源的容器集群管理系统,是一套自动化部署工具;而Docker是一个开源的应用容器引擎,是一种容器化技术。
2、docker是容器层面的,kubernetes是容器编排层面的。
K8S更像一个系统,docker只是一个技术组件。而K8S也可以架设在docker之上,或者其他的虚拟化容器之上。K8S是一套解决虚拟化集群部署的技术架构或者应用管理平台。
Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
k8s架构:master(cluster)/worker(node)的架构模式
典型的 Kubernetes 集群包含一个 master 和很多 node。
Master 是控制集群的中心,node 是提供 CPU、内存和存储资源的节点。
Master 上运行着多个进程,包括面向用户的 API 服务、负责维护集群状态的 Controller Manager、负责调度任务的 Scheduler 等。
每个 node 上运行着维护 node 状态并和 master 通信的 kubelet,以及实现集群网络服务的 kube-proxy。
K8S的好处,或者说可以实现的特点:
K8S安装部署样例:
准备环境:三台centos7 服务器
192.168.6.129 k8s-master(主)
192.168.6.130 k8s-node-1(节点)
192.168.6.131 k8s-node-2(节点)
kubernetes(k8s)的安装方法
五种方法:
kubernetes 二进制安装 (配置最繁琐,不亚于安装openstack)
kubeadm 安装 (谷歌推出的自动化安装工具,网络有要求)
minikube 安装 (仅仅用来体验k8s)
yum 安装 (最简单,版本比较低====学习推荐此种方法)
go编译安装 (最难)
我们采用yum安装,学习怎么使用k8s才是重点。
安装前准备工作:
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 查看hostname并修改
hostname # 查看本机hostname
hostnamectl set-hostname k8s-master # 把本机名设置成k8s-master
hostnamectl status # 查看修改结果
echo "127.0.0.1 $(hostname)" >> /etc/hosts # 修改hosts文件
# 关闭selinux(linux的安全机制)
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
# 关闭swap(关闭内存交换)
swapoff -a
sed -ri 's/.*swap.*/#&/' '/etc/fstab'
free -m # 检查,确保swap里面没有东西
# 配置桥接流量
cat <
1、修改主机和host 解析
#请在129-130-131三台机器都执行如下操作
vim /etc/hosts:
1 2 3 |
|
修改主机名:
1 2 3 |
|
2: 安装docker 1.12版本,系统自带的1.13有点小bug,需要修改,不然后期容器网络通讯会不通
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
去官网找1.12版本docker
http://vault.centos.org/7.4.1708/extras/x86_64/Packages/
需要提前安装 CentOS-Base.repo源
三台机器都需要下载这三个docker包:
http://vault.centos.org/7.4.1708/extras/x86_64/Packages/docker-1.12.6-71.git3e8e77d.el7.centos.x86_64.rpm
http://vault.centos.org/7.4.1708/extras/x86_64/Packages/docker-client-1.12.6-71.git3e8e77d.el7.centos.x86_64.rpm
http://vault.centos.org/7.4.1708/extras/x86_64/Packages/docker-common-1.12.6-71.git3e8e77d.el7.centos.x86_64.rpm
如果之前安装了docker,可先将docker移除。
|
3、在三台都安装docker 1.12(必须要按如下顺序安装,不然可能会报错)
1 2 3 |
|
4、验证docker 是否安装成功
1 2 |
|
5、master节点安装etcd (k8s数据库kv类型存储)原生支持做集群
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
6、master节点安装kubernetes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
7、启动k8s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
K8S配置文件详解
apiVersion: v1 # 【必须】版本号
kind: Pod # 【必选】Pod
metadata: # 【必选-Object】元数据
name: String # 【必选】 Pod的名称
namespace: String # 【必选】 Pod所属的命名空间
labels: # 【List】 自定义标签列表
- name: String
annotations: # 【List】 自定义注解列表
- name: String
spec: # 【必选-Object】 Pod中容器的详细定义
containers: # 【必选-List】 Pod中容器的详细定义
- name: String # 【必选】 容器的名称
image: String # 【必选】 容器的镜像名称
imagePullPolicy: [Always | Never | IfNotPresent] # 【String】 每次都尝试重新拉取镜像 | 仅使用本地镜像 | 如果本地有镜像则使用,没有则拉取
command: [String] # 【List】 容器的启动命令列表,如果不指定,则使用镜像打包时使用的启动命令
args: [String] # 【List】 容器的启动命令参数列表
workingDir: String # 容器的工作目录
volumeMounts: # 【List】 挂载到容器内部的存储卷配置
- name: String # 引用Pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称
mountPath: Sting # 存储卷在容器内mount的绝对路径,应少于512个字符
readOnly: Boolean # 是否为只读模式,默认为读写模式
ports: # 【List】 容器需要暴露的端口号列表
- name: String # 端口的名称
containerPort: Int # 容器需要监听的端口号
hostPort: Int # 容器所在主机需要监听的端口号,默认与containerPort相同。设置hostPort时,同一台宿主机将无法启动该容器的第二份副本
protocol: String # 端口协议,支持TCP和UDP,默认值为TCP
env: # 【List】 容器运行前需设置的环境变量列表
- name: String # 环境变量的名称
value: String # 环境变量的值
resources: # 【Object】 资源限制和资源请求的设置
limits: # 【Object】 资源限制的设置
cpu: String # CPU限制,单位为core数,将用于docker run --cpu-shares参数
memory: String # 内存限制,单位可以为MB,GB等,将用于docker run --memory参数
requests: # 【Object】 资源限制的设置
cpu: String # cpu请求,单位为core数,容器启动的初始可用数量
memory: String # 内存请求,单位可以为MB,GB等,容器启动的初始可用数量
livenessProbe: # 【Object】 对Pod内各容器健康检查的设置,当探测无响应几次之后,系统将自动重启该容器。可以设置的方法包括:exec、httpGet和tcpSocket。对一个容器只需要设置一种健康检查的方法
exec: # 【Object】 对Pod内各容器健康检查的设置,exec方式
command: [String] # exec方式需要指定的命令或者脚本
httpGet: # 【Object】 对Pod内各容器健康检查的设置,HTTGet方式。需要指定path、port
path: String
port: Number
host: String
scheme: String
httpHeaders:
- name: String
value: String
tcpSocket: # 【Object】 对Pod内各容器健康检查的设置,tcpSocket方式
port: Number
initialDelaySeconds: Number # 容器启动完成后首次探测的时间,单位为s
timeoutSeconds: Number # 对容器健康检查的探测等待响应的超时时间设置,单位为s,默认值为1s。若超过该超时时间设置,则将认为该容器不健康,会重启该容器。
periodSeconds: Number # 对容器健康检查的定期探测时间设置,单位为s,默认10s探测一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: Boolean
restartPolicy: [Always | Never | OnFailure] # Pod的重启策略 一旦终止运行,都将重启 | 终止后kubelet将报告给master,不会重启 | 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常终止(退出码为0),则不会重启。
nodeSelector: object # 设置Node的Label,以key:value格式指定,Pod将被调度到具有这些Label的Node上
imagePullSecrets: # 【Object】 pull镜像时使用的Secret名称,以name:secretkey格式指定
- name: String
hostNetwork: Boolean # 是否使用主机网络模式,默认值为false。设置为true表示容器使用宿主机网络,不再使用docker网桥,该Pod将无法在同一台宿主机上启动第二个副本
volumes: # 【List】 在该Pod上定义的共享存储卷列表
- name: String # 共享存储卷的名称,volume的类型有很多emptyDir,hostPath,secret,nfs,glusterfs,cephfs,configMap
emptyDir: {} # 【Object】 类型为emptyDir的存储卷,表示与Pod同生命周期的一个临时目录,其值为一个空对象:emptyDir: {}
hostPath: # 【Object】 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: String # Pod所在主机的目录,将被用于容器中mount的目录
secret: # 【Object】类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
secretName: String
items:
- key: String
path: String
configMap: # 【Object】 类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
name: String
items:
- key: String
path: String