使用KubeSphere3.3在Ubuntu20.04的Kubernetes1.24上部署Word Press

news2024/11/25 14:44:39

使用KubeSphere3.3在Ubuntu20.04的Kubernetes1.24上部署Word Press

前言

之前已经部署了KubeSphere和K8S的基础环境:https://lizhiyong.blog.csdn.net/article/details/126236516

部署了大数据统一文件编排层Alluxio:https://lizhiyong.blog.csdn.net/article/details/126815426

以及Saas服务的简单体验:https://lizhiyong.blog.csdn.net/article/details/129868719

所以这次尝试部署一个Word Press服务,成功的话,下次就可以参照着部署在Saas服务搭个私有Blog,可能比租ECS或者轻量服务器还便宜。。。

具体参照官方文档:https://www.kubesphere.io/zh/docs/v3.3/quick-start/wordpress-deployment/

在这里插入图片描述

这个应用的后端服务是MySQL,持久化到PVC中,账户密码存在Secret中,暴露一个Service给前端服务使用。

前端服务就是Word Press,持久化到PVC中,账户密码存在另一个Secret中,暴露一个Service给Pod外部的租户使用。

这个案例大体上涵盖了K8S部署常见的有状态应用和无状态应用。部署成功后,外部租户就可以访问到Pod中的前端服务Word Press,前端服务也能够把数据持久化到后端的MySQL。在使用时,租户大概率不会发觉底层的变化。。。

实操

本文不是给纯小白看的,不过得益于KubeSphere对K8S的界面化封装,其实纯小白耐心点也能学会基础操作。。。应付工作还是足够的。

有点追求的话,还是建议深入理解下相关的原理。多说无益。

做平台开发当然是习惯了超级管理员。。。而且是自己玩,懒得创建项目和租户了。。。

http://192.168.88.20:30880
admin
Aa123456

直接上。。。

创建密钥

MySQL的密钥

在这里插入图片描述

下一步默认的方式即可:

在这里插入图片描述

此处Key=MYSQL_ROOT_PASSWORD,Value=123456。

此时的yaml:

apiVersion: v1
kind: Secret
metadata:
  namespace: default
  labels: {}
  name: zhiyong-mysql-secret
  annotations:
    kubesphere.io/description: WordPress的MySQL密钥
type: Opaque
spec:
  template:
    metadata:
      labels: {}
data:
  MYSQL_ROOT_PASSWORD: MTIzNDU2

这种方式和:

kubectl create -f secret.yaml

做法其实是一致的。。。Base64加密的方式也很不安全。

Word Press的密钥

在这里插入图片描述

下一步:

在这里插入图片描述

此处Key=WORDPRESS_DB_PASSWORD,Value=123456。

此时的yaml:

apiVersion: v1
kind: Secret
metadata:
  namespace: default
  labels: {}
  name: zhiyong-wordpress-secret
  annotations:
    kubesphere.io/description: WordPress的密钥
type: Opaque
spec:
  template:
    metadata:
      labels: {}
data:
  WORDPRESS_DB_PASSWORD: MTIzNDU2

其实还有另外的模式:

在这里插入图片描述

以后可以试试。此时创建了2个Secret:

在这里插入图片描述

创建PVC

在这里插入图片描述

使用默认的Local模式,10个G空间:

在这里插入图片描述

这种模式也没啥元数据:

在这里插入图片描述

保持默认即可,此时的yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  namespace: default
  name: zhiyong-wordpress-pvc
  labels: {}
  annotations:
    kubesphere.io/description: word press存储卷
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: local

此时PVC创建完毕:

在这里插入图片描述

创建应用

在这里插入图片描述

此时并没有创建应用的选项。。。

老的3.2版本也有这个应用的选项:https://v3-2.docs.kubesphere.io/zh/docs/quick-start/wordpress-deployment/

所以还是应该老老实实的先创建租户和项目。。。貌似KubeSphere的设计中不允许网管部署应用。。。

接下来参考官网:https://www.kubesphere.io/zh/docs/v3.3/quick-start/create-workspace-and-project/

由于新老版本涉及一些变化:https://www.kubesphere.io/zh/docs/v3.3/release/release-v331/

在这里插入图片描述

并不能照搬最新版官网文档。

