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文件中的端口设置保持一致

 

posted @ 2021-01-04 17:48  whitewall  阅读(692)  评论(0)    收藏  举报