10.k8s中水平和垂直伸缩-Jenkins

存储卷之Projected【扩展】

1. Projected卷概述

Projected Volume是一种特殊的卷类型,它能够将已存在的多个卷投射进同一个挂载点目录中。

Projected Volume仅支持对如下四种类型的卷(数据源)进行投射操作,这类的卷一般都是用于为容器提供预先定义好的数据:

  • Secret: 投射Secret对象。
  • ConfigMap: 投射ConfigMap对象。
  • DownwardAPI: 投射Pod元数据。
  • ServiceAccountToken: 投射ServiceAccount Token。

2. 实战案例:这是一种很常见的将配置信息、密钥等注入到容器内部的方式

2.1 创建资源清单

yaml 复制代码
[root@master231 volumes]# cat 08-deploy-projected-volumes.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: yinzhengjie-cm
data:
  blog: "https://www.cnblogs.com/yinzhengjie"
  k8s: "https://space.bilibili.com/600805398/channel/series"

---

apiVersion: v1
kind: Secret
metadata:
  name: yinzhengjie-secrets
stringData:
  username: admin
  password: yinzhengjie

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: projected-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: v1
  template:
    metadata:
      labels:
        apps: v1
    spec:
      volumes:
      - name: data01
        # 定义存储卷类型,该存储卷可以封装多个存储卷类型
        projected:
          sources:
          - downwardAPI:
              items:
              - path: containers-limists-memory
                resourceFieldRef:
                  containerName: c1
                  resource: "limits.memory"
          - configMap:
              name: yinzhengjie-cm  #会注入前面定义的data
          - secret:
              name: yinzhengjie-secrets  #会注入前面定义的username和password
          - serviceAccountToken:
              path: yinzhengjie-token  #作用:自动生成ServiceAccount的JWT token,并写入指定文件
      containers:
      - name: c1
        image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
        resources:
          limits:
            cpu: 0.5
            memory: 500Mi
        volumeMounts:
        - name: data01
          mountPath: /yinzhengjie-xixi

2.2 部署资源

bash 复制代码
[root@master231 volumes]# kubectl apply -f 08-deploy-projected-volumes.yaml
configmap/yinzhengjie-cm created
secret/yinzhengjie-secrets created
deployment.apps/projected-demo created

[root@master231 volumes]# kubectl get pods -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
projected-demo-6b7b48f98d-dwcpt   1/1     Running   0          3s    10.100.2.32   worker233   <none>           <none>

2.3 验证挂载结果

bash 复制代码
[root@master231 volumes]# kubectl exec -it projected-demo-6b7b48f98d-dwcpt -- sh
/ # ls -l /yinzhengjie-xixi/
total 0
lrwxrwxrwx    1 root     root            11 Sep 29 01:11 blog -> ..data/blog
lrwxrwxrwx    1 root     root            32 Sep 29 01:11 containers-limists-memory -> ..data/containers-limists-memory
lrwxrwxrwx    1 root     root            10 Sep 29 01:11 k8s -> ..data/k8s
lrwxrwxrwx    1 root     root            15 Sep 29 01:11 password -> ..data/password
lrwxrwxrwx    1 root     root            15 Sep 29 01:11 username -> ..data/username
lrwxrwxrwx    1 root     root            24 Sep 29 01:11 yinzhengjie-token -> ..data/yinzhengjie-token

3. 验证官网的挂载信息

bash 复制代码
[root@master231 volumes]# kubectl describe pod projected-demo-6b7b48f98d-dwcpt
Name:         projected-demo-6b7b48f98d-dwcpt
...
Containers:
  c1:
    Container ID:   docker://082615e684ad9e099f6d5e686a39b56c955cfa7bc411a2298860edc848e66f32
    ...
    Limits:
      cpu:     500m
      memory:  500Mi
    Requests:
      cpu:        500m
      memory:     500Mi
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-97pzk (ro)
      /yinzhengjie-xixi from data01 (rw)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  data01:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    DownwardAPI:             true
    ConfigMapName:           yinzhengjie-cm
    ConfigMapOptional:       <nil>
    SecretName:              yinzhengjie-secrets
    SecretOptionalName:      <nil>
    TokenExpirationSeconds:  3600
  kube-api-access-97pzk:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
bash 复制代码
[root@master231 volumes]# kubectl get pod projected-demo-6b7b48f98d-dwcpt -o yaml
apiVersion: v1
kind: Pod
...
spec:
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
    ...
    volumeMounts:
    - mountPath: /yinzhengjie-xixi
      name: data01
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-97pzk
      readOnly: true
  ...
  volumes:
  - name: data01
    projected:
      defaultMode: 420
      sources:
      - downwardAPI:
          items:
          - path: containers-limists-memory
            resourceFieldRef:
              containerName: c1
              divisor: "0"
              resource: limits.memory
      - configMap:
          name: yinzhengjie-cm
      - secret:
          name: yinzhengjie-secrets
      - serviceAccountToken:
          expirationSeconds: 3600
          path: yinzhengjie-token
  - name: kube-api-access-97pzk
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
bash 复制代码
[root@master231 volumes]# kubectl exec -it projected-demo-6b7b48f98d-dwcpt -- sh
/ # ls -l /var/run/secrets/kubernetes.io/serviceaccount
total 0
lrwxrwxrwx    1 root     root            13 Sep 29 01:11 ca.crt -> ..data/ca.crt
lrwxrwxrwx    1 root     root            16 Sep 29 01:11 namespace -> ..data/namespace
lrwxrwxrwx    1 root     root            12 Sep 29 01:11 token -> ..data/token

metrics-server环境部署

1. 什么是metrics-server

metrics-server为K8S集群的"kubectl top"命令提供数据监控,也提供了"HPA(Horizontal Pod Autoscaler)"的使用。

metrics-server还可以为Dashboard组件提供监控指标。

bash 复制代码
[root@master231 ~]# kubectl top pods
error: Metrics API not available