可能还需要参考老版本的:https://v3-2.docs.kubesphere.io/zh/docs/quick-start/create-workspace-and-project/

创建租户

新版本:

内置角色描述
platform-self-provisioner创建企业空间并成为所创建企业空间的管理员。
platform-regular平台普通用户,在被邀请加入企业空间或集群之前没有任何资源操作权限。
platform-admin平台管理员,可以管理平台内的所有资源。

备注:内置角色由 KubeSphere 自动创建,无法编辑或删除。

老版本:

内置角色描述
workspaces-manager企业空间管理员,管理平台所有企业空间。
users-manager用户管理员,管理平台所有用户。
platform-regular平台普通用户,在被邀请加入企业空间或集群之前没有任何资源操作权限。
platform-admin平台管理员,可以管理平台内的所有资源。

所以还是要按照老版本的模式:

在这里插入图片描述

可以在这个界面创建各种租户。

在这里插入图片描述

先创建一个用户管理员:

users-manager
users-manager@zhiyong.com
Aa123456

然后切换到这个用户,创建如下4个租户:

用户指定的平台角色用户权限
ws-managerworkspaces-manager创建和管理所有企业空间。
ws-adminplatform-regular被邀请到企业空间后,管理该企业空间中的所有资源(在此示例中,此用户用于邀请新成员加入该企业空间)。
project-adminplatform-regular创建和管理项目以及 DevOps 项目,并邀请新成员加入项目。
project-regularplatform-regularproject-regular 将由 project-admin 邀请至项目或 DevOps 项目。该用户将用于在指定项目中创建工作负载、流水线和其他资源。

在这里插入图片描述

ws-manager
ws-manager@zhiyong.com
Aa123456

在这里插入图片描述

ws-admin
ws-admin@zhiyong.com
Aa123456

在这里插入图片描述

project-admin
project-admin@zhiyong.com
Aa123456

在这里插入图片描述

project-regular
project-regular@zhiyong.com
Aa123456

在这里插入图片描述

此时可以看到新建4杆租户成功!!!

创建企业空间【NameSpace】

ws-manager 租户的身份登录 KubeSphere。

在这里插入图片描述

创建一个Demo的工作空间:

在这里插入图片描述

demo-workspace
管理员:ws-admin

在这里插入图片描述

遇到了这个报错:

Forbidden
workspacetemplates.tenant.kubesphere.io is forbidden: User "ws-manager" cannot create resource "workspacetemplates" in API group "tenant.kubesphere.io" at the cluster scope

把4个普通租户挨个激活以后还是有这种问题。。。所以使用admin超级管理员来创建:

在这里插入图片描述

即可成功。。。这是KuberSphere的Bug,3.3.1的新版本已经修复。。。

然后以 ws-admin 身份重新登录,邀请 project-adminproject-regular 这2杆租户进入企业空间:

在这里插入图片描述

分别授予 demo-workspace-self-provisionerdemo-workspace-viewer 角色:

在这里插入图片描述

在这里插入图片描述

此时租户拉取配置成功:

在这里插入图片描述

接下来就可以创建项目。

创建项目

切换为:project-admin这个租户,创建项目:

在这里插入图片描述

然后邀请普通租户,分配给operator身份:

在这里插入图片描述

项目的Ingress网关和配额暂时不管。之后切换到普通租户project-regular,就可以部署项目:

在这里插入图片描述

重新创建密钥

删除之前的密钥,再重新操作一遍即可。不再赘述。

在这里插入图片描述

此时准备好了MySQL后端的Secret与Word Press的前端Secret。

重新创建PVC

删除之前的PVC,再重新操作一遍即可,不再赘述。

在这里插入图片描述

Forbidden
volumesnapshotclasses.snapshot.storage.k8s.io is forbidden: User "project-regular" cannot list resource "volumesnapshotclasses" in API group "snapshot.storage.k8s.io" at the cluster scope

不过有这个问题。。。不需要用admin来创建PVC,只是个展示的问题。

自制应用

此时可以自制应用:

在这里插入图片描述

在这里插入图片描述

暂时不用Sidecar做应用治理,所以先关闭它。

添加 MySQL 后端组件

在这里插入图片描述

