腾讯云产品学习——容器
一、容器服务
1、概念
腾讯云容器服务(Tencent Kubernetes Engine,TKE):可以在托管的云服务器实例集群上轻松运行应用程序。
名词概念:
- 集群:指容器运行时所需云资源的集合,如:云服务器、负载均衡等云资源。
- 托管集群:提供Master和Etcd全部托管的k8s集群管理服务。只需用户购置计算节点即可,无许关心集群的管理面。
- 独立集群:etcd和master节点会部署在自己买的云服务器上。
- 弹性集群:无需购买节点
- 节点:类似计算节点
- 节点池:管理和销毁节点
- 命名空间:每个命名空间相当于一个相对独立的虚拟空间,资源互相隔离互不干扰。
- 服务:提供四层协议服务,如TCP、UDP。
- Ingress:提供七层协议服务的暴露,如HTTPS协议。
- 实例(Pod):一个或多个容器构成的一个实例,这些容器共享相同的存储和网络空间
- 工作负载:K8S资源对象,用于管理Pod副本的创建、调度以及整个生命周期的自动控制。
- service:由多个相同配置的实例(Pod)和访问这些实例(Pod)的规则组合成的微服务
- Ingress:将外部HTTP(S)流量路由到服务(Service)的规则集合
- 应用:指腾讯云容器服务TKE集成的Helm3.0相关功能
- 镜像仓库:用于存放Docker镜像
弹性集群服务(Elastic Kubernetes Service,EKS):无须购买节点即可部署工作负载的服务模式,按量计费。
名词概念:
- 容器和镜像:容器是进程级别的虚拟化技术,将系统资源进行隔离和控制,让原来的全局的资源仅能在容器内进程使用。镜像是轻量化的虚拟机快照。
- kubernetes:是开源的容器编排调度引擎,提供了生产级别的应用编排、容器调度、服务发现、自动扩缩容等功能。
容器实例(EKS Container Instance,EKSCI):是由EKS推出的,EKSCI相当于Pod,是一种更简单更底层的容器化解决方案,容器实例根据资源规格及使用时长计费
边缘容器服务(Tencent Kubernetes Engine for Edge,TKE Edge):用于从中心云管理边缘云资源的容器系统、一个集群管理多个边缘机房的节点。
2、区别
服务名 | 特点 | 计费方式 |
---|---|---|
TKE | 部署在用户物理机或虚拟机上的开源系统(需要用户自己安装部署,且自己维护CVM) | 托管或用户自建机房 |
EKS | 无需部署,当使用到Pod时会自动创建CVM运行实例(用户不维护操作CVM) | 按量计费 |
3、优势
- 基于K8s实现
- 滚动更新
- 自修复
- 平滑扩展
4、架构
- 腾讯云容器服务(Tencent Kubernetes Engine,TKE):基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。
- 腾讯云容器镜像服务(Tencent Container Registry,TCR):为用户提供安全高效的容器镜像托管、分发等服务,与 容器服务 TKE 结合使用,获得容器上云的顺畅体验。
- 腾讯云弹性容器服务(Elastic Kubernetes Service,EKS):是腾讯云容器服务推出的无须用户购买节点即可部署工作负载的服务模式。
- 腾讯云边缘容器服务(Tencent Kubernetes Engine for Edge,TKE Edge):是腾讯云容器服务推出的用于从中心云管理边缘云资源的容器系统,具备边缘自治和分布式健康检查能力
5、适用场景
- devops
- 微服务
6、实操
①复习了下docker的知识,制作了一个自己的docker镜像,并推送到阿里云上
②在自己的工作站中用四台虚拟机安装了开源版的TKE,安装之后根据用户指南进行操作,部署了尝试在TKE中部署lnmp环境。
③下一步准备学习数据库产品,然后自己之前一直想做个百G数据库迁移的实验,结果没环境一直跑数据。
购买了一台轻量应用服务器选择了TKE的原生系统K3S应用。
通过自己写的deployment配置文件运行了一个MySQL的pod。
写了个脚本实现生成数据并写入数据库增加数据量,不停运行。
结果给自己的云服务器磁盘写满了(下次一定要加个判断,当磁盘满了停止运行脚本,下次一定)
数据满了导致pod无法运行(实则不是,尴尬,后续才想明白是因为端口占用)
之前我是用四个脚本,分别插入test库中的testtable、test1、test2、test3表中
数据满了,删除了test3数据表后,导致pod运行mariadb失败
GG。准备重新搞了
下面放一下自己写的脚本,制作的docker镜像和对pod、deployment的理解。
Deployment举例
apiVersion: apps/v1 # 指定api版本,此值必须在kubectl api-versions中
kind: Deployment # 指定创建资源的角色/类型
metadata: # 资源的元数据/属性
name: demo # 资源的名字,在同一个namespace中必须唯一
namespace: default # 部署在哪个namespace中
labels: # 设定资源的标签
app: demo
version: stable
spec: # 资源规范字段
replicas: 1 # 声明副本数目
revisionHistoryLimit: 3 # 保留历史版本
selector: # 选择器
matchLabels: # 匹配标签
app: demo
version: stable
strategy: # 策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavailable: 30% # 示在更新过程中能够进入不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
type: RollingUpdate # 滚动更新策略
template: # 模版
metadata: # 资源的元数据/属性
annotations: # 自定义注解列表
sidecar.istio.io/inject: "false" # 自定义注解名字
labels: # 设定资源的标签
app: demo
version: stable
spec: # 资源规范字段
containers:
- name: demo # 容器的名字
image: demo:v1 # 容器使用的镜像地址
imagePullPolicy: IfNotPresent # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent
# Always,每次都检查;Never,每次都不检查(不管本地是否有);IfNotPresent,如果本地有就不检查,如果没有就拉取
resources: # 资源管理
limits: # 最大使用
cpu: 300m # CPU,1核心 = 1000m
memory: 500Mi # 内存,1G = 1024Mi
requests: # 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 100m
memory: 100Mi
livenessProbe: # pod 内部健康检查的设置
httpGet: # 通过httpget检查健康,返回200-399之间,则认为容器正常
path: /healthCheck # URI地址
port: 8080 # 端口
scheme: HTTP # 协议
# host: 127.0.0.1 # 主机地址
initialDelaySeconds: 30 # 表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 # 检测的超时时间
periodSeconds: 30 # 检查间隔时间
successThreshold: 1 # 成功门槛
failureThreshold: 5 # 失败门槛,连接失败5次,pod杀掉,重启一个新的pod
readinessProbe: # Pod 准备服务健康检查设置
httpGet:
path: /healthCheck
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 5
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: # 通过tcpSocket检查健康
# port: number
ports:
- name: http # 名称
containerPort: 8080 # 容器开发对外的端口
protocol: TCP # 协议
imagePullSecrets: # 镜像仓库拉取密钥
- name: harbor-certification
affinity: # 亲和性调试
nodeAffinity: # 节点亲和力
requiredDuringSchedulingIgnoredDuringExecution: # pod 必须部署到满足条件的节点上
nodeSelectorTerms: # 节点满足任何一个条件就可以
- matchExpressions: # 有多个选项,则只有同时满足这些逻辑选项的节点才能运行 pod
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
mysql
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: mysql
spec:
restartPolicy: Always
containers:
- name: mysql
image: mariadb
env:
- name: MYSQL_ROOT_PASSWORD
value: 857493511
ports:
- containerPort: 3306
name: mysql
protocol: TCP
hostPort: 3306
volumeMounts:
- name: mysql
mountPath: /var/lib/mysql
volumes:
- name: mysql
hostPath:
path: /www/mysql
nginx-php
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-php
spec:
replicas: 10
selector:
matchLabels:
app: nginx-php
strategy:
type: RollingUpdate
template:
matedata:
labels:
app: nginx-php
spec:
restartPolicy: Always
containers:
- name: nginx-php
image: registry.cn-hangzhou.aliyuncs.com/lzcwy/lzcwy_lnp:v1
ports:
- containerPort: 80
name: nginx-php
protocol: TCP
hostPort: 80
volumeMounts:
- name: nginx-php
mountPath: /usr/local/nginx/html
volumes:
- name: nginx-php
hostPath:
path: /www/html
Pod举例
# yaml格式的pod定义文件完整内容:
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #必选,Pod所属的命名空间
labels: #自定义标签
- name: string #自定义标签名字
annotations: #自定义注释列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口号名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存清楚,容器启动的初始可用数量
livenessProbe: #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged:false
restartPolicy: [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork:false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
yaml结构
- apiVersion:版本
- kind:资源类型
- metadata:属性
- spec:详细
yaml注意事项
要用空格缩进, 不能使用tab键
Pod操作
kubectl get nodes 获取node信息
kuubectl get componentstatus 获取管理pod信息
kubectl get pod [pod名 获取pod的状态] [-o wide 显示的更多]
kubectl describe pod [pod名 获取此pod详细信息和日志]
nginxpod
apiVersion: v1 #声明API版本
kind: Pod #资源类型
metadata: #属性
name:nginx #pod的名字
namespace: default #命名空间
labels: #标签
app:web #app的标签对应web
spec: #详细
containers: #容器的内容
- name:nginx #容器名
images:nginx #容器镜像
ports: #容器端口
- containerPort:80 #容器端口80
docker file
FROM centos
RUN yum -y install http://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.18.0-1.el8.ngx.x86_64.rpm php-fpm php php-gd php-mbstring php-xml php-odbc php-pear php-xmlrpc php-curl php-dom php-exif php-fileinfo php-hash php-json php-mbstring php-mysqli php-openssl php-pcre
RUN mkdir /run/php-fpm && echo '/usr/sbin/nginx >/dev/null 2>&1' > /etc/profile.d/nginx.sh && chmod +x /etc/profile.d/nginx.sh && echo '/usr/sbin/php-fpm >/dev/null 2>&1' > /etc/profile.d/php-fpm.sh && chmod +x /etc/profile.d/php-fpm.sh
这个dockefile折磨了我挺久的,我想使用nginx容器连接php容器的,自己尝试了很多次都没办法成功,便想使用centos容器里安装nginx和php软件一个lnp环境,结果容器无法使用systemd,然后自己查到要加一个参数–priv啥的,但是不能每次都加这个参数啊,又想了另一个办法,写了一个shell脚本,放在/etc/profile.d中,容器每次运行都会执行,实现自启动安装的nginx和php。
文章内容仅用于作者学习使用,如果内容侵犯您的权益,请立即联系作者删除,作者不承担任何法律责任。