彩蛋:hpa和vpa的区别?

  • hpa(水平扩容):

    • 特点:增加机器数量,不提高单个节点的硬件配置,增加同类型机器数量,需要增加负载均衡器作为同一访问入口
    • 表示Pod数量资源不足时,可以自动增加Pod副本数量,以抵抗流量过多的情况,降低服务的总体负载。
  • vpa(垂直扩容):

    • 特点:不增加机器数量。只升高硬件配置,但是物理机有资源上限
    • 表示可以动态调整容器的资源上限,比如一个Pod一开始是200Mi内存,如果资源达到定义的阈值,就可以扩展内存,但不会增加pod副本数量。

典型的区别在于vpa具有一定的资源上限问题,因为pod是K8S集群调度的最小单元,不可拆分,因此这个将来扩容时,取决于单节点的资源上限。

部署文档: https://github.com/kubernetes-sigs/metrics-server

彩蛋: metrics-server组件本质上是从kubelet组件获取监控数据

bash 复制代码
[root@master231 pki]# pwd
/etc/kubernetes/pki

[root@master231 pki]# ll apiserver-kubelet-client.*
-rw-r--r-- 1 root root 1164 Apr  7 11:00 apiserver-kubelet-client.crt
-rw------- 1 root root 1679 Apr  7 11:00 apiserver-kubelet-client.key

# 有很多指标,metric-server可以把这些指标处理
[root@master231 pki]# curl -s -k --key apiserver-kubelet-client.key --cert apiserver-kubelet-client.crt https://10.0.0.231:10250/metrics/resource | wc -l
102

[root@master231 pki]# curl -s -k --key apiserver-kubelet-client.key --cert apiserver-kubelet-client.crt https://10.0.0.232:10250/metrics/resource | wc -l
67

[root@master231 pki]# curl -s -k --key apiserver-kubelet-client.key --cert apiserver-kubelet-client.crt https://10.0.0.233:10250/metrics/resource | wc -l
57

2. 部署metrics-server组件

2.1 下载资源清单