先创建MySQL的有状态服务。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

此时的yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: mysql-wordpress
  name: mysql-wordpress-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      version: v1
      app: mysql-wordpress
  template:
    metadata:
      labels:
        version: v1
        app: mysql-wordpress
    spec:
      containers:
        - name: container-rt5e06
          imagePullPolicy: IfNotPresent
          image: 'mysql:5.6'
          resources:
            requests:
              cpu: '0.1'
              memory: 100Mi
            limits:
              cpu: '1.5'
              memory: 2000Mi
          ports:
            - name: tcp-3306
              protocol: TCP
              containerPort: 3306
              servicePort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: zhiyong-mysql-secret
                  key: MYSQL_ROOT_PASSWORD
      serviceAccount: default
      initContainers: []
      volumes: []
      imagePullSecrets: null
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 0
  serviceName: mysql-wordpress
---
apiVersion: v1
kind: Service
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: mysql-wordpress
  annotations:
    kubesphere.io/serviceType: statefulservice
    kubesphere.io/description: 给WordPress用的MySQL
  name: mysql-wordpress
spec:
  sessionAffinity: None
  selector:
    app: mysql-wordpress
  ports:
    - name: tcp-3306
      protocol: TCP
      port: 3306
      targetPort: 3306
  clusterIP: None

然后从PVC挂载PV:

在这里插入图片描述

挂载PVC以后的yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: mysql-wordpress
  name: mysql-wordpress-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      version: v1
      app: mysql-wordpress
  template:
    metadata:
      labels:
        version: v1
        app: mysql-wordpress
      annotations:
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      containers:
        - name: container-rt5e06
          imagePullPolicy: IfNotPresent
          image: 'mysql:5.6'
          resources:
            requests:
              cpu: '0.1'
              memory: 100Mi
            limits:
              cpu: '1.5'
              memory: 2000Mi
          ports:
            - name: tcp-3306
              protocol: TCP
              containerPort: 3306
              servicePort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: zhiyong-mysql-secret
                  key: MYSQL_ROOT_PASSWORD
          volumeMounts:
            - readOnly: false
              mountPath: /var/lib/mysql
              name: zhiyong-mysql
      serviceAccount: default
      initContainers: []
      volumes: []
      imagePullSecrets: null
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 0
  serviceName: mysql-wordpress
  volumeClaimTemplates:
    - spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: local
      metadata:
        name: zhiyong-mysql
        namespace: word-press-project
---
apiVersion: v1
kind: Service
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: mysql-wordpress
  annotations:
    kubesphere.io/serviceType: statefulservice
    kubesphere.io/description: 给WordPress用的MySQL
  name: mysql-wordpress
spec:
  sessionAffinity: None
  selector:
    app: mysql-wordpress
  ports:
    - name: tcp-3306
      protocol: TCP
      port: 3306
      targetPort: 3306
  clusterIP: None

由于是All In One的模式:

在这里插入图片描述

也就没得选了。。。如果是多节点模式,那么还可以指定Pod运行在哪台机器。

添加 WordPress 前端组件

相似的操作,创建无状态应用:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

自己玩玩,也就不搞探针探活了。。。

此时的yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: wordpress
  name: wordpress-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      version: v1
      app: wordpress
  template:
    metadata:
      labels:
        version: v1
        app: wordpress
    spec:
      containers:
        - name: container-7ydkpj
          imagePullPolicy: IfNotPresent
          image: 'wordpress:4.8-apache'
          resources:
            requests:
              cpu: '0.1'
              memory: 100Mi
            limits:
              cpu: '1'
              memory: 2000Mi
          ports:
            - name: tcp-80
              protocol: TCP
              containerPort: 80
              servicePort: 80
          env:
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: zhiyong-wordpress-secret
                  key: WORDPRESS_DB_PASSWORD
            - name: WORDPRESS_DB_HOST
              value: mysql-wordpress
      serviceAccount: default
      initContainers: []
      volumes: []
      imagePullSecrets: null
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
---
apiVersion: v1
kind: Service
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: wordpress
  annotations:
    kubesphere.io/serviceType: statelessservice
    kubesphere.io/description: WordPress服务
  name: wordpress
