专业的编程技术博客社区

网站首页 > 博客文章 正文

K8s+Jenkins+Harbor+Gitlab+Pipeline+Rust 持续集成(三)

baijin 2025-05-11 14:03:55 博客文章 6 ℃ 0 评论

2.6. Kubernetes介绍和使用

环境:
172.16.213.49 k8s-dev-master-1
172.16.213.59 k8s-dev-worker-1
172.16.213.57 k8s-dev-worker-2

2.6.1 k8s的基础单元Pod

2.6.1.1 pod特性

  • pod是k8s 中最小的部署单元
  • 一组容器的集合
  • 拥有生命周期(导致ip地址不固定)
  • 同一个pod中 共享存储、网络(网络协议栈 ip/mac/port,实现原理是 pod ip都绑定到一个叫infrastructure container的基础容器-pause, 实现应用程序网络共享)、命名空间

2.6.2 控制器Deployment

k8s中有很多控制器,通过控制器来创建pod,其中最常用的就是Deployment,简写deploy。
常用Pod控制器:

  • Deployment (无状态应用)
  • StatefuleSet(有状态应用)
  • DaemonSet (保证每个节点只运行一份Pod 场景:glusterd/ceph/fluentd/logstash)kube-proxy
  • ReplicaSet (副本)
  • Job(跑批,一次性的任务)
  • CronJob(加强版Job,定期运行,或者周期性运行)

针对本次的应用对应的deployment.yaml如下:

adxcreativeauditservice-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: adxcreativeauditservice-deployment
  namespace: default
  labels:
    app: adxcreativeauditservice
spec:
  replicas: 2
  selector:
    matchLabels:
      app: adxcreativeauditservice
  template:
    metadata:
      labels:
        app: adxcreativeauditservice
    spec:
      containers:
      - name: adxcreativeauditservice
        image: reg.toutiao.com/hyhub/adxcreativeauditservice-rust:${branch}

2.6.3 service

2.6.3.1 service 与pod

由于pod的生命周期,当节点故障时,pod重新被创建后,ip会变化.service作用应运而生。
service 基于“标签选择器(key-value)”从集群中选择出一组pod对象,为这组pod对象提供固定IP地址。
原理:service与pod之间网络链接是kue-proxy通过在当前节点添加iptables DNAT
规则或ipvs规则,实现将流量调度给service根据标签选择器选出的pod对象。

2.6.3.2 service 与 coredns

k8s 通过core-dns为每个svc对象提供唯一的dns名称表示一级响应的dns资源记录,遵循标准:
svc.namespace.svc.cluster-domain格式。需要配置resolv.conf,增加cores svc的地址作为nameserver。

[root@k8s-dev-master-1 ~]# kubectl get svc
NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                          AGE
adxcreativeauditservice   NodePort    10.244.100.228   <none>        8080:30633/TCP                   4d
jenkins                   NodePort    10.244.65.157    <none>        8080:31197/TCP,50000:31506/TCP   3d22h
kubernetes                ClusterIP   10.244.64.1      <none>        443/TCP                          5d23h

CLUSTER-IP: 虚拟ip(Host Only),不可ping;
PORT: 前面是自己的端口,后端是node分配的随机端口;

踩坑1:
老版本k8s 使用kube-dns中出现一个问题就是 pod中无法解析域名,上面内部域名可以解析,所有外部域名都无法解析,后来发现都是转发给了core-dns 做内部解析了。原因为kube-dns Pod的 dnspolicy 为Default,而Default 默认pod会继承当前节点的resolv.con(ubuntu 18.04
/run/systemd/resolve/resolv.conf)f,解决办法 kubelet --resolv-conf 指定配置文件即可

curl  jenkins.default.svc.cluster.local:8080

命令行创建service

kubectl create svc nodeport demo --tcp=80 
#--tcp=<port>[:targetPort], 不指定targetPort默认容器端口与Service端口相同

Service 对象yaml模板

kind: Service
apiVersion: v1
metadata:
  name: demoapp-svc
  namespace: dev 
spec:
  selector:
    app: demoapp 
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80

adxcreativeauditservice-service.yaml

kind: Service
apiVersion: v1
metadata:
  name: adxcreativeauditservice-svc
  labels:
    app: adxcreativeauditservice
spec:
  type: NodePort
  selector:
    app: adxcreativeauditservice
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 18989
    nodePort: 32223

2.6.4 扩容、缩容

kubectl scale --replicas=3 -f adxcreativeauditservice-deployment.yaml          

2.6.5 k8s 命令行

2.6.5.1 k8s 语法格式

kubectl [command] [TYPE] [NAME] [flags]
- COMMAND: 对资源操作的子命令,例如:get/create/delete/run
- TYPE: 要操作资源的类型,例如:pods/services;大小写敏感,支持使用单复数、简写;
- NAME: 要操作资源的对象名称,大小写敏感;不写默认当前名称空间所有对象;可通过TYPE/NAME格式 指定多个
- flags:命令行选线,比如-s 或者--server等; get等命令可以使用-o yaml|json|wide


2.6.5.2 常用操作

#创建、查看
kubectl create/apply -f xxx.yaml
kubectl get pods/svc -n namespace -o wide|json|yaml
kubectl get pods/svc  -l k8s-app=kube-dns -n namespace -o wide|json|yaml
kubectl describe pods/svc/deploy -n namespace
kubectrl delete deploy、svc/xxx # 删除deployment 、service

#复制
kubectl copy namespace/containerid:/container dir/filename /xx/xx

#链接容器
kubectl exec -it containerid -n namespace /bin/bash
#在容器中执行命令
kubectl exec adxcreativeauditservice-deployment-7f5c9b9958-278nq  -- ip addr

#log
kubectl logs -f podname、svc/svcname

# 更新资源
kubectl edit deploy/xxx_app

# 使用补丁修改、更新某个资源的字段
kubectl patch node/dev-k8s-worker-1 -p '{"spec":{"unschedulable":true}}'

#暂停
kubectl rollout pause deploy/xxx_app
kubectl rollout resume deploy/xxx_app

#回滚
#查看历史
kubectl rollout history deploy/xxx_app
#回滚
kubectl rollout  undo deploy/xxx_app --to-revision=<version_index>

#集群管理
#设置不可调度
kubectl cordon dev-k8s-worker-1
#驱逐节点pods
kubectl drain --force --ignore-daemonsets dev-k8s-worker-1
#恢复调度
kubectl uncordon dev-k8s-worker-1

#查看k8s 支持的完整资源列表
kubectl api-resources
#k8s支持的api版本
kubectl api-versions

# 查看每种对象可嵌套使用的字段、数据类型级功能描述(支持三级字段获取)
kubectl explain deploy
kubectl explain deploy.metadata

kubectl get deploy demo -o yaml --export > deploy.yaml

2.6.6 k8s 存储卷

存储全分临时存储(emptyDir)、hostPath、网络存储,这里主直接说常用的几个网络存储

2.6.6.1 网络存储券 NFS

apiVersion: v1
kind: Pod
metadata:
  name: volumes-nfs-demo
  labels:
    app: redis
spec:
  containers:
  - name: redis
    image: redis:alpine
    ports:
    - containerPort: 6379
      name: redisport
    securityContext:
      runAsUser: 888
    volumeMounts:
    - mountPath: /data
      name: redisdata
  volumes:
    - name: redisdata
      nfs: 
        server: 172.16.213.23
        path: /data/jenkins_k8s
        readOnly: false

2.6.6.2 网络存储券 GlusterFS

环境:
1.glusterFS创建一个能满足Pod资源数据存储需要的卷
2.k8s 各节点需要安装GlusterFS客户端(glusterfs/glusterfs-fuse)

apiVersion: v1
kind: Pod
metadata:
  name: volumes-glusterfs-demo
  labels:
    app: redis
spec:
  containers:
  - name: redis
    image: redis:alpine
    ports:
    - containerPort: 6379
      name: redisport
    volumeMounts:
    - mountPath: /data
      name: redisdata
  volumes:
    - name: redisdata
      glusterfs: 
        endpoints: glusterfs-endpoints
        path: kube-redis
        readOnly: false

这里需要用到endpoints资源,所以glusterfs-endpoints需要手动创建一个Endpoints

apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs-endpoints
subsets:
 - addresses:
   - ip: gf01.gluster
   ports:
    - port: 24007
      name: glusterd 
 - addresses:
   - ip: gf02.gluster
   ports:
    - port: 24007
      name: glusterd 
 - addresses:
   - ip: gf03.gluster
   ports:
    - port: 24007
      name: glusterd 


完成了docker、jenkins、harbor、k8s 相关配置后,可以配置go/grpc

来测试访问jenkins部署的项目

3. jenkins 构建,联调,访问

安装go/grpc

$ cd /usr/local/go/k8s-adxcreativeauditservice-rust
$ grpcurl -import-path ./proto -proto template.proto -plaintext -d '{"adxMediaName": "mgtv", "adxAdpId": "200042"}'  10.244.100.228:8080 templates.AdxAdpManagerService/getAdxAdpInfo

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表