bash 复制代码
[root@master231 ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml

# SVIP:
[root@master231 ~]# wget http://192.168.16.253/Resources/Kubernetes/Add-ons/metrics-server/0.6.x/high-availability-1.21%2B.yaml

2.2 编辑配置文件

bash 复制代码
[root@master231 ~]# vim high-availability-1.21+.yaml
...
114 apiVersion: apps/v1
115 kind: Deployment
116 metadata:
...
144       - args:
145         - --kubelet-insecure-tls  # 不要验证Kubelets提供的服务证书的CA。不配置则会报错x509。
            ...
...         image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.2
# 我使用的是0.6.3

2.3 部署metrics-server组件

bash 复制代码
[root@master231 ~]# kubectl apply -f high-availability-1.21+.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
poddisruptionbudget.policy/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

镜像下载地址 :

http://192.168.16.253/Resources/Kubernetes/Add-ons/metrics-server/0.7.2/

2.4 查看镜像是否部署成功

bash 复制代码
[root@master231 metrics-server]# kubectl get pods,svc -n kube-system -l k8s-app=metrics-server -o wide
NAME                                  READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pod/metrics-server-57c6f647bb-727dz   1/1     Running   0          3m56s   10.100.203.130   worker232   <none>           <none>
pod/metrics-server-57c6f647bb-bm6tb   1/1     Running   0          3m56s   10.100.140.120   worker233   <none>           <none>

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/metrics-server   ClusterIP   10.200.10.142   <none>        443/TCP   3m56s   k8s-app=metrics-server

[root@master231 metrics-server]# kubectl -n kube-system describe svc metrics-server
Name:              metrics-server
Namespace:         kube-system
Labels:            k8s-app=metrics-server
Annotations:       <none>
Selector:          k8s-app=metrics-server
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.200.10.142
IPs:               10.200.10.142
Port:              https  443/TCP
TargetPort:        https/TCP
Endpoints:         10.100.140.120:10250,10.100.203.130:10250
Session Affinity:  None
Events:            <none>

2.5 验证metrics组件是否正常工作

bash 复制代码
[root@master231 metrics-server]# kubectl top pod
NAME                              CPU(cores)   MEMORY(bytes)
projected-demo-6b7b48f98d-dwcpt   0m           2Mi

[root@master231 metrics-server]# kubectl top node
NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master231   64m          3%     1514Mi          40%
worker232   28m          1%     926Mi           24%
worker233   31m          1%     968Mi           25%

[root@master231 metrics-server]# kubectl top pod -A  # 即可查看到cpu使用情况,和内存使用的情况
NAMESPACE              NAME                                        CPU(cores)   MEMORY(bytes)
default                projected-demo-6b7b48f98d-dwcpt             0m           2Mi
kube-flannel           kube-flannel-ds-9mbzn                       5m           12Mi
kube-flannel           kube-flannel-ds-l55tn                       4m           13Mi
kube-flannel           kube-flannel-ds-tgmpc                       5m           12Mi
kube-system            coredns-6d8c4cb4d-s85bq                     1m           11Mi
kube-system            coredns-6d8c4cb4d-tdrnj                     1m           11Mi
kube-system            etcd-master231                              11m          91Mi
kube-system            kube-apiserver-master231                    37m          200Mi
kube-system            kube-controller-manager-master231           9m           47Mi
kube-system            kube-proxy-55jhz                            3m           17Mi
kube-system            kube-proxy-7ffbs                            11m          18Mi
kube-system            kube-proxy-xgqln                            6m           18Mi
kube-system            kube-scheduler-master231                    2m           16Mi
kube-system            metrics-server-57c6f647bb-2vmkk             5m           15Mi
kubernetes-dashboard   dashboard-metrics-scraper-9d986c98c-2pbw4   1m           3Mi
kubernetes-dashboard   kubernetes-dashboard-5ccf77bb87-jfzwp       2m           10Mi
metallb-system         controller-644c958987-9xbtc                 1m           14Mi
metallb-system         speaker-hfb5k                               3m           16Mi
metallb-system         speaker-p27z5                               3m           16Mi
metallb-system         speaker-vtxk8                               3m           16Mi

水平Pod伸缩hpa实战

1. 什么是hpa

hpa是k8s集群内置的资源,全称为"HorizontalPodAutoscaler"。

可以自动实现Pod水平伸缩,说白了,在业务高峰期可以自动扩容Pod副本数量,在集群的低谷期,可以自动缩容Pod副本数量。

2. hpa实战

2.1 导入镜像(232和233都要)

bash 复制代码
[root@worker233 ~]# wget http://192.168.16.253/Resources/Kubernetes/Add-ons/metrics-server/oldboyedu-linux-tools-v0.1-stress.tar.gz
[root@worker233 ~]# docker load -i oldboyedu-linux-tools-v0.1-stress.tar.gz

2.2 创建Pod

yaml 复制代码
[root@master231 horizontalpodautoscalers]# cat 01-deploy-hpa.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-stress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: stress
  template:
    metadata:
      labels:
        app: stress
    spec:
      containers:
      - image: jasonyin2020/oldboyedu-linux-tools:v0.1
        name: oldboyedu-linux-tools
        args:
        - tail
        - -f
        - /etc/hosts
        resources:
          requests:
            cpu: 0.2
            memory: 300Mi
          limits:
            cpu: 0.5
            memory: 500Mi

---

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: stress-hpa
spec:
  # 最大的Pod副本数量
  maxReplicas: 5
  # 最小的Pod副本数据
  minReplicas: 2
  # 关联资源对象,对哪个资源对象进行HPA
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: deploy-stress
  # 基于CPU的资源限制
  targetCPUUtilizationPercentage: 95
bash 复制代码
[root@master231 horizontalpodautoscalers]# kubectl apply -f 01-deploy-hpa.yaml
deployment.apps/deploy-stress created
horizontalpodautoscaler.autoscaling/stress-hpa created

彩蛋:(响应式创建hpa)

bash 复制代码
[root@master231 horizontalpodautoscalers]# kubectl autoscale deploy deploy-stress --min=2 --max=5 --cpu-percent=95 -o yaml --dry-run=client

2.3 测试验证

bash 复制代码
# kubectl get hpa -w 动态查看副本,cpu,pod数量
[root@master231 horizontalpodautoscalers]# kubectl get deploy,hpa,po -o wide  # 第一次查看发现Pod副本数量只有1个
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS              IMAGES                                                                  SELECTOR
deployment.apps/deploy-stress   1/1     1            1           11s   oldboyedu-linux-tools   harbor250.oldboyedu.com/oldboyedu-casedemo/oldboyedu-linux-tools:v0.1   app=stress

NAME                                             REFERENCE                  TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/stress-hpa   Deployment/deploy-stress   <unknown>/95%   2         5         0          11s

NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod/deploy-stress-5d7c796c97-rzgsm   1/1     Running   0          11s   10.100.140.121   worker233   <none>           <none>

[root@master231 horizontalpodautoscalers]# kubectl get deploy,hpa,po -o wide  # 第N次查看发现Pod副本数量只有2个
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS              IMAGES                                                                  SELECTOR
deployment.apps/deploy-stress   2/2     2            2           51s   oldboyedu-linux-tools   harbor250.oldboyedu.com/oldboyedu-casedemo/oldboyedu-linux-tools:v0.1   app=stress

NAME                                             REFERENCE                  TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/stress-hpa   Deployment/deploy-stress   0%/95%    2         5         2          51s

NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod/deploy-stress-5d7c796c97-f9rff   1/1     Running   0          36s   10.100.203.150   worker232   <none>           <none>
pod/deploy-stress-5d7c796c97-rzgsm   1/1     Running   0          51s   10.100.140.121   worker233   <none>           <none>

2.4 压力测试

bash 复制代码
[root@master231 ~]# kubectl exec deploy-stress-5d7c796c97-f9rff -- stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10m
stress: info: [7] dispatching hogs: 8 cpu, 4 io, 2 vm, 0 hdd

2.5 查看Pod副本数量

bash 复制代码
[root@master231 horizontalpodautoscalers]# kubectl get deploy,hpa,po -o wide
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS              IMAGES                                                                  SELECTOR
deployment.apps/deploy-stress   3/3     3            3           4m3s   oldboyedu-linux-tools   harbor250.oldboyedu.com/oldboyedu-casedemo/oldboyedu-linux-tools:v0.1   app=stress

NAME                                             REFERENCE                  TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/stress-hpa   Deployment/deploy-stress   105%/95%   2         5         2          4m3s

NAME                                 READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pod/deploy-stress-5d7c796c97-f9rff   1/1     Running   0          3m48s   10.100.203.150   worker232   <none>           <none>
pod/deploy-stress-5d7c796c97-rzgsm   1/1     Running   0          4m3s    10.100.140.121   worker233   <none>           <none>
pod/deploy-stress-5d7c796c97-zxgp6   1/1     Running   0          3s      10.100.140.122   worker233   <none>           <none>

2.6 再次压测

bash 复制代码
[root@master231 ~]# kubectl exec deploy-stress-5d7c796c97-rzgsm -- stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10m
stress: info: [6] dispatching hogs: 8 cpu, 4 io, 2 vm, 0 hdd

[root@master231 ~]# kubectl exec deploy-stress-5d7c796c97-zxgp6 -- stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10m
stress: info: [7] dispatching hogs: 8 cpu, 4 io, 2 vm, 0 hdd

2.7 发现最多有5个Pod创建

bash 复制代码
[root@master231 horizontalpodautoscalers]# kubectl get deploy,hpa,po -o wide
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS              IMAGES                                                                  SELECTOR
deployment.apps/deploy-stress   5/5     5            5           5m50s   oldboyedu-linux-tools   harbor250.oldboyedu.com/oldboyedu-casedemo/oldboyedu-linux-tools:v0.1   app=stress

NAME                                             REFERENCE                  TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/stress-hpa   Deployment/deploy-stress   249%/95%   2         5         5          5m50s

NAME                                 READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pod/deploy-stress-5d7c796c97-dnlzj   1/1     Running   0          34s     10.100.203.180   worker232   <none>           <none>
pod/deploy-stress-5d7c796c97-f9rff   1/1     Running   0          5m35s   10.100.203.150   worker232   <none>           <none>
pod/deploy-stress-5d7c796c97-ld8s9   1/1     Running   0          19s     10.100.140.123   worker233   <none>           <none>
pod/deploy-stress-5d7c796c97-rzgsm   1/1     Running   0          5m50s   10.100.140.121   worker233   <none>           <none>
pod/deploy-stress-5d7c796c97-zxgp6   1/1     Running   0          110s    10.100.140.122   worker233   <none>           <none>

2.8 取消压测后

需要等待5min左右会自动缩容Pod数量到2个。

bash 复制代码
[root@master231 horizontalpodautoscalers]# kubectl get deploy,hpa,po -o wide
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS              IMAGES                                                                  SELECTOR
deployment.apps/deploy-stress   2/2     2            2           20m   oldboyedu-linux-tools   harbor250.oldboyedu.com/oldboyedu-casedemo/oldboyedu-linux-tools:v0.1   app=stress

NAME                                             REFERENCE                  TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/stress-hpa   Deployment/deploy-stress   0%/95%    2         5         5          20m

NAME                                 READY   STATUS        RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod/deploy-stress-5d7c796c97-dnlzj   1/1     Running       0          15m   10.100.203.180   worker232   <none>           <none>
pod/deploy-stress-5d7c796c97-f9rff   1/1     Running       0          20m   10.100.203.150   worker232   <none>           <none>
pod/deploy-stress-5d7c796c97-ld8s9   1/1     Terminating   0          14m   10.100.140.123   worker233   <none>           <none>
pod/deploy-stress-5d7c796c97-rzgsm   1/1     Terminating   0          20m   10.100.140.121   worker233   <none>           <none>
pod/deploy-stress-5d7c796c97-zxgp6   1/1     Terminating   0          16m   10.100.140.122   worker233   <none>           <none>

[root@master231 horizontalpodautoscalers]# kubectl get deploy,hpa,po -o wide
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS              IMAGES                                                                  SELECTOR
deployment.apps/deploy-stress   2/2     2            2           21m   oldboyedu-linux-tools   harbor250.oldboyedu.com/oldboyedu-casedemo/oldboyedu-linux-tools:v0.1   app=stress

NAME                                             REFERENCE                  TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/stress-hpa   Deployment/deploy-stress   0%/95%    2         5         2          21m

NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod/deploy-stress-5d7c796c97-dnlzj   1/1     Running   0          16m   10.100.203.180   worker232   <none>           <none>
pod/deploy-stress-5d7c796c97-f9rff   1/1     Running   0          21m   10.100.203.150   worker232   <none>           <none>

2.9 由于metric-server每间隔15s采集一次数据,因此观察到hpa的数量效果如下

bash 复制代码
[root@master231 pki]# kubectl get hpa -w
NAME         REFERENCE                  TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
stress-hpa   Deployment/deploy-stress   <unknown>/95%   2         5         0          10s
stress-hpa   Deployment/deploy-stress   <unknown>/95%   2         5         1          15s
stress-hpa   Deployment/deploy-stress   <unknown>/95%   2         5         2          30s
stress-hpa   Deployment/deploy-stress   <unknown>/95%   2         5         2          45s
stress-hpa   Deployment/deploy-stress   0%/95%          2         5         2          60s
stress-hpa   Deployment/deploy-stress   0%/95%          2         5         2          75s
stress-hpa   Deployment/deploy-stress   21%/95%         2         5         2          3m30s
stress-hpa   Deployment/deploy-stress   125%/95%        2         5         2          3m45s
stress-hpa   Deployment/deploy-stress   125%/95%        2         5         3          4m
stress-hpa   Deployment/deploy-stress   125%/95%        2         5         3          4m15s
stress-hpa   Deployment/deploy-stress   83%/95%         2         5         3          4m31s
stress-hpa   Deployment/deploy-stress   91%/95%         2         5         3          5m16s
stress-hpa   Deployment/deploy-stress   167%/95%        2         5         3          5m31s
stress-hpa   Deployment/deploy-stress   167%/95%        2         5         5          5m46s
stress-hpa   Deployment/deploy-stress   148%/95%        2         5         5          6m16s
stress-hpa   Deployment/deploy-stress   150%/95%        2         5         5          6m31s
stress-hpa   Deployment/deploy-stress   150%/95%        2         5         5          7m16s
stress-hpa   Deployment/deploy-stress   150%/95%        2         5         5          7m31s
stress-hpa   Deployment/deploy-stress   150%/95%        2         5         5          7m46s
stress-hpa   Deployment/deploy-stress   150%/95%        2         5         5          8m1s
stress-hpa   Deployment/deploy-stress   118%/95%        2         5         5          8m31s
stress-hpa   Deployment/deploy-stress   0%/95%          2         5         5          8m46s
stress-hpa   Deployment/deploy-stress   0%/95%          2         5         5          13m
stress-hpa   Deployment/deploy-stress   0%/95%          2         5         2          13m

水平伸缩基于内存的HPA实战案例

1. tmpfs概述

tmpfs是一个临时文件系统,驻留在内存中,所以/dev/shm这个目录不在硬盘上,而是在内存里,断电后数据会丢失。

因为在内存里,所以读写速度非常快,可以提供较高的速度,在Linux系统下,tmpfs默认最大为内存的一般大小。

了解tmpfs这个特性可以用来提供服务器性能,把一些读写性能要求较高,但是数据又可以丢失的这样的数据保存在/dev/shm设备中来提供访问速度。

接下来,我们使用dd命令产生数据写入tmpfs文件系统测试案例:

1.1 在tmp目录下创建100M类型的tmpfs文件系统

bash 复制代码
[root@master241 ~]# mkdir /tmp/yinzhengjie
[root@master241 ~]# mount -t tmpfs -o size=100M tmpfs /tmp/yinzhengjie/   # 挂载了100M
[root@master241 ~]# df -h | grep yinzhengjie
tmpfs                              100M     0  100M   0% /tmp/yinzhengjie

1.2 使用dd命令产生写入200M数据无法写入成功,因为只有100M内存

bash 复制代码
[root@master241 ~]# dd if=/dev/zero of=/tmp/yinzhengjie/bigfile.log bs=1M count=200
dd: error writing '/tmp/yinzhengjie/bigfile.log': No space left on device
101+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.0775754 s, 1.4 GB/s

[root@master241 ~]# ll -h /tmp/yinzhengjie/bigfile.log
-rw-r--r-- 1 root root 100M Sep 24 14:52 /tmp/yinzhengjie/bigfile.log

2. deployment,cm,hpa的测试环境准备

yaml 复制代码
[root@master231 horizontalpodautoscalers]# cat 02-deploy-cm-memory-case.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-memory
data:
  start.sh: |
    #!/bin/sh
    mkdir /tmp/yinzhengjie
    mount -t tmpfs -o size=90M tmpfs /tmp/yinzhengjie/
    dd if=/dev/zero of=/tmp/yinzhengjie/bigfile.log
    sleep 60
    rm /tmp/yinzhengjie/bigfile.log
    umount /tmp/yinzhengjie
    rm -rf /tmp/yinzhengjie

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-xiuxian-memory
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: xiuxian
  template:
    metadata:
      labels:
        apps: xiuxian
    spec:
      volumes:
      - name: data
        configMap:
          name: cm-memory
      containers:
      - name: c1
        image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
        volumeMounts:
        - name: data
          mountPath: /data
        resources:
          requests:
            memory: 100Mi
            cpu: 100m
        securityContext:
          privileged: true
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web

---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-memory
spec:
  minReplicas: 2
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 60
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: deploy-xiuxian-memory
bash 复制代码
[root@master231 horizontalpodautoscalers]# kubectl apply -f 02-deploy-cm-memory-case.yaml
configmap/cm-memory created
deployment.apps/deploy-xiuxian-memory created
horizontalpodautoscaler.autoscaling/hpa-memory created

3. 测试验证

3.1 终端一测试

bash 复制代码
[root@master231 ~]# kubectl get pods -o wide
NAME                                     READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
deploy-xiuxian-memory-685869f7f9-gxbt5   1/1     Running   0          83s   10.100.2.37    worker233   <none>           <none>
deploy-xiuxian-memory-685869f7f9-r9q7x   1/1     Running   0          68s   10.100.1.183   worker232   <none>           <none>

[root@master231 ~]# kubectl exec -it deploy-xiuxian-memory-685869f7f9-pwz4l -- sh /data/start.sh # 执行该脚本需要等待1min,因为的的脚本逻辑要睡1min。
dd: error writing '/tmp/yinzhengjie/bigfile.log': No space left on device
184321+0 records in
184320+0 records out

3.2 终端二测试

bash 复制代码
[root@master231 ~]# kubectl exec -it deploy-xiuxian-memory-685869f7f9-r9q7x -- sh /data/start.sh # 执行该脚本需要等待1min,因为的的脚本逻辑要睡1min。
mkdir: can't create directory '/tmp/yinzhengjie': File exists
dd: error writing '/tmp/yinzhengjie/bigfile.log': No space left on device
184321+0 records in
184320+0 records out
rm: can't remove '/tmp/yinzhengjie': Resource busy
command terminated with exit code 1

3.3 查看hpa状态

bash 复制代码
[root@master231 ~]# kubectl get hpa hpa-memory -w   # 这次看内存
NAME         REFERENCE                          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
hpa-memory   Deployment/deploy-xiuxian-memory   <unknown>/60%   2         5         1          22s
hpa-memory   Deployment/deploy-xiuxian-memory   <unknown>/60%   2         5         2          30s
hpa-memory   Deployment/deploy-xiuxian-memory   3%/60%          2         5         2          45s
hpa-memory   Deployment/deploy-xiuxian-memory   3%/60%          2         5         2          105s
hpa-memory   Deployment/deploy-xiuxian-memory   48%/60%         2         5         2          2m
hpa-memory   Deployment/deploy-xiuxian-memory   48%/60%         2         5         2          2m45s
hpa-memory   Deployment/deploy-xiuxian-memory   93%/60%         2         5         2          3m
hpa-memory   Deployment/deploy-xiuxian-memory   49%/60%         2         5         4          3m15s
hpa-memory   Deployment/deploy-xiuxian-memory   140%/60%        2         5         4          3m30s
hpa-memory   Deployment/deploy-xiuxian-memory   71%/60%         2         5         5          3m45s
hpa-memory   Deployment/deploy-xiuxian-memory   93%/60%         2         5         5          4m
hpa-memory   Deployment/deploy-xiuxian-memory   39%/60%         2         5         5          4m15s
hpa-memory   Deployment/deploy-xiuxian-memory   21%/60%         2         5         5          4m30s
hpa-memory   Deployment/deploy-xiuxian-memory   3%/60%          2         5         5          5m
hpa-memory   Deployment/deploy-xiuxian-memory   3%/60%          2         5         5          9m1s
hpa-memory   Deployment/deploy-xiuxian-memory   3%/60%          2         5         4          9m16s
hpa-memory   Deployment/deploy-xiuxian-memory   2%/60%          2         5         2          9m31s
hpa-memory   Deployment/deploy-xiuxian-memory   2%/60%          2         5         2          9m46s

项目篇: jenkins结合K8S实现CI/CD

1. 环境准备

IP及主机名:

10.0.0.211 jenkins211

2. jenkins环境部署

1. 安装字体相关的依赖包

bash 复制代码
[root@jenkins211 ~]# apt -y install fontconfig

2. 安装JDK

bash 复制代码
[root@jenkins211 ~]# wget http://192.168.16.253/Resources/Kubernetes/Project/DevOps/Jenkins/jdk-17_linux-x64_bin.tar.gz
[root@jenkins211 ~]# tar xf jdk-17_linux-x64_bin.tar.gz -C /usr/local/
[root@jenkins211 ~]# cat /etc/profile.d/jdk.sh
#!/bin/bash
export JAVA_HOME=/usr/local/jdk-17.0.8
export PATH=$PATH:$JAVA_HOME/bin
[root@jenkins211 ~]# source /etc/profile.d/jdk.sh
[root@jenkins211 ~]# java --version
java 17.0.8 2023-07-18 LTS
Java(TM) SE Runtime Environment (build 17.0.8+9-LTS-211)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.8+9-LTS-211, mixed mode, sharing)

