【Kubernets实践】06-POD在多AZ之间高可用的实现
1、原理通过K8s的亲和性和反亲和性设置,可以将POD在节点间调度。
亲和性(affinity):将多个POD部署在同一个节点上,容器间通信无需转发路由,减少网络消耗。
反亲和性(anti-affinity):将多个POD部署在不同节点上,满足业务容灾冗余需求,比如节点1挂了,节点2的POD还能提供服务。不过,K8s本身也会在pod消亡时自动寻找节点部署业务。
亲和与反亲和有两种条件:
必须满足: 即硬约束,关键字为requiredDuringSchedulingIgnoredDuringExecution。
尽量满足: 即软约束,关键字为preferredDuringSchedulingIgnoredDuringExecution。
除此之外,还有几个关键概念:
● 拓扑域: 即topologyKey,拓扑域通过设置工作节点的标签,包含默认和自定义标签,用于指定调度时作用域。比如topologyKey: failure-domain.beta.kubernetes.io/zone指的拓扑域是AZ域,topologyKey: kubernetes.io/hostname指的拓扑 ...
【Kubernets实践】05-通过RBAC授权API对象的操作
RBAC:即role-based access control,基于角色的访问控制。RBAC 鉴权机制使用 rbac.authorization.k8s.io API 组 来驱动鉴权,通过 Kubernetes API 动态配置策略。
RBAC的几个关键概念Kubernetes 所有资源对象都是模型化的 API 对象,允许执行 CRUD(Create、Read、Update、Delete) 操作,比如下面的这些资源:
Pods、ConfigMaps、Deployments、Nodes、Secrets、Namespaces
对于上面这些资源对象的可能存在的操作有:
create、get、delete、list、update、edit、watch、exec、patch
在更上层,这些资源和 API Group 进行关联,比如 Pods 属于 Core API Group,而 Deployements 属于 apps API Group。
除了这些资源和操作以外,还有几个关键概念:
Rule:规则,规则是一组属于不同 API Group 资源上的一组操作的集合
Role 和 Clu ...
【Kubernets实践】04-POD初始化与应用零宕机滚动更新
1. POD的生命周期一个 Pod 的完整生命周期过程包含 Init Container、Pod Hook、健康检查 三个主要部分,如下图所示。
其中Init Container初始化容器是用来做初始化的,比如提前给main container主容器准备卷、文件、检测环境等等。main容器只有等初始化容器运行结束后才会启动。
POD Hook是main容器的钩子,有post start和pre stop钩子,post start即是在main容器启动之后马上开始的动作;pre stop是在main容器结束之前的动作。一般事项零宕机就是通过设置pre stop钩子,在POD结束之前使容器优雅退出。 设置pre stop后,删除POD时,POD将会发SIGTERM 信号给POD中各个容器通知准备退出了,同时Kubernetes 将从 Endpoints 对象中删除该 Pod,所以该 Pod 将会从负载均衡器中排除,负载均衡器便不再转发流量到这个POD上,理论上可实现零宕机(应用退出快的情况下)。一般优雅停机方法: 1234lifecycle: preStop: exec: ...
【Kubernets实践】03-Kubernetes从私有仓库中拉取镜像
本文介绍如何使用 Secret 从私有镜像仓库或代码仓库拉取镜像来创建 Pod。
准备工作
Kubernetes集群
私有仓库
可登陆私有仓库的账号
登录Docker私有仓库要想拉取私有镜像必须在镜像仓库上进行身份验证。
1docker login -u <username> <repo-url>
当出现提示时,输入账号密码。
登录过程会创建或更新保存有授权令牌的 config.json 文件。 查看 Kubernetes 中如何解析这个文件。
查看 config.json 文件:
1cat ~/.docker/config.json
输出结果包含类似于以下内容的部分:
1234567{ "auths": { "https://index.docker.io/v1/": { "auth": "c3R...zE2" } }}
说明: 如果使用 Docker ...
【Kubernets实践】02-使用YAML部署Nginx并滚动升级
通过YAML基于kubectl使用原生方式跟API-Server快速交互,创建对应的API对象。
YAML基本语法YAML的基本语法规则如下:
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
# 表示注释,从这个字符一直到行尾,都会被解析器忽略
在 Kubernetes 中,首先了解两种结构类型就行了:
Lists(列表)
Maps(字典)
MapsMap 就是字典,即是一个 key:value 的键值对,Maps 可以让我们更加方便的去书写配置信息,例如:
123---apiVersion: v1kind: Pod
其中第一行的---是分隔符,是可选的,在单一文件中,可用连续三个连字号---区分多个文件。这里我们可以看到,我们有两个键:kind 和 apiVersion,他们对应的值分别是:v1 和 Pod。
再创建一个相对复杂一点的 YAML 文件,创建一个 KEY 对应的值不是字符串而是一个 Maps:
1234567---apiVersion: v1kind: Podmetadata: ...
【Kubernets实践】01-在华为云用Kubeadm上部署K8s V1.23.1集群
1.环境准备在华为云上申请3台ECS虚机服务器,临时测试使用,建议按需付费申请。选择VPC为192.168.0.0/16网段,将在这三个节点部署v1.23.1最新版本Kubernetes集群。为何要选三个节点?是因为准备实验ceph作为后端分布式存储,至少需要三个节点起,且需要一个裸盘作为ceph存储数据盘,所以在华为云上给每个ECS配置一个额外的100G空EVS块存储,具体信息如下表;选择flannel作为底层网络插件。
角色
OS
节点name
存储
IP
docker version
kubelet version
kubeadm version
kubectl version
network
master
Centos7.9
master
40G+100G(数据盘)
192.168.0.11
Docker 20.10.8
V1.23.1
V1.23.1
V1.23.1
flannel
master
Centos7.9
node1
40G+100G(数据盘)
192.168.0.23
Docker 20.10.8
V1.23.1
V1.23.1
V1.23.1
f ...
【Docker基础】06-容器编排之Docker-Compose
Docker Compose是什么?它是Docker的编排开源组件,后被Docker收购,是当年社区内火爆程度仅次于Docker的开源项目,Docker的三架马车之一,主要用来编排docker容器。这篇文章简单描述Docker compose的简单示意。
1.Docker Compose组件Compose 组件是Docker官方基于Python开发的Docker编排的组件。之前我们启动多个容器的时候,需要为每个容器编写dockerfile,分别使用docker run或者docker exec启动它们。通过Compose咱们就可以一次性在定义好多个容器,一次性启动,实现编排功能。它的两个重点内容:
docker-compose.yml: Compose的配置文件
docker-compose: Compose的命令行工具
1.1 Docker Compose安装与卸载推荐直接下载二进制可执行文件。
1234567891011 #从github下载1.25.4版本compose$ sudo curl -L "https://github.com/docker/compose ...
【Docker基础】05-Docker网络
容器网络比较复杂,目前主流的网络方案是以VXLAN为主的Overlay方案,关于VXLAN的理解,可以参考这篇文章《什么是VXLAN》。
这篇文章里,我们将容器网络分为单节点上的容器网络通信和跨节点网络通信两部分内容。
1.单Host容器网络在单个host主机上Docker的网络模型有四种:None网络、Host网络、Bridge网络和User-defined网络。
None网络:单机版容器,没有网络,适用场景为无需联网的业务,比如生成随机码业务,用法为指定参数--network=none。
Host网络:连接到Host主机上,完全与主机共享网络,用法为指定参数--network=host,由于直接共享主机网络无需转发,所以性能比桥接网络性能要好,但是要考虑到不能与主机端口冲突。
Bridge网络:桥接网络,Docker的默认网络模型,通过桥转发网络流量,无需指定参数默认使用桥接网络。
Docker默认会生成一个docker0的网桥,可看成一个交换机。
123[root@ecs_lm_test ~]# brctl showbridge name bridge id ...
【Docker基础】04-Docker数据存储
Docker提供两种数据存储资源,一种是基于storage driver提供的镜像层和容器层,一种是基于data volume提供的持久化存储。
图1 Docker存储框架
图1 描述了Docker存储的整体框架,它主要支持两种类型存储,一种是storage driver管理的镜像层与容器层,对现有容器数据的读写;一种是data volume持久化存储,提供bind volume和docker managed volume存储。
Storage driver我们知道容器镜像是按照多个层级来分层叠加的,如下图2示意,容器包含最上层的读写层与下面多个只读镜像层,当需要修改容器数据的时候,会将只读层数据COPY至容器层进行修改,修改后数据保存在容器层,镜像层不变,即使用了linux的Copy on write特性。
图2 存储:镜像层与容器层-图片出自网络
这种数据存储的生命周期当然会随着容器的销毁而结束,如果想在容器销毁后依然保存数据,该怎么办呢,答案是持久化存储-data volume。
Data volumeData volume提供两种类型存储。一种是bind volume,另一 ...
【Docker基础】03-Dockerfile基础
Dockerfile是用来干啥的?答案是制作镜像。那么了解Dockerfile之前,我们首先需要理解几个简单概念。
Dockerfile基础概念
制作镜像命令: docker build
build context: 镜像编译上下文,其实就是docker客户端所在的目录。Docker基本架构与原理提到Docker 是一个典型的 C/S 架构的应用,分为 Docker 客户端(即平时敲的 docker 命令)和 Docker 服务端(dockerd 守护进程),Docker 客户端通过 REST API 和服务端进行交互,docker 客户端每发送一条指令,底层都会转化成 REST API 调用的形式发送给服务端,服务端处理客户端发送的请求并给出响应。
一个典型的使用docker build的构建镜像的流程大概分为如下三步:
1)执行 docker build -t <imageName:imageTag> . ;注意命令中有一个点号**(.)**在linux中表示当前目录,就是这次build的上下文build context;
2)Docker 客户端会将构建命令后面指 ...