spec:
  sessionAffinity: None
  selector:
    app: wordpress
  ports:
    - name: tcp-80
      protocol: TCP
      port: 80
      targetPort: 80

在这里插入图片描述

挂载PVC以后的yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: wordpress
  name: wordpress-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      version: v1
      app: wordpress
  template:
    metadata:
      labels:
        version: v1
        app: wordpress
      annotations:
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      containers:
        - name: container-7ydkpj
          imagePullPolicy: IfNotPresent
          image: 'wordpress:4.8-apache'
          resources:
            requests:
              cpu: '0.1'
              memory: 100Mi
            limits:
              cpu: '1'
              memory: 2000Mi
          ports:
            - name: tcp-80
              protocol: TCP
              containerPort: 80
              servicePort: 80
          env:
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: zhiyong-wordpress-secret
                  key: WORDPRESS_DB_PASSWORD
            - name: WORDPRESS_DB_HOST
              value: mysql-wordpress
          volumeMounts:
            - name: volume-jsr71k
              readOnly: false
              mountPath: /var/www/html
      serviceAccount: default
      initContainers: []
      volumes:
        - name: volume-jsr71k
          persistentVolumeClaim:
            claimName: zhiyong-wordpress-pvc
      imagePullSecrets: null
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
---
apiVersion: v1
kind: Service
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: wordpress
  annotations:
    kubesphere.io/serviceType: statelessservice
    kubesphere.io/description: WordPress服务
  name: wordpress
spec:
  sessionAffinity: None
  selector:
    app: wordpress
  ports:
    - name: tcp-80
      protocol: TCP
      port: 80
      targetPort: 80

此时创建好了2个组件。

路由

在这里插入图片描述

路由暂且不设置。此时的yaml:

apiVersion: app.k8s.io/v1beta1
kind: Application
metadata:
  name: word-press
  namespace: word-press-project
  labels:
    app.kubernetes.io/version: v1
    app.kubernetes.io/name: word-press
  annotations:
    servicemesh.kubesphere.io/enabled: 'false'
    kubesphere.io/description: WordPress应用
spec:
  selector:
    matchLabels:
      app.kubernetes.io/version: v1
      app.kubernetes.io/name: word-press
  addOwnerRef: true
  componentKinds:
    - group: ''
      kind: Service
    - group: apps
      kind: Deployment
    - group: apps
      kind: StatefulSet
    - group: networking.k8s.io
      kind: Ingress
    - group: servicemesh.kubesphere.io
      kind: Strategy
    - group: servicemesh.kubesphere.io
      kind: ServicePolicy
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: word-press-project
  labels:
    app.kubernetes.io/version: v1
    app.kubernetes.io/name: word-press
  name: word-press-ingress-rb11gi
spec:
  rules: []
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: mysql-wordpress
    app.kubernetes.io/version: v1
    app.kubernetes.io/name: word-press
  name: mysql-wordpress-v1
  annotations:
    servicemesh.kubesphere.io/enabled: 'false'
spec:
  replicas: 1
  selector:
    matchLabels:
      version: v1
      app: mysql-wordpress
      app.kubernetes.io/version: v1
      app.kubernetes.io/name: word-press
  template:
    metadata:
      labels:
        version: v1
        app: mysql-wordpress
        app.kubernetes.io/version: v1
        app.kubernetes.io/name: word-press
      annotations:
        logging.kubesphere.io/logsidecar-config: '{}'
        sidecar.istio.io/inject: 'false'
    spec:
      containers:
        - name: container-rt5e06
          imagePullPolicy: IfNotPresent
          image: 'mysql:5.6'
          ports:
            - name: tcp-3306
              protocol: TCP
              containerPort: 3306
              servicePort: 3306
          resources:
            requests:
              cpu: '0.1'
              memory: 100Mi
            limits:
              cpu: '1.5'
              memory: 2000Mi
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: zhiyong-mysql-secret
                  key: MYSQL_ROOT_PASSWORD
          volumeMounts:
            - readOnly: false
              mountPath: /var/lib/mysql
              name: zhiyong-mysql
      serviceAccount: default
      initContainers: []
      volumes: []
      imagePullSecrets: null
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 0
  serviceName: mysql-wordpress
  volumeClaimTemplates:
    - spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: local
      metadata:
        name: zhiyong-mysql
        namespace: word-press-project