3. 安装jenkins

bash 复制代码
[root@jenkins211 ~]# wget http://192.168.16.253/Resources/Kubernetes/Project/DevOps/Jenkins/jenkins-v2.479.3/jenkins_2.479.3_all.deb
[root@jenkins211 ~]# dpkg -i jenkins_2.479.3_all.deb

4. 修改jenkins的启动脚本

bash 复制代码
[root@jenkins211 ~]# vim /lib/systemd/system/jenkins.service
...
[Service]
...
User=root
Group=root
...
Environment="JAVA_HOME=/usr/local/jdk-17.0.8"
Environment="JENKINS_HOME=/var/lib/jenkins"  # 在这行上面写
...

5. 启动jenkins

bash 复制代码
[root@jenkins211 ~]# systemctl daemon-reload
[root@jenkins211 ~]# systemctl enable --now jenkins
[root@jenkins211 ~]# ss -ntl | grep 8080
LISTEN 0      50                 *:8080            *:*

6. 访问jenkins的WebUI

http://10.0.0.211:8080/

查看默认的密码进行登录【复制你自己的密码到webUI】

bash 复制代码
[root@jenkins211 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
335c1f0e415144b58065cf97829c1a71

7. 跳过插件安装

点×号

8. 修改admin密码

admin 1

3. jenkins常用插件安装

1. 下载插件包

bash 复制代码
[root@jenkins211 ~]# wget http://192.168.16.253/Resources/Kubernetes/Project/DevOps/Jenkins/jenkins-v2.479.3/oldboyedu-jenkins-2.479.3-plugins.tar.gz

2. 解压插件包

bash 复制代码
[root@jenkins211 ~]# tar xf oldboyedu-jenkins-2.479.3-plugins.tar.gz -C /var/lib/jenkins/plugins/

3. 重启jenkins环境

bash 复制代码
[root@jenkins211 ~]# systemctl restart jenkins.service

或者调用jenkins的API重启:

http://10.0.0.211:8080/restart

4. 验证插件是否安装成功

http://10.0.0.211:8080/manage/pluginManager/installed

4. gitee账号注册并推送代码

参考链接:

https://gitee.com/signup

1. 新建gitee代码仓库

添加新建仓库----oldboyedu-linux99-yiliao-私有

2. git全局配置【写你自己的账号信息】

bash 复制代码
[root@harbor250 ~]# git config --global user.name "尹正杰"
[root@harbor250 ~]# git config --global user.email "8669059+yinzhengjie@user.noreply.gitee.com"

3. git初始化操作

bash 复制代码
[root@harbor250 ~]# mkdir oldboyedu-linux99-yiliao
[root@harbor250 ~]# cd oldboyedu-linux99-yiliao
[root@harbor250 oldboyedu-linux99-yiliao]# git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: 	git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: 	git branch -m <name>
Initialized empty Git repository in /root/oldboyedu-linux99-yiliao/.git/

4. 模拟开发人员提交代码到本地仓库

bash 复制代码
[root@harbor250 oldboyedu-linux99-yiliao]# wget http://192.168.16.253/Resources/Kubernetes/Project/DevOps/Jenkins/oldboyedu-yiliao.zip
[root@harbor250 oldboyedu-linux99-yiliao]# unzip oldboyedu-yiliao.zip && rm -f oldboyedu-yiliao.zip
[root@harbor250 oldboyedu-linux99-yiliao]# ll
total 228
drwxr-xr-x 6 root root  4096 Sep 29 12:07 ./
drwx------ 9 root root  4096 Sep 29 12:06 ../
-rw-r--r-- 1 root root 16458 Jun 13  2019 about.html
-rw-r--r-- 1 root root 20149 Jun 13  2019 album.html
-rw-r--r-- 1 root root 19662 Jun 13  2019 article_detail.html
-rw-r--r-- 1 root root 18767 Jun 13  2019 article.html
-rw-r--r-- 1 root root 18913 Jun 13  2019 comment.html
-rw-r--r-- 1 root root 16465 Jun 13  2019 contact.html
drwxr-xr-x 2 root root  4096 Sep 19  2022 css/
drwxr-xr-x 7 root root  4096 Sep 29 12:06 .git/
drwxr-xr-x 5 root root  4096 Sep 19  2022 images/
-rw-r--r-- 1 root root 29627 Jun 29  2019 index.html
drwxr-xr-x 2 root root  4096 Sep 19  2022 js/
-rw-r--r-- 1 root root 24893 Jun 13  2019 product_detail.html
-rw-r--r-- 1 root root 20672 Jun 13  2019 product.html

git config --global user.name "朱先航"
git config --global user.email "14119536+zhu-xianhang@user.noreply.gitee.com"

[root@harbor250 oldboyedu-linux99-yiliao]# git add .
[root@harbor250 oldboyedu-linux99-yiliao]# git commit -m 'yiliao code'

5. 推送代码到gitee:我的用户名密码是13640188006 010402zxh

bash 复制代码
[root@harbor250 oldboyedu-linux99-yiliao]# git remote add origin https://gitee.com/zhu-xianhang/oldboyedu-linux99-yiliao.git
[root@harbor250 oldboyedu-linux99-yiliao]# git push -u origin "master"
Username for 'https://gitee.com': yinzhengjie
Password for 'https://yinzhengjie@gitee.com':
Enumerating objects: 90, done.
Counting objects: 100% (90/90), done.
Delta compression using up to 2 threads
Compressing objects: 100% (90/90), done.
Writing objects: 100% (90/90), 1.48 MiB | 1.73 MiB/s, done.
Total 90 (delta 12), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 684117bc
To https://gitee.com/yinzhengjie/oldboyedu-linux99-yiliao.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

6. 远程仓库查看

5. jenkins从gitee拉取代码测试

新建任务-oldboyedu-linux99-yiliao-构建自由风格

源码管理-URL-credentials用户密码

执行shell---写上pw ls-l

6. 基于ssh认证及模拟开发人员推送Dockerfile文件

参考链接:

https://help.gitee.com/base/account/SSH公钥设置

1. 生成密钥对

bash 复制代码
[root@harbor250 ~]# ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa -q
[root@harbor250 ~]# ll ~/.ssh/id_rsa*
-rw------- 1 root root 2602 Sep 29 15:23 /root/.ssh/id_rsa
-rw-r--r-- 1 root root  568 Sep 29 15:23 /root/.ssh/id_rsa.pub

2. 查看公钥信息:使用这个就不需要密码了

bash 复制代码
[root@harbor250 ~]# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCgTlc5BvuZuUpObG2sqInP7ZCjvS0DgTh9q+A4RqWu3cDP7AKI5AY7C6E/iTvtp6JXJYBftEWJvGX/jlughusUPxyBBB1lDM9CsYQvFsEjDoANMebUP3oeRGNyrqFkMIC0bI7km/HbW4tn8fOv85Ety+AW9C7SZ4QCw7edOB/62xCpODQHqGnwe7Vaxm45Wu09JSSzezwq/oE3vM4TvOgRO0/YyEoCTwbTPpuFqTiQcDAE+Udi3g75k+rkidlsuF7+JUHU8V62bewEg0v0GSR6a99NB/Yj/6idMV9fAMTGQ7xpQrwyjwgKYLZIlj5lEm51tTpl/vtidK2UpXn8XiuYd2DnCWziu+/Jlzz5Es3P3/RkG4zY2+A4eJ/R73vI8WowB7jRbBew28bkM41tYQOnDLOVgCPdXktP5DjSFa6ikuzj120xDX0uKLFVW1HzP2FU0In3/btVv+AcK41w/Yp6Rl7pV8cHDV2D4m3J8VMPnUVB9niMyxaphuUCv+M+wAs= root@harbor250

3. 将公钥信息添加到gitee

https://gitee.com/profile/sshkeys

4. 拉取代码

bash 复制代码
[root@harbor250 ~]# cd /opt/
[root@harbor250 opt]# git clone git@gitee.com:zhu-xianhang/oldboyedu-linux99-yiliao.git
Cloning into 'oldboyedu-linux99-yiliao'...
The authenticity of host 'gitee.com (180.76.199.13)' can't be established.
ED25519 key fingerprint is SHA256:+ULzij2u99B9eWYFTw1Q4ErYG/aepHLbu96PAUCoV88.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes  # 第一次拉取代码需要输入'yes'
Warning: Permanently added 'gitee.com' (ED25519) to the list of known hosts.
remote: Enumerating objects: 90, done.
remote: Counting objects: 100% (90/90), done.
remote: Compressing objects: 100% (90/90), done.
remote: Total 90 (delta 10), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (90/90), 1.48 MiB | 1.18 MiB/s, done.
Resolving deltas: 100% (10/10), done.

[root@harbor250 opt]# cd oldboyedu-linux99-yiliao/
[root@harbor250 oldboyedu-linux99-yiliao]# ll
total 228
drwxr-xr-x 6 root root  4096 Sep 29 15:25 ./
drwxr-xr-x 4 root root  4096 Sep 29 15:25 ../
-rw-r--r-- 1 root root 16458 Sep 29 15:25 about.html
-rw-r--r-- 1 root root 20149 Sep 29 15:25 album.html
-rw-r--r-- 1 root root 19662 Sep 29 15:25 article_detail.html
-rw-r--r-- 1 root root 18767 Sep 29 15:25 article.html
-rw-r--r-- 1 root root 18913 Sep 29 15:25 comment.html
-rw-r--r-- 1 root root 16465 Sep 29 15:25 contact.html
drwxr-xr-x 2 root root  4096 Sep 29 15:25 css/
drwxr-xr-x 8 root root  4096 Sep 29 15:25 .git/
drwxr-xr-x 5 root root  4096 Sep 29 15:25 images/
-rw-r--r-- 1 root root 29627 Sep 29 15:25 index.html
drwxr-xr-x 2 root root  4096 Sep 29 15:25 js/
-rw-r--r-- 1 root root 24893 Sep 29 15:25 product_detail.html
-rw-r--r-- 1 root root 20672 Sep 29 15:25 product.html

5. 编写Dockerfile并提交到本地仓库:基于现有Nginx镜像,清空默认内容,替换为你的自定义内容

dockerfile 复制代码
[root@harbor250 oldboyedu-linux99-yiliao]# cat Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
LABEL school=oldboyedu \
      class=linux99 \
      auther=JasonYin \
      email="y1053419035@qq.com"
RUN rm -rf /usr/share/nginx/html/*
ADD . /usr/share/nginx/html
EXPOSE 80

本地测试:

bash 复制代码
docker build -t test:v1 .
docker run -d -p 81:80 --name c1 test:v1
bash 复制代码
[root@harbor250 oldboyedu-linux99-yiliao]# git add .
[root@harbor250 oldboyedu-linux99-yiliao]# git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   Dockerfile

[root@harbor250 oldboyedu-linux99-yiliao]# git commit -m 'add dockerfile'
[master 99eb775] add dockerfile
 1 file changed, 12 insertions(+)
 create mode 100644 Dockerfile

[root@harbor250 oldboyedu-linux99-yiliao]# git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working tree clean

此时本地提交成功了

6. 推送代码到gitee

bash 复制代码
[root@harbor250 oldboyedu-linux99-yiliao]# git remote -v
origin	git@gitee.com:yinzhengjie/oldboyedu-linux99-yiliao.git (fetch)
origin	git@gitee.com:yinzhengjie/oldboyedu-linux99-yiliao.git (push)

[root@harbor250 oldboyedu-linux99-yiliao]# git push origin master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 493 bytes | 493.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag a9413bb3
To gitee.com:yinzhengjie/oldboyedu-linux99-yiliao.git
   236d077..99eb775  master -> master

7. 远程仓库验证

https://gitee.com/yinzhengjie/oldboyedu-linux99-yiliao

7. jenkins构建docker镜像并推送到harbor仓库

1. 安装docker环境

bash 复制代码
[root@jenkins211 ~]# wget http://192.168.16.253/Resources/Docker/scripts/oldboyedu-autoinstall-docker-docker-compose.tar.gz
[root@jenkins211 ~]# tar xf oldboyedu-autoinstall-docker-docker-compose.tar.gz
[root@jenkins211 ~]# ./install-docker.sh i

2. 添加解析记录

bash 复制代码
[root@jenkins211 ~]# echo 10.0.0.250 harbor250.oldboyedu.com >> /etc/hosts
[root@jenkins211 ~]# tail -1 /etc/hosts
10.0.0.250 harbor250.oldboyedu.com

3. 拷贝harbor的客户端证书

bash 复制代码
[root@jenkins211 ~]# scp -r 10.0.0.231:/etc/docker/certs.d/ /etc/docker/

4. 修改jenkins的命令行推送代码到harbor

Jenkins主动拉取Git仓库代码到这个目录

当前Jenkins处在/var/lib/jenkins/workspace/oldboyedu-linux99-yiliao目录下

bash 复制代码
docker build -t harbor250.oldboyedu.com/oldboyedu-yiliao/yiliao:v0.1 .
docker login -u admin -p 1 harbor250.oldboyedu.com
docker push harbor250.oldboyedu.com/oldboyedu-yiliao/yiliao:v0.1
docker logout harbor250.oldboyedu.com

5. 开始构建

6. harbor的WebUI验证

8. jenkins部署业务到K8S集群

1. 准备资源清单

bash 复制代码
[root@jenkins211 ~]# mkdir /oldboyedu/projects
[root@jenkins211 ~]# cd /oldboyedu/projects
yaml 复制代码
[root@jenkins211 projects]# cat deploy-yiliao.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-yiliao
spec:
  replicas: 3
  selector:
    matchLabels:
      apps: yiliao
  template:
    metadata:
      labels:
        apps: yiliao
    spec:
      containers:
      - name: c1
        image: harbor250.oldboyedu.com/oldboyedu-yiliao/yiliao:v0.1
        ports:
        - containerPort: 80
          name: web
yaml 复制代码
[root@jenkins211 projects]# cat svc-yiliao.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-yiliao
spec:
  type: LoadBalancer
  selector:
    apps: yiliao
  ports:
  - port: 80
    targetPort: web

2. 部署kubectl工具

bash 复制代码
[root@jenkins211 ~]# wget http://192.168.16.253/Resources/Kubernetes/Project/DevOps/Jenkins/kubectl-1.23.17
[root@jenkins211 ~]# mv kubectl-1.23.17 /usr/local/bin/kubectl
[root@jenkins211 ~]# chmod +x /usr/local/bin/kubectl
[root@jenkins211 ~]# ll /usr/local/bin/kubectl
-rwxr-xr-x 1 root root 45174784 Sep  4  2023 /usr/local/bin/kubectl*

3. 准备认证文件

bash 复制代码
[root@jenkins211 ~]# mkdir -p .kube
[root@jenkins211 ~]# scp 10.0.0.231:/root/.kube/config .kube

4. 修改jenkins的命令:当前处于/var/lib/jenkins/workspace/oldboyedu-linux99-yiliao目录下

bash 复制代码
docker build -t harbor250.oldboyedu.com/oldboyedu-yiliao/yiliao:v0.1 .
docker login -u admin -p 1 harbor250.oldboyedu.com
docker push harbor250.oldboyedu.com/oldboyedu-yiliao/yiliao:v0.1
docker logout harbor250.oldboyedu.com
kubectl apply -f /oldboyedu/projects
kubectl get svc,po -o wide

5. 访问测试

bash 复制代码
[root@master231 ~]# kubectl get svc,pods -o wide
NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE    SELECTOR
service/kubernetes   ClusterIP      10.200.0.1       <none>        443/TCP        2d5h   <none>
service/svc-yiliao   LoadBalancer   10.200.177.159   10.0.0.151    80:31499/TCP   82s    apps=yiliao

NAME                                 READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pod/deploy-yiliao-5f48d8bd77-gjhn4   1/1     Running   0          82s   10.100.2.41    worker233   <none>           <none>
pod/deploy-yiliao-5f48d8bd77-jxzcq   1/1     Running   0          82s   10.100.2.40    worker233   <none>           <none>
pod/deploy-yiliao-5f48d8bd77-nqj8g   1/1     Running   0          82s   10.100.1.185   worker232   <none>           <none>

9. jenkins参数化构建并实现K8S更新

更新:改index文件,然后git commit -a -m 'add index.html' git push origin master

1. 添加选项参数 参数化构建

参数化构建-git参数-叫release-参数类型选修订-默认值origin/master

2. 修改脚本内容:如果存在deploy就参数化构建,不存在就apply一个先

bash 复制代码
# push image to harbor
docker build -t harbor250.oldboyedu.com/oldboyedu-yiliao/yiliao:${release} .
docker login -u admin -p 1 harbor250.oldboyedu.com
docker push harbor250.oldboyedu.com/oldboyedu-yiliao/yiliao:${release}
docker logout harbor250.oldboyedu.com

# deploy project
kubectl get deployments.apps deploy-yiliao  2>/dev/null
if [ $? -eq 0 ];then
kubectl set image deploy deploy-yiliao c1=harbor250.oldboyedu.com/oldboyedu-yiliao/yiliao:${release}
else
kubectl apply -f /k8s-yiliao/01-deploy-yiliao.yaml
fi
kubectl get deploy,svc,po -o wide --show-labels

3. 修改远程仓库代码

略,见视频

4. jenkins构建

略,见视频

5. 访问WebUI

http://10.0.0.152/

10. jenkins实现回滚实战案例

新建一个项目,复制之前的创建

jenkins代码:只用写这一行就好

bash 复制代码
kubectl set image deploy deploy-yiliao c1=harbor250.oldboyedu.com/oldboyedu-yiliao/yiliao:${release}
相关推荐
@hdd11 小时前
生产环境最佳实践:资源管理、高可用与安全加固
安全·云原生·kubernetes
@hdd13 小时前
实战:在 Kubernetes 上部署微服务应用
微服务·容器·kubernetes
Elastic 中国社区官方博客19 小时前
在 Kubernetes 上的依赖管理
大数据·elasticsearch·搜索引擎·云原生·容器·kubernetes·全文检索
星星乘坐的船20 小时前
Centos7.9系统下docker安装
运维·docker·容器
Elastic 中国社区官方博客1 天前
Agentic CI/CD:使用 Kubernetes 部署门控,结合 Elastic MCP Server
大数据·人工智能·elasticsearch·搜索引擎·ci/cd·容器·kubernetes
切糕师学AI1 天前
Kubernetes 中的 StatefulSet
云原生·容器·kubernetes
阿乐艾官1 天前
【K8s思维导图及单节点容器启动流程】
java·容器·kubernetes
礼拜天没时间.1 天前
企业级Docker镜像仓库Harbor部署实战
linux·运维·docker·云原生·容器·sre
阿寻寻1 天前
【云原生技术】Pod 列表新增时间字段:取值口径与获取方式
docker·云原生·kubernetes