k8s概念、yml方式创建容器、服务器通信
没有系统学习,只能根据项目中用的内容一点一点积累
目前的理解是:docker打包生成镜像,然后可以使用镜像生成容器,k8s管理容器
由于基于kubernetes也是基于docker的,都需要用到docker进行通信和中转,因此使用同一的slave镜像将大大节省平台开发与维护成本,因此需要引入jenkins的另一个大插件pipeline
一、k8s概念
https://www.jianshu.com/p/502544957c88
Docker是应用最为广泛的容器技术,通过打包镜像,启动容器来创建一个服务。
但是随着应用越来越复杂,容器的数量也越来越多,由此衍生了管理运维容器的重大问题,k8s问世。
k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能,有如下优点:
1、服务发现与调度
2、负载均衡
3、服务自愈
4、服务弹性扩容
5、横向扩容
6、存储卷挂载
Ingress
ingress是k8s的一种集群维度暴露服务的方式。
通过http或https暴露集群内部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于host的方向代理。
可以简单理解为service的service,他通过独立的ingress对象来制定请求转发的规则,把请求路由到一个或多个service中。
ingress与ingress-controller
ingress对象:
指的是k8s中的一个api对象,一般用yaml配置。作用是定义请求如何转发到service的规则,可以理解为配置模板。
ingress-controller:
具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发
二、yml方式创建容器
k8s中文社区文档:https://www.kubernetes.org.cn/kubernetes-labels
k8s英文社区文档:https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/
在.yaml要创建的 Kubernetes 对象的文件中,您需要为以下字段设置值:
1、apiVersion - 您使用哪个版本的 Kubernetes API 创建此对象
2、kind - 你想创建什么样的对象
3、metadata- 有助于唯一标识对象的数据,包括name字符串UID、 和可选namespace
4、spec - 您希望对象处于什么状态
spec每个 Kubernetes 对象的对象的精确格式都不同,并且包含特定于该对象的嵌套字段
Kubernetes API参考:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/
deployment示例:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#deployment-v1-apps
service示例:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#service-v1-core
IngressRoute示例:https://www.qikqiak.com/traefik-book/routing/providers/kubernetes-crd/
个人deployment的示例,以及其他参考来源:https://www.cnblogs.com/msi-chen/p/14209142.html
# 创建容器 apiVersion: apps/v1 # K8S API的版本,可以用 kubectl api-version命令查询 kind: Deployment # 资源类型 metadata: # 资源元数据 labels: # 标签对内核系统是没有直接意义,用来划分特定组的对象(比如,所有女的) app: qa-mock name: qa-mock namespace: ph-stg spec: minReadySeconds: 10 # k8s在等待10秒后进行升级 progressDeadlineSeconds: 600 # 部署升级的最长时间 replicas: 1 # 副本数量,应该是指服务的容器个数 revisionHistoryLimit: 2 selector: # 标签选择器 matchLabels: app: qa-mock strategy: # 更新策略 rollingUpdate: maxSurge: 1 # 滚动更新时最多可以启动多少个pod maxUnavailable: 0 # 滚动更新时最大可以删除多少个pod type: RollingUpdate # 类型:滚动更新 template: # pod模板 metadata: # pod元数据 labels: app: qa-mock spec: # 资源规格 containers: # 容器配置 - args: # 启动命令的参数 - mock.py command: # 启动命令 - python image: 镜像地址:镜像tag # 镜像地址 imagePullPolicy: Always # 拉取策略:Always-总是拉取,IfNotPresent-优先本地,Never-只用本地 name: qa-mock resources: limits: memory: 1Gi terminationMessagePath: /dev/termination-log # 存放容器终止消息 terminationMessagePolicy: File dnsPolicy: ClusterFirst # dns策略:None-无策略,Default-和宿主机一致,ClusterFirst-集群dns优先,ClusterFirstWithHostNet-集群dns优先,并伴随着使用宿主机网络 imagePullSecrets: # 引用创建的secret,如果namespace下没有 secret, 出现失败 - name: aliyun restartPolicy: Always # 重启策略,默认Always-自动重启,OnFailure-退出码不为0时自动重启,Never-不重启 schedulerName: default-scheduler # 调度器 securityContext: { } terminationGracePeriodSeconds: 30 # 服务关掉老pod请求入口后,留30秒给之前的请求动作运行完,最后结束老pod
三、服务器通信
1、一个集群能有多个Node,Node是 k8s 中的一个工作机器,通常是一个虚拟机或者物理机;
同时 k8s master在集群之上自动调度pod,自动调度时要考虑到每个Node上的可用资源
2、一个Node能有多个Pod
3、一个Pod可以有多个Container,一般情况只有一个
4、集群内服务之间通过ClusterIP进行沟通
同一个pod内的多个Container共享相同资源及网路,通过local port number沟通
需求:A项目需要被B项目调用,且能被个人电脑访问;
创建NodePort类型的service也会自动生成ClusterIP,所以不需要再创建ClusterIP类型的service
创建NodePort类型的service和配置ingress即可满足需求,可以参考上面列出来的示例。
个人service示例
# service配置
apiVersion: v1 # api版本
kind: Service # 资源类型
metadata: # 资源元数据
labels:
app: node
name: qa-mock # 容器名称
namespace: ph-stg # 类别
spec: # 资源规格
externalTrafficPolicy: Cluster # 流量政策, Cluster-流量可以转发到其他节点上的pod,Local-流量只发给本机的pod
ports:
- port: 8080 # 提供给集群内部客户访问service的入口
protocol: TCP # 协议类型TCP和UDP,默认TCP
targetPort: 8080 # 本地的端口
selector: # 选择Label标签的Pod作为管理范围
app: qa-mock
sessionAffinity: None # 会话保持,None(随机调度) ClientIP(于同一个客户端的请求调度到同一个pod中)
type: NodePort # Service类型ClusterIP、NodePort 和LoadBalancer,默认ClusterIP
# 其他容器Shell访问示例: curl http://qa-mock:8080/你的服务地址
个人ingress示例
# ingress配置
apiVersion: traefik.containo.us/v1alpha1 # api版本
kind: IngressRoute # 资源类型
metadata: # 资源元数据
name: qa-mock
namespace: ph-stg
spec:
entryPoints: [ ]
routes:
- kind: Rule
match: Host(`stg-bigdata-qa-mock.oriente.com.ph`) && PathPrefix(`/`)
middlewares: [ ]
priority: 0 # 优先级
services:
- name: qa-mock
port: 8080
项目启动时的端口需要和service.yml、ingress.yml文件中的端口设置保持一致
一个只会点点点的测试,有疑问可以在测试群(群号:330405140)问我

浙公网安备 33010602011771号