totalReplicas: ''
---
apiVersion: v1
kind: Service
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: mysql-wordpress
    app.kubernetes.io/version: v1
    app.kubernetes.io/name: word-press
  annotations:
    kubesphere.io/serviceType: statefulservice
    kubesphere.io/description: 给WordPress用的MySQL
    servicemesh.kubesphere.io/enabled: 'false'
  name: mysql-wordpress
spec:
  sessionAffinity: None
  selector:
    app: mysql-wordpress
    app.kubernetes.io/version: v1
    app.kubernetes.io/name: word-press
  ports:
    - name: tcp-3306
      protocol: TCP
      port: 3306
      targetPort: 3306
  clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: wordpress
    app.kubernetes.io/version: v1
    app.kubernetes.io/name: word-press
  name: wordpress-v1
  annotations:
    servicemesh.kubesphere.io/enabled: 'false'
spec:
  replicas: 1
  selector:
    matchLabels:
      version: v1
      app: wordpress
      app.kubernetes.io/version: v1
      app.kubernetes.io/name: word-press
  template:
    metadata:
      labels:
        version: v1
        app: wordpress
        app.kubernetes.io/version: v1
        app.kubernetes.io/name: word-press
      annotations:
        logging.kubesphere.io/logsidecar-config: '{}'
        sidecar.istio.io/inject: 'false'
    spec:
      containers:
        - name: container-7ydkpj
          imagePullPolicy: IfNotPresent
          image: 'wordpress:4.8-apache'
          resources:
            requests:
              cpu: '0.1'
              memory: 100Mi
            limits:
              cpu: '1'
              memory: 2000Mi
          ports:
            - name: tcp-80
              protocol: TCP
              containerPort: 80
              servicePort: 80
          env:
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: zhiyong-wordpress-secret
                  key: WORDPRESS_DB_PASSWORD
            - name: WORDPRESS_DB_HOST
              value: mysql-wordpress
          volumeMounts:
            - name: volume-jsr71k
              readOnly: false
              mountPath: /var/www/html
      serviceAccount: default
      initContainers: []
      volumes:
        - name: volume-jsr71k
          persistentVolumeClaim:
            claimName: zhiyong-wordpress-pvc
      imagePullSecrets: null
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
---
apiVersion: v1
kind: Service
metadata:
  namespace: word-press-project
  labels:
    version: v1
    app: wordpress
    app.kubernetes.io/version: v1
    app.kubernetes.io/name: word-press
  annotations:
    kubesphere.io/serviceType: statelessservice
    kubesphere.io/description: WordPress服务
    servicemesh.kubesphere.io/enabled: 'false'
  name: wordpress
spec:
  sessionAffinity: None
  selector:
    app: wordpress
    app.kubernetes.io/version: v1
    app.kubernetes.io/name: word-press
  ports:
    - name: tcp-80
      protocol: TCP
      port: 80
      targetPort: 80

验证资源

耐心等一阵子,待拉取镜像和调度Pod成功后:

在这里插入图片描述

root@zhiyong-ksp1:/home/zhiyong# kubectl get pod -owide --all-namespaces | grep word
word-press-project             mysql-wordpress-v1-0                                              1/1     Running     0               14m     10.233.107.217   zhiyong-ksp1   <none>           <none>
word-press-project             wordpress-v1-799755f6cc-wjt54                                     1/1     Running     1 (5m34s ago)   14m     10.233.107.216   zhiyong-ksp1   <none>           <none>

此时PVC也挂载成功:

在这里插入图片描述

暴露服务

在这里插入图片描述

在这里插入图片描述

使用NodePort暴露即可。

暴露服务成功后:

在这里插入图片描述

直接使用IP+端口访问:

http://192.168.88.20:43302/

在这里插入图片描述

在这里插入图片描述

随便写点啥。然后访问:

http://192.168.88.20:43302/2023/05/29/伟大的虎鲸/

在这里插入图片描述

此时WordPress已经可用。。。

总结

KubeSphere的多租户做的还是比较完善,不能随意地使用超级管理员操作所有的功能。规范性也是相当的到位,划分了多种租户。必须遵循这套模式,按部就班地来。

