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}
相关推荐
运维开发故事1 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson3 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生3 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭3 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美4 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵5 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
武子康8 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
2601_9618752411 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj11 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes