实际项目部署案例
部署项目前的梳理:
1.项目的代码构成,什么语言开发的
2.项目的依赖环境
3.项目的配置文件在哪里
4.项目的端口清单
5.项目有没有做数据的持久化
容器交付流程
在K8s平台部署项目流程
在K8s平台部署Java网站项目
阿里云maven源地址: https://maven.aliyun.com/mvn/guide
第一步:制作镜像
yum install java-1.8.0-openjdk maven git -ygit clone https://github.com/lizhenliang/tomcat-java-demomvn clean package -Dmaven.test.skip=true # 代码编译构建unzip target/*.war -d target/ROOT # 解压构建文件
FROM lizhenliang/tomcat LABEL maintainer www.ctnrs.comRUN rm -rf /usr/local/tomcat/webapps/*COPY target/ROOT /usr/local/tomcat/webapps/ ...
K8s应用包管理器Helm初探
为什么需要Helm
由于Kubernetes缺少对发布的应用版本管理和控制,使得部署的应 用维护和更新等面临诸多的挑战,主要面临以下问题:
如何将这些服务作为一个整体管理?
这些资源文件如何高效复用?
不支持应用级别的版本管理
Helm介绍
Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的将之前 打包好的yaml文件部署到kubernetes上。
Helm有3个重要概念:
helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。
Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
Release:基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在 k8s中创建出真实运行的资源对象。
Helm目前有两个大版本:v2和v3
2019年11月Helm团队发布v3版本,相比v2版本最 大变化是将Tiller删除,并将大部分代码重构。
Helm客户端
使用helm很简单,你只需要下载一个二 ...
K8s安全控制
Kubernetes 安全框架
K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都 支持插件方式,通过API Server配置来启用插件。
Authentication(鉴权)
Authorization(授权)
Admission Control(准入控制)
客户端要想访问K8s集群API Server,一般需要证书、Token或 者用户名+密码;如果Pod访问,需要ServiceAccount
鉴权(Authentication)
三种客户端身份认证:
HTTPS 证书认证:基于CA证书签名的数字证书认证
HTTP Token认证:通过一个Token来识别用户
HTTP Base认证:用户名+密码的方式认证
授权(Authorization)
RBAC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。
RBAC根据API请求属性,决定允许还是拒绝。
比较常见的授权维度:
user:用户名
group:用户分组
资源,例如pod、deployment
资 ...
再谈有状态应用部署:StatefulSet控制器
无状态与有状态
Deployment控制器设计原则:管理的所有Pod一模一样,提供同一个服务,也不考虑在哪台Node 运行,可随意扩容和缩容。这种应用称为“无状态”,例如Web服务
在实际的场景中,并不能满足所有应用,尤其是分布式应用,会部署多个实例,这些实例之间往往有 依赖关系,例如主从关系、主备关系,这种应用称为“有状态”,例如MySQL主从、Etcd集群
StatefulSet 控制器概述
StatefulSet控制器用于部署有状态应用,满足一些有状态应 用的需求:
Pod有序的部署、扩容、删除和停止
Pod分配一个稳定的且唯一的网络标识
Pod分配一个独享的存储
StatefulSet 控制器:网络标识
稳定的网络标识:使用Headless Service(相比普通Service只是将spec.clusterIP定义为None)来维 护Pod网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。还需要在StatefulSet添加 serviceName: “nginx”字段指定StatefulSet控制器要使用这个Headless Service。
稳定 ...
数据卷与持久数据卷
为什么需要存储卷
容器部署过程中一般有以下三种数据:
启动时需要的初始数据,例如配置文件
启动过程中产生的临时数据,该临时数据需要多个容器间共享
启动过程中产生的持久化数据,例如MySQL的data目录
数据卷概述
Kubernetes中的Volume提供了在容器中挂载外部存储的能力
Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个信息后才可以使用相应的Volume
数据卷类型大致分类:
本地(hostPath,emptyDir等)
网络(NFS,Ceph,GlusterFS等)
公有云(AWS EBS等)
K8S资源(configmap,secret等)
支持的数据劵类型:https://kubernetes.io/docs/concepts/storage/volumes/
数据卷:emptyDir
emptyDir卷:是一个临时存储卷,与Pod生命周期绑定一起,如果 Pod删除了卷也会被删除。
应用场景:Pod中容器之间数据共享
示例:Pod内容器之前共享数据
...
管理应用程序配置
ConfigMap
创建ConfigMap后,数据实际会存储在K8s中Etcd,然后通过创建Pod时引用该数据。
应用场景:应用程序配置
Pod使用configmap数据有两种方式:
变量注入
数据卷挂载
两种数据类型:
键值
多行数据
#解释
apiVersion: v1kind: Podmetadata: #pod的名字 name: configmap-demo-pod spec: containers: - name: demo image: alpine #用进程夯筑容器不让它退出 command: ["sleep", "3600"] env: # 定义环境变量 # 请注意这里和 ConfigMap中的键名是不一样的(自定义键的名字) - name: ABC valueFrom: configMapKeyRef: # 这个值来自 ConfigMa ...
Ingress最佳方式对外暴露应用
Ingress是什么
NodePort存在的不足:
一个端口只能一个服务使用,端口需提前规划
只支持4层负载均衡
Ingress:Ingress公开了从集群外部到集群内服务的HTTP和HTTPS路由的规则集合,而具体实现流量路 由则是由Ingress Controller负责。
Ingress:K8s中的一个抽象资源,给管理员 提供一个暴露应用的入口定义方法
Ingress Controller:根据Ingress生成具体 的路由规则,并对Pod负载均衡器
Ingress Controller
Ingress Controller有很多实现,我们这里采用官方维护的Nginx控制器。
项目地址:https://github.com/kubernetes/ingress-nginx
部署:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx0.30.0/deploy/static/mandatory.yaml
注意事项:
镜像地址修改成国内的:lizh ...
Service(对外暴露你的应用)
Service是什么与Service存在的意义
Service引入主要是解决Pod的动态变化,提供统一访问入口:
防止Pod失联,准备找到提供同一个服务的Pod(服务发现)
定义一组Pod的访问策略(负载均衡)
Pod与Service的关系
Service通过标签关联一组Pod
Service使用iptables或者ipvs为一组Pod提供负载均衡能力
Service定义与创建
vim service.yaml
apiVersion: v1kind: Servicemetadata: labels: app: web name: webspec: type: ClusterIP # 服务类型 ports: - port: 80 # Service端口 protocol: TCP # 协议 targetPort: 80 # 容器端口 selector: app: web # 指定关联Pod的标签
#创建service: kubectl apply -f service.yaml #查看service: kubectl get ...
常用工作负载控制器
工作负载控制器是什么
工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
常用工作负载控制器:
Deployment : 无状态应用部署
StatefulSet : 有状态应用部署
DaemonSet : 确保所有Node运行同一个Pod
Job : 一次性任务
Cronjob : 定时任务
控制器的作用:
管理Pod对象
使用标签与Pod关联
控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等。
Deployment
Deployment:介绍
Deployment的功能:
管理Pod和ReplicaSet
具有上线部署、副本设定、滚动升级、回滚等功能
提供声明式更新,例如只更新一个新的Image 应用场景:网站、API、微服务
Deployment:使用流程
Deployment:部署
第一步:部署镜像
kubectl apply -f xxx.yaml kubectl create deployment web --image=n ...
深入理解Pod对象:调度
创建一个Pod的工作流程
Kubernetes基于list-watch机制的控制器架构,实现组件间交 互的解耦。 其他组件监控自己负责的资源,当这些资源发生变化时,kubeapiserver会通知这些组件,这个过程类似于发布与订阅。
Pod中影响调度的主要属性
资源限制对Pod调度的影响
容器资源限制:
resources.limits.cpu
resources.limits.memory
容器使用的最小资源需求,作为容器调度时资 源分配的依据:
resources.requests.cpu
resources.requests.memory
CPU单位:可以写m也可以写浮点数,例如0.5=500m,1=1000m
K8s会根据Request的值去查找有足够资源的Node来调度此Pod
vim pod-resources.yaml
apiVersion: v1kind: Podmetadata: name: pod-resourcesspec: containers: - name: web image: nginx resources ...