通过这个简单的案例,K8S学徒工也可以照猫画虎部署一些应用了。平台化还是有好处的,让开发人员不必要掌握繁琐的kubectl命令,也无需专职的yaml攻城狮了。。。KubeSphere是个好东西。。。

K8S最适合的还是无状态的应用,所以简单的无状态应用【例如:Flink的实时ETL pipeline、简单规则的超限告警】都可以参照着这么玩了。。。

有状态应用要麻烦一点了。。。

K8S的Saas服务这么操作下来,应该也是可行的。。。

转载请注明出处:https://lizhiyong.blog.csdn.net/article/details/130939203

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/586494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音seo源码开发开源--MySQL语言

源码开发是指基于开放源代码的软件或应用程序进行开发和定制。开放源代码是指软件或应用程序的源代码是公开的&#xff0c;任何人都可以查看、修改和分享。源码开发者可以从开放的源代码中学习和了解软件的工作原理&#xff0c;并基于自己的需求进行修改、定制和扩展。开放源代…

chatgpt赋能python:Python字符串首字母大写的方法

Python字符串首字母大写的方法 Python是一种高级编程语言&#xff0c;广泛用于科学计算、Web开发和网络编程等多个领域。在Python编程中&#xff0c;我们常常需要将字符串首字母大写&#xff0c;以符合一些规范或要求。在本文中&#xff0c;我们将介绍Python中将字符串首字母大…

效率至少提升数倍的office技巧

在现代办公室&#xff0c;WPS Office已成为无可替代的工具之一。然而&#xff0c;许多办公室员工却未能充分发掘WPS Office的强大功能和技巧。在快节奏的工作环境中&#xff0c;掌握一些WPS Office的技巧&#xff0c;将帮助员工们提高工作效率、改善文件处理和团队协作能力。下…

用CSS来做一个动画案例

今天来做这么一个案例 添加一个动画实现上下渐变滚动的效果 首先还是我们HTML部分&#xff0c;一个大盒子装着五个子元素 下面别在意&#xff0c;之前写的时候看到有个网站有这么个注解我就复制了下来哈哈哈 <div class"loader"><div class"slider&…

【SpringCloud——Docker】

一、什么是Docker 二、Docker的基本操作 1、Docker操作镜像 镜像名称一般由两部分组成&#xff1a;[repository]:[tag] 在没有指定tag时&#xff0c;默认是latest&#xff0c;代表最新版本的镜像。 1.1、启动Docker服务 systemctl start docker1.2、查看Docker运行状态 syst…

34.序列中删除指定数组以及编写代码过程中遇到的问题

描述 有一个整数序列&#xff08;可能有重复的整数&#xff09;&#xff0c;现删除指定的某一个整数&#xff0c;输出删除指定数字之后的序列&#xff0c;序列中未被删除数字的前后位置没有发生改变。 数据范围&#xff1a;序列长度和序列中的值都满足 1≤&#xfffd;≤501≤…

外贸商城ERP系统-海外跨境电商平台【APP+小程序+PC多端同步商城系统】

外贸商城ERP跨境电商系统是帮助打开海外贸易&#xff0c;线上出海贸易的平台&#xff0c;欢迎名片探讨开发跨境电商系统&#xff0c;相互学习成长。 一、基础功能架构 跨境全球跨境贸易多语言无货源多国货币一键铺货后台采集多商户一件代发视频直播带货国JI化UI面板国际多类型…

音视频专栏-DTSPTS

一&#xff0c;网上很多人都在讲dts和pts&#xff0c;但是么有几个人把这个问题讲清楚&#xff0c;讲明白的&#xff0c;甚至很多做了很多年的音视频开发的人都搞不明白&#xff0c;今天我把原理图整理下&#xff0c;和大家一起学习&#xff0c;如有问题&#xff0c;欢迎批评指…

电子科技大学编译原理复习笔记(六):自上而下的语法分析

目录 前言 重点一览 引言 语法分析的功能 语法分析的分类 自上而下分析方法 回溯分析法 回溯分析法例子 方法 存在的问题 产生的原因 特点 解决缺陷 消除回溯&#xff08;重点&#xff09; 递归下降分析器 递归下降分析法 递归过程的构造 扩充BNF 改进的递…

