PaaS测试环境详解:引入K8S后的发展实践(二)

发表于:2021-9-15 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:侯枝影    来源:有赞技术

分享:
  三、操作步骤
  1、K8S 与 jenkins 集成
  K8S 与 jenkins 集成很简单,jenkins 已提供 K8S 的插件,安装即可。
  第一步:首先安装 kubernetes 插件,然后进入【系统管理】-> 【系统设置】,找到【云】,然后新增一个 kubernetes 的 【云】,填写你所搭建好的 kubernetes 集群地址和证书并保存。
  第二步:新建 jenkins job,选择【流水线】任务,进入配置页面,在【流水线】->【定义】选项中选择 【Pipeline script】,将以下这段脚本拷贝到本文框里。
podTemplate(label: 'mypod', cloud: 'kubernetes',containers: [  
    containerTemplate(
        name: 'jnlp', 
        image: 'www.harbor.com/yzcontainer/yz-centos-jnlp-slave:latest', 
        alwaysPullImage: true, 
        args: '${computer.jnlpmac} ${computer.name}',
        env:['name':'application_standard_env','value':'daily']
        ),

  ],
  volumes: [
    hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
]){
  node('mypod') {
    stage('test') {
      container('jnlp') {
          sh """

          """
      }
    }
  }    
}

  以上脚本中有几个地方需要变更:
  cloud 值必须与【系统管理】->【系统设置】->【云】中 kubernetes Name 一致;
  image 值为基础镜像,需要定制化,比如应用运行的操作系统、编译打包运行依赖的软件等等;
  sh 编写我们需要执行的命令,比如 clone 代码、编译、打包、打镜像、push 镜像到公司仓库等。

  2、创建 Namespace
  Kubernetes 可以使用 Namespaces(命名空间)创建多个虚拟集群,用来做资源隔离,比如环境、产品之间可以用 Namespace 进行隔离,利于管理,也不会相互干扰,也可以不指定,默认是在 default 下面。
  有两种创建 Namespace 的方法,二选一即可。

  1.命令行直接创建
kubectl create namespace namespace名称 //namespace 可以简写成 ns

  2.通过文件创建
  定义 my-namespace.yaml 文件
apiVersion: v1  
kind: Namespace  
metadata:  
  name: namespace名称 

  命令行创建
kubectl create -f ./my-namespace.yaml

  创建成功后可以通过 kubectl get ns 命令查看所有 Namespace。

  3、创建 Deployment
  Deployment 为 Pod 和 Replica Set 提供声明式更新,你只需要在 Deployment 中描述你想要的目标状态是什么,Deployment controller 就会帮你将 Pod 的实际状态改变到你的目标状态。你可以定义一个全新的 Deployment 来创建 Pod 或者删除已有的 Deployment 并创建一个新的来替换。

  1.定义 Deployment yaml 文件
apiVersion: extensions/v1beta1  
kind: Deployment  
metadata:  
  labels:
    run: //自定义标签名称
  name: //deploy名称,推荐跟应用名一致
  namespace: //deploy所属的命名空间
spec:  
  progressDeadlineSeconds: 600
  replicas: 1 //通过增加副本数来弹缩应用,有多少个副本数就有多少个pod
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      run: //自定义标签名称
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: //自定义标签名称
    spec:
      containers:
      - image: //容器的镜像名称
        imagePullPolicy: Always
        name://容器名称,推荐跟应用名一致
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

  其中 spec.selector.matchLabels 与 spec.template.metadata.labels 必须一致,selector 负责调度 label 名称一样的资源,template 为即将新建的 Pod 附加 label,然后通过 selector 字段来指定这个 RC 管理哪些Pod。

  2.创建 Deployment
kubectl create/apply -f xxx.yaml  

  其中 create 和 apply 都可以用来做创建,两者的区别在于 create 不能重复执行,apply 可以。
  返回 deployment.extensions xxxx created,说明创建成功,如果返回错误信息,根据错误信息排查错误,仔细检查 yaml 文件的格式和参数。

  3.查看应用状态
  Pod 是 Kubernetes 创建或部署的最小/最简单的基本单位,一个 Pod 代表集群上正在运行的一个进程,一个 Pod 封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络 IP 以及管理控制容器运行方式的策略选项。Pod 代表部署的一个单位:Kubernetes 中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。
  Deployment 创建成功后,通过以下命令查看应用部署情况。
$ kubectl get pod -n [namepsace] -o wide
NAME                               READY     STATUS    RESTARTS   AGE       IP              NODE  
301mock-6cf74454f7-794l2           1/1       Running   0          5s       x.x.x.x   x.x.x.x  

  如果 STATUS 为 Running 状态,说明服务启动成功,如果 STATUS 为 ERROR 或 CrashLoopBackOff 状态,说明应用部署失败,通过 kubectl logs -f [pod name] -n [namepsace] 查看日志定位失败原因。
  应用部署成功后,可以通过 kubectl exec -it [pode name] bash -n [namespace] 进入容器内部,其他操作同 linux 下。
  如果更新镜像(tag 没变),只需删除之前 Pod,如 kubectl delete pod [pod name] -n [namespace],Kube-controller-manager 会重新创建 Pod 使集群状态符合 deployment 中定义的预期状态。

  4、创建 Service
  当 Pod 在创建和销毁的过程中,IP 可能会发生变化,而这就容易造成对其有依赖的服务异常,所以通常情况下,我们都会使用 Service 将后端 Pod 暴露出来,而 Service 则较为稳定。
  Service 的创建有两种方式,单个端口推荐第一种,多个端口推荐第二种。

  1.通过命令行直接创建
kubectl expose deploy/etcd --port=2379 --target-port=2379 --name=etcd --type=NodePort -n [namespace]  

  2.通过文件创建
  定义 my-service.yaml 文件:
kind: Service  
apiVersion: v1  
metadata:  
  name: my-service
  namespace: 
spec:  
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 2379
      targetPort: 2379
  type: NodePort

  命令行创建:
kubectl create -f my-service.yaml  

  创建好以后可以通过 kubectl get svc -n [namespace] 命令查看。
kubectl get svc -n [namespace]  
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE       SELECTOR  
etcd      NodePort   10.99.127.115   <none>        2379:31422/TCP   4d        run=etcd  

  现在我们就可以通过 CLUSTER-IP:2379 访问集群内部服务了。
  默认情况下,Pod 端口只能 kubernetes 集群内部访问,如果通过外部网络访问 Kubernetes 集群内部的应用,需要将应用通过 NodePort 方式暴露出去,在上面的式例中,type 就使用了 NodePort 类型,然后可以在集群外通过 NODE-IP:31422 访问。type 有四种类型,如需进一步了解,请 Google
  这部分我们讲解了基本而必要的操作步骤将一个应用部署到 Kubernetes 集群中,并且可以通过外部网络访问 K8S 集群内部的应用,下面分享一些我们在测试过程中为了满足特定需求而使用的一些高级用法。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号