MATLAB机器学习:分类、回归和聚类的算法实现和模型优化

第一章&#xff1a;引言 机器学习是当今IT领域最热门的话题之一&#xff0c;它为我们提供了解决复杂问题的新方法。MATLAB作为一种功能强大的编程语言和环境&#xff0c;提供了许多用于机器学习的工具和函数。本文将介绍MATLAB中常用的分类、回归和聚类算法的实现&#xff0c;…

chatgpt赋能python:Python中将数字倒序:一种简单的方法提高代码效率

Python中将数字倒序&#xff1a;一种简单的方法提高代码效率 数字倒序是Python中一种实用的操作。网站开发者和数据分析师通常需要对数字进行反转&#xff0c;以使其更容易阅读和理解。虽然有多种方法可以实现数字反转&#xff0c;但在绝大多数情况下&#xff0c;使用Python中…

详解浏览器渲染原理及流程

今天来分享一下浏览器的渲染原理及流程。 前言 先来看看 Chrome 浏览器的多进程架构&#xff1a; 通常&#xff0c;我们打包出来的 HTML、CSS、JavaScript 等文件&#xff0c;经过浏览器运行之后就会显示出页面&#xff0c;这个过程就是浏览器的渲染进程来操作实现的&#xf…

Windows安装和启动SSH服务

前言 作者在做项目时遇到需要从Windows系统远程传文件到Ubuntu系统&#xff0c;Ubuntu系统这边使用了gFTP的文件传输工具&#xff0c;但是远程Windows时发现老是连接不上&#xff0c;后面发现是Windows这边没有开启SSH服务。 找了一些文章&#xff0c;结合自己的操作把配置方法…

基于工业互联网的RV1126+AI安防单目/双目高清视觉分析计数仪方案

1产品简介 产品介绍 单目视觉分析计数器是信迈科技基于单目图像分析以及深度学习算法研发的一款区域统计计数器。它可以精确的识别监控区域内的物体&#xff0c;统计区域内停驻的人数/车辆等&#xff0c;也可以统计区域内进入以及离开人数。它可适用于公交车&#xff0c;大巴&…

旧衣回收小程序开发需具备哪些功能呢?

旧衣回收小程序开发需具备哪些功能呢&#xff1f; 1、预约回收。只要通过手机小程序进行预约就可以进行上门回收旧衣&#xff0c;平台会根据预约的时间安排就近回收员上门进行回收废旧衣服。或者用户直接在小程序上点击捐赠&#xff0c;填写地址信息、时间、联系方式等待…

Android进阶 View的工作原理:源码分析View的三大工作流程

Android进阶 View的工作原理&#xff1a;源码分析View的三大工作流程 导语 想象一下&#xff0c;如果我们要画画&#xff0c;把画画的流程拆分的话&#xff0c;那么应该分几个部分呢&#xff1f;一般来说&#xff0c;专业的画师会进行提前构图&#xff0c;然后再进行绘画最后上…

docker hub 访问不了,可以进行拉取和推送,但是不能进行注册登陆了,界面找不到了,大家一起讨论看看有什么好的解决办法。

1&#xff0c;docker hub 不能访问了 在 oschina 的地方找找了文章和原因&#xff1a; https://www.oschina.net/comment/news/241627 2&#xff0c;通过啥方式进行访问呢&#xff1f; 目前配置源还是可以正常的pull 和 push 的。 {"data-root": "/data/doc…

数据链路层:可靠传输

1.数据链路层&#xff1a;可靠传输 笔记来源&#xff1a; 湖科大教书匠&#xff1a;可靠传输的基本概念 湖科大教书匠&#xff1a;可靠传输的实现机制–停止等待协议SW 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 可靠传输的基本概念 接收…

Rust 笔记:WebAssembly 的 JavaScript API

WebAssembly WebAssembly 的 JavaScript API 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/ar…

2023/5/29总结

abstract修饰符 抽象类就是当类和类之间有相同特征时&#xff0c;将这些共同的特征提取出来&#xff0c;形成的就是抽象类。 抽象类的特点&#xff1a; 抽象类和抽象方法必须使用abstract 关键字修饰&#xff1a;publicabstract class 类名 / public abstract void eat();抽象…