• [技术干货] 一键部署k8s最终版2
    模块二 容器云(30 分)任务 1 容器云服务搭建(5 分)2.1.1 部署容器云平台使用 OpenStack 私有云平台创建两台云主机,分别作为 Kubernetes 集群的 master 节点和 node 节点,然后完成 Kubernetes 集群的部署,并完成 Istio 服务网 格、KubeVirt 虚拟化和 Harbor 镜像仓库的部署。创建俩台云主机并配网# Kubernetes 集群的部署[root@localhost ~]# mount -o loop chinaskills_cloud_paas_v2.0.2.iso /mnt/[root@localhost ~]# cp -rfv /mnt/* /opt/[root@localhost ~]# umount /mnt/[root@master ~]# hostnamectl set-hostname master && su[root@worker ~]# hostnamectl set-hostname worker && su# 安装kubeeasy[root@master ~]# mv /opt/kubeeasy /usr/bin/kubeeasy# 安装依赖环境[root@master ~]# kubeeasy install depend \--host 192.168.59.200,192.168.59.201 \--user root \--password 000000 \--offline-file /opt/dependencies/base-rpms.tar.gz# 安装k8s[root@master ~]# kubeeasy install k8s \--master 192.168.59.200 \--worker 192.168.59.201 \--user root \--password 000000 \--offline-file /opt/kubernetes.tar.gz# 安装istio网络[root@master ~]# kubeeasy add --istio istio # 安装kubevirt虚拟化[root@master ~]# kubeeasy add --virt kubevirt# 安装harbor仓库[root@master ~]# kubeeasy add --registry harbor[root@k8s-master-node1 ~]# vim pod.yamlapiVersion: v1kind: Podmetadata:  name: examspec:  containers:  - name: exam    image: nginx:latest    imagePullPolicy: IfNotPresent    env:    - name: exam      value: "2022"[root@k8s-master-node1 ~]# kubectl apply -f pod.yaml[root@k8s-master-node1 ~]# kubectl get pod#部署 Istio 服务网格[root@k8s-master-node1 ~]# kubectl create ns examnamespace/exam created[root@k8s-master-node1 ~]# kubectl edit ns exam更改为:  labels:    istio-injection: enabled[root@k8s-master-node1 ~]# kubectl describe ns exam  #查看任务 2 容器云服务运维(15 分)2.2.1 容器化部署 MariaDB编写 Dockerfile 文件构建 mysql 镜像,要求基于 centos 完成 MariaDB 数据 库的安装与配置,并设置服务开机自启。上传Hyperf.tar.gz包[root@k8s-master-node1 ~]#tar -zxvf Hyperf.tar.gz &&cd hyperf[root@k8s-master-node1 hyperf]#vim local.repo[yum]name=yumbaseurl=file:///root/yumgpgcheck=0enabled=1[root@k8s-master-node1 hyperf]#vim mysql_init.sh#!/bin/bashmysql_install_db --user=rootmysqld_safe --user=root & sleep 8;mysqladmin -u root password 'root'mysql -uroot -proot -e "grant all on *.* to 'root'@'%' identified by 'root'; flush privileges;"mysql -uroot -proot -e " create database jsh_erp;use jsh_erp;source /opt/hyperf_admin.sql;"[root@k8s-master-node1 hyperf]# vim Dockerfile-mariadbFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*COPY local.repo /etc/yum.repos.d/COPY yum /root/yumRUN yum install mariadb-server -yCOPY hyperf_admin.sql /opt/COPY mysql_init.sh /opt/RUN bash /opt/mysql_init.shEXPOSE 3306CMD ["mysqld_safe","--user=root"][root@k8s-master-node1 hyperf]# docker build -t hyperf-mariadb:v1.0 -f Dockerfile-mariadb .2.2.2 容器化部署 Redis编写 Dockerfile 文件构建 redis 镜像,要求基于 centos 完成 Redis 服务的安 装和配置,并设置服务开机自启。[root@k8s-master-node1 hyperf]# vim Dockerfile-redis FROM centos:7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD local.repo /etc/yum.repos.d/ADD yum /root/yumRUN yum install redis -yRUN sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis.confRUN sed -i 's/protected-mode yes/proteceted-mode no/g' /etc/redis.confEXPOSE 6379CMD ["redis-server","/etc/redis.conf"]   [root@k8s-master-node1 hyperf]# docker build -t hyperf-redis:v1.0 -f Dockerfile-redis .2.2.3 容器化部署 Nginx编写 Dockerfile 文件构建 nginx 镜像,要求基于 centos 完成 Nginx 服务的安 装和配置,并设置服务开机自启。[root@k8s-master-node1 hyperf]# vim Dockerfile-nginxFROM centos:7.9.2009MAINTAINER chinaskillsRUN rm -rf /etc/yum.repos.d/*ADD local.repo /etc/yum.repos.d/ADD yum /root/yumRUN yum install nginx -yRUN /bin/bash -c 'echo init ok'EXPOSE 80CMD ["nginx","-g","daemon off;"][root@k8s-master-node1 hyperf]# docker build -t hyperf-nginx:v1.0 -f Dockerfile-nginx .2.2.4 容器化部署 Explorer编写 Dockerfile 文件构建 explorer 镜像,要求基于 centos 完成 PHP 和 HTTP 环境的安装和配置,并设置服务开机自启。上传Explorer.tar.gz包[root@k8s-master-node1 ~]#tar -zxvf Explorer.tar.gz & cd KodExplorer/[root@k8s-master-node1 KodExplorer/]#vim local.repo[yum]name=yumbaseurl=file:///root/yumgpgcheck=0enabled=1[root@k8s-master-node1 KodExplorer/]#vim mysql_init.sh#!/bin/bashmysql_install_db --user=rootmysqld_safe --user=root & sleep 8;mysqladmin -u root password 'root'mysql -uroot -proot -e "grant all on *.* to 'root'@'%' identified by 'root'; flush privileges;"[root@k8s-master-node1 KodExplorer/]#vim Dockerfile-mariadbFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*COPY local.repo /etc/yum.repos.d/COPY yum /root/yumRUN yum install mariadb mariadb-server -yCOPY mysql_init.sh /opt/RUN bash /opt/mysql_init.shEXPOSE 3306CMD ["mysqld_safe","--user=root"][root@k8s-master-node1 KodExplorer/]# docker build -t kod-mysql:v1.0 -f Dockerfile-mariadb .[root@k8s-master-node1 KodExplorer/]# vim Dockerfile-redis FROM centos:7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD local.repo /etc/yum.repos.d/ADD yum /root/yumRUN yum install redis -yRUN sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis.confRUN sed -i 's/protected-mode yes/proteceted-mode no/g' /etc/redis.confEXPOSE 6379CMD ["redis-server","/etc/redis.conf"] [root@k8s-master-node1 KodExplorer/]# docker build -t kod-redis:v1.0 -f Dockerfile-redis .[root@k8s-master-node1 KodExplorer/]# vim Dockerfile-nginxFROM centos:7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD local.repo /etc/yum.repos.d/ADD yum /root/yumRUN yum install nginx -yRUN /bin/bash -c 'echo init ok'EXPOSE 80CMD ["nginx","-g","daemon off"][root@k8s-master-node1 KodExplorer/]# docker build -t kod-nginx:v1.0 -f Dockerfile-nginx .[root@k8s-master-node1 KodExplorer]# vim Dockerfile-phpFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*COPY local.repo /etc/yum.repos.d/COPY yum /root/yumRUN yum install httpd php php-cli unzip php-gd php-mbstring -yWORKDIR /var/www/htmlCOPY php/kodexplorer4.37.zip .RUN unzip kodexplorer4.37.zipRUN chmod -R 777 /var/www/htmlRUN sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /etc/httpd/conf/httpd.conf EXPOSE 80CMD ["/usr/sbin/httpd","-D","FOREGROUND"]RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-develEXPOSE 9999CMD java -jar /root/app.jarSSS[root@k8s-master-node1 KodExplorer]#docker build -t kod-php:v1.0 -f Dockerfile-php .2.2.5 编排部署 Explorer编写 docker-compose.yaml 文件,要求使用镜像 mysql、redis、nginx 和 explorer 完成 Explorer 管理系统的编排部署。[root@k8s-master-node1 KodExplorer]# vi docker-compose.yamlversion: '3.2'services:                mysql:             container_name: mysql             image: kod-mysql:v1.0             volumes:                    - ./data/mysql:/var/lib/mysql                    - ./mysql/logs:/var/lib/mysql-logs             ports:                    - "3306:3306"             restart: always        redis:             container_name: redis             image:  kod-redis:v1.0             ports:                     - "6379:6379"             volumes:                     - ./data/redis:/data                     - ./redis/redis.conf:/usr/local/etc/redis/redis.conf             restart: always             command: redis-server /usr/local/etc/redis/redis.confnginx:             container_name: nginx             image: kod-nginx:v1.0             volumes:                    - ./www:/data/www                    - ./nginx/logs:/var/log/nginx             ports:                    - "443:443"             restart: always             depends_on:                    - php-fpm             links:                    - php-fpm             tty: true         php-fpm:             container_name: php-fpm             image: kod-php:v1.0             ports:                     - "8090:80"             links:                     - mysql                     - redis             restart: always             depends_on:                     - redis                     - mysql[root@k8s-master-node1 KodExplorer/]#docker-compose up -d    #如果容器已经存在用docker stop id和docker rm id 来删除已存在容器  #查看服务[root@k8s-master-node1 KodExplorer/]#docker-compose ps在浏览器上通过http://IP:8090访问KodExplorer账号admin2.2.6 安装 GitLab 环境 新建命名空间 kube-ops,将 GitLab 部署到该命名空间下,然后完成 GitLab 服务的配置。上传CICD-Runner.tar.gz包[root@k8s-master-node1 ~]#tar -zxvf CICD-Runner.tar.gz[root@k8s-master-node1 ~]#cd cicd-runner/[root@k8s-master-node1 cicd-runner]# docker load -i images/image.tar[root@k8s-master-node1 cicd-runner]# kubectl create ns kube-opsnamespace/kube-ops created[root@k8s-master-node1 cicd-runner]# kubectl create deployment gitlab -n kube-ops --image=yidaoyun/gitlab-ce:v1.0 --port 80 --dry-run -o yaml > gitlab.yaml[root@k8s-master-node1 cicd-runner]# vim gitlab.yamlapiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: kube-opsspec:  replicas: 1  selector:    matchLabels:      app: gitlab  #strategy: {}  template:    metadata:      #creationTimestamp: null      labels:        app: gitlab    spec:      containers:      - image: yidaoyun/gitlab-ce:v1.0        imagePullPolicy: IfNotPresent        name: gitlab-ce        ports:        - containerPort: 80        env:        - name: GITLAB_ROOT_PASSWORD          value: 'admin123456'[root@k8s-master-node1 cicd-runner]# kubectl apply -f gitlab.yaml deployment.apps/gitlab created[root@k8s-master-node1 cicd-runner]# kubectl get pod -n kube-ops NAME                     READY   STATUS    RESTARTS   AGEgitlab-df897d46d-vcjf6   1/1     Running   0          7s[root@k8s-master-node1 cicd-runner]# kubectl expose deployment gitlab -n kube-ops gitlab --port 80 --target-port 30880 --type NodePort --dry-run -o yaml >> gitlab.yaml [root@k8s-master-node1 cicd-runner]# vim gitlab.yamlapiVersion: v1kind: Servicemetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: kube-opsspec:  ports:  - port: 80    protocol: TCP    nodePort: 30880  selector:    app: gitlab  type: NodePort[root@k8s-master-node1 cicd-runner]# kubectl apply -f gitlab.yaml service/gitlab created[root@k8s-master-node1 cicd-runner]# kubectl get svc -n kube-ops NAME     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGEgitlab   NodePort   10.96.133.116   <none>        80:30880/TCP   14s2.2.7 部署 GitLab Runner(x)将 GitLab Runner 部署到 kube-ops 命名空间下,并完成 GitLab Runner 在 GitLab 中的注册。百度打开192.168.59.200:30880root admin123456 #在这里获取部署runner的URL和令牌48XdJ5KYGoJPYjaa71gi [root@k8s-master-node1 cicd-runner]# cd manifests/[root@k8s-master-node1 manifests]# vim runner-configmap.yamlapiVersion: v1data:  REGISTER_NON_INTERACTIVE: "true"  REGISTER_LOCKED: "false"  METRICS_SERVER: "0.0.0.0:9100"  CI_SERVER_URL: "http://192.168.59.200:30880"  RUNNER_REQUEST_CONCURRENCY: "4"   RUNNER_EXECUTOR: "kubernetes"  KUBERNETES_NAMESPACE: "kube-ops"  KUBERNETES_PRIVILEGED: "true"  KUBERNETES_CPU_LIMIT: "1"[root@k8s-master-node1 manifests]#echo -n "48XdJ5KYGoJPYjaa71gi" | base64NDhYZEo1S1lHb0pQWWphYTcxZ2k=[root@k8s-master-node1 manifests]# kubectl create secret generic gitlab-ci-runner -n kube-ops --from-literal=NDhYZEo1S1lHb0pQWWphYTcxZ2k= --dry-run -o yaml > runner-statefulset.yaml# 进入添加labels字段即可[root@k8s-master-node1 manifests]# vim runner-statefulset.yamlapiVersion: v1data:  GITLAB_CI_TOKEN: NDhYZEo1S1lHb0pQWWphYTcxZ2k=kind: Secretmetadata:  name: gitlab-ci-runner  namespace: kube-ops  labels:    app: gitlab-ci-runner---apiVersion: apps/v1kind: StatefulSetmetadata:  name: gitlab-ci-runner  namespace: kube-ops  labels:    app: gitlab-ci-runnerspec:  serviceName: gitlab-ci-runner  updateStrategy:    type: RollingUpdate  replicas: 2  selector:    matchLabels:      app: gitlab-ci-runner  template:    metadata:      labels:        app: gitlab-ci-runner    spec:      securityContext:        runAsNonRoot: true # 则容器会以非 root 用户身份运行        runAsUser: 999        supplementalGroups: [999]      containers:      - image: yidaoyun/gitlab-runner:v1.0        imagePullPolicy: IfNotPresent        name: gitlab-runner        ports:        - containerPort: 9100        command:        - /scripts/run.sh        envFrom:        - configMapRef:            name: gitlab-ci-runner-cm        - secretRef:            name: gitlab-ci-token        env:        - name: RUNNER_NAME          valueFrom:            fieldRef:              fieldPath: metadata.name        volumeMounts:        - name: gitlab-ci-runner-scripts          mountPath: /scripts          readOnly: true # 将卷只读挂载到容器内      volumes:      - name: gitlab-ci-runner-scripts        projected:          sources:          - configMap:              name: gitlab-ci-runner-scripts              items:              - key: run.sh                path: run.sh                mode: 0775      restartPolicy: Always # 依次启动[root@k8s-master-node1 manifests]# kubectl apply -f runner-configmap.yaml configmap/gitlab-ci-runner-cm created[root@k8s-master-node1 manifests]# kubectl apply -f runner-scripts-configmap.yamlconfigmap/gitlab-ci-runner-scripts created[root@k8s-master-node1 manifests]# kubectl apply -f runner-statefulset.yamlsecret/gitlab-ci-token createdstatefulset.apps/gitlab-ci-runner created[root@k8s-master-node1 manifests]# kubectl get pod -n kube-opsNAME                     READY   STATUS    RESTARTS   AGEgitlab-ci-runner-0       1/1     Running   0          14sgitlab-ci-runner-1       1/1     Running   0          12sgitlab-df897d46d-vcjf6   1/1     Running   0          16h2.2.8 配置 GitLab 在 GitLab 中新建公开项目并导入离线项目包,然后将 Kubernetes 集群添加 到 GitLab 中。 [root@k8s-master-node1 cicd-runner]# cd springcloud/[root@k8s-master-node1 springcloud]# git config --global user.name "Administrator"[root@k8s-master-node1 springcloud]# git config --global user.email "admin@example.com"[root@k8s-master-node1 springcloud]# git remote remove origin[root@k8s-master-node1 springcloud]# git remote add origin http://192.168.59.200:30880/root/springcloud.git[root@k8s-master-node1 springcloud]# git add .warning: You ran 'git add' with neither '-A (--all)' or '--ignore-removal',whose behaviour will change in Git 2.0 with respect to paths you removed.Paths like '.gitlab-ci.yml' that areremoved from your working tree are ignored with this version of Git.* 'git add --ignore-removal <pathspec>', which is the current default,  ignores paths you removed from your working tree.* 'git add --all <pathspec>' will let you also record the removals.Run 'git status' to check the paths you removed from your working tree.[root@k8s-master-node1 springcloud]# git commit -m "Initial commit"[master db17cb0] Initial commit 1 file changed, 2 insertions(+)[root@k8s-master-node1 springcloud]# git push -u origin masterUsername for 'http://10.24.206.143:30880': root  # gitlab用户Password for 'http://root@10.24.206.143:30880':(admin123456)  # gitlab密码Counting objects: 1355, done.Delta compression using up to 4 threads.Compressing objects: 100% (1000/1000), done.Writing objects: 100% (1355/1355), 4.05 MiB | 0 bytes/s, done.Total 1355 (delta 269), reused 1348 (delta 266)remote: Resolving deltas: 100% (269/269), done.To http://10.24.206.143:30880/root/springcloud.git * [new branch]      master -> masterBranch master set up to track remote branch master from origin.    # 获取CA证书[root@k8s-master-node1 springcloud]# cat /etc/kubernetes/pki/ca.crt-----BEGIN CERTIFICATE-----MIIC/jCCAeagAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJlcm5ldGVzMB4XDTI0MDIyNTAzNDAxNloXDTM0MDIyMjAzNDAxNlowFTETMBEGA1UEAxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJUJPs6NpgvLNhrdFFyAO3P8IRwNJM25ijz3rtdO46a1dXXsWN6nVBzmXcYr7QkK9l1V/X5o8dxS46LXVbwO5gtOtO6Zu0NO55msTVw+HEHoPj2fh9s1tN4WCmtaCzHLz7Cgw90ze4/SdVx60t58xjzo9vEr6lCb3A39Qqh7DUCyu6J9XuhsjdCx+nPZv6rrKqm1Fnq4bx4zc4WAfoT4pQ21EQnlLfzKsI34FZjEFXKYSZn+94XXouY5E3Z+DSp9QJOf/FJtQ5w5f+/58U5s1ja/iEnBOUupn+f5oKbzZHJbk5prPA+vzOce8hQ4+LUcnoJkfxrTK6KHi5UMQQOtjTMCAwEAAaNZMFcwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHY2aLho7/Eab1m6sJgCq4l/fwDfMBUGA1UdEQQOMAyCCmt1YmVybmV0ZXMwDQYJKoZIhvcNAQELBQADggEBAG91Daj4DylMJPkF1kbaQsbC6w45gI0A8wqL5dF4Y6FyPNMwUO28t8WBvcsiZ34u5Z67bDx9joYme/0kf/0kD5w1uBewNt0ronpeTYDsOq+yILRyY5XEY3CdKTXzkst0BkMjttfTHKHOfDy+/OmpeDtIKopp/BcyRYEQih7Givp1ITqhBQQm8kp6TAU2m0QrtlhebN6349LGOz2CxoQsp0YikqnEoFjaFSvn40vI6ttdek3cyQAEoNTTQ+zwz80IXCt3ODk1qBYRZdc10aXLszNtZ0MN2vbKRsJjmvihWBEmjO58DyV/H2ebXMKStBzbK5v4mjKW1Jg9ilra6fGSH8I=-----END CERTIFICATE-----# 获取令牌[root@k8s-master-node1 springcloud]# kubectl describe secrets -n kube-system default-token-h8h7n Name:         default-token-tgz8rNamespace:    kube-systemLabels:       <none>Annotations:  kubernetes.io/service-account.name: default              kubernetes.io/service-account.uid: d4111b82-49c8-481b-83ff-ff2619eb3d1b Type:  kubernetes.io/service-account-token Data====ca.crt:     1099 bytesnamespace:  11 bytestoken:      eyJhbGciOiJSUzI1NiIsImtpZCI6IjN0Z3RzNDdfT3FGc0pHalJKWi1ZcHZ5TTF4cDB6X2duLWxhanViVkJXLVUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLXRnejhyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkNDExMWI4Mi00OWM4LTQ4MWItODNmZi1mZjI2MTllYjNkMWIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.RfWmtTwtY-WOXIibVOOsRjcvJRktI9O0pFOpR-VtjfJKVAuwwjxinQC8LaGvFZK9kooTvf1GKA261awk45uj-hZjN7T2rK9glea-D8YqwFRR5y7G6uU_SCqho2h1qC6T6ax30XCMuVgWe5RuvG0rXB1qnT72vy72K2iSCb9M7SuuqI-kElvf5M1l0zmrvN9xCvKebVtwt2hIuMAJW2fgNhiEMmHaXPVmVUYr_G5jrtP73HoDclGC2i2elJAySJXek7pxyzmaOlP7jWXYhaXjiU5BvX_PSUfLSt2PVpOEANNUyBowfZkOhIyoc0QQSd7-Wi0gx3Sd9hMwH7LXHRmt-w- 将获取的信息分别填入 2.2.9 构建 CI/CD 在项目中编写流水线脚本,然后触发自动构建,要求成构建代码、构建镜 像、推送镜像 Harbor、并发布服务到 Kubernetes 集群。  将tcp://localhost:2375改为tcp://docker-dind:2375[root@k8s-master-node1 springcloud]# kubectl edit -n kube-system cm coredns # 53后面添加一个gitlab# 添加映射[root@k8s-master-node1 ~]# cat /etc/hosts192.168.100.23 apiserver.cluster.local # 选择这一行# 登录harbor仓库[root@k8s-master-node1 springcloud]# docker login 192.168.59.200Username: adminPassword: (Harbor12345)WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. See[root@k8s-master-node1 springcloud]# cd ..[root@k8s-master-node1 cicd-runner]# vim DockerfileFROM nginx:latestRUN echo "Hello Golang In Gitlab CI,go1.10.3,/bin/app" >> /usr/share/nginx/html/index.html[root@k8s-master-node1 cicd-runner]# docker build -t 10.24.206.143/library/springcloud:master -f Dockerfile .Sending build context to Docker daemon  2.892GBStep 1/2 : FROM nginx:latest ---> de2543b9436bStep 2/2 : RUN echo "Hello Golang In Gitlab CI,go1.10.3,/bin/app" >> /usr/share/nginx/html/index.html ---> Running in a5b69ead6f7fRemoving intermediate container a5b69ead6f7f ---> 193d60448c3dSuccessfully built 193d60448c3dSuccessfully tagged 10.24.206.143/library/springcloud:master[root@k8s-master-node1 cicd-runner]# docker push 10.24.206.143/library/springcloud:master The push refers to repository [10.24.206.143/library/springcloud]09c5777979b4: Pushed a059c9abe376: Pushed 09be960dcde4: Pushed 18be1897f940: Pushed dfe7577521f0: Pushed d253f69cb991: Pushed fd95118eade9: Pushed master: digest: sha256:95218b2f4822bdbe6f937c74b3fe7879998385cd04d74c241e5706294239ee29 size: 177[root@k8s-master-node1 cicd-runner]# kubectl create ns gitlabnamespace/gitlab created# 使用刚刚生成的镜像[root@k8s-master-node1 cicd-runner]# vim deploymeng.yamlapiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: gitlab-k8s-demo-dev  name: gitlab-k8s-demo-dev  namespace: gitlabspec:  replicas: 2  selector:    matchLabels:      app: gitlab-k8s-demo-dev  strategy: {}  template:    metadata:      creationTimestamp: null      labels:        app: gitlab-k8s-demo-dev    spec:      containers:      - image: 10.24.206.143/library/springcloud:master        name: springcloud        imagePullPolicy: IfNotPresent        ports:        - containerPort: 80---apiVersion: v1kind: Servicemetadata:  name: gitlab-k8s-demo-dev  namespace: gitlabspec:  ports:  - port: 80    nodePort: 30800  selector:    app: gitlab-k8s-demo-dev  type: NodePort[root@k8s-master-node1 cicd-runner]# kubectl apply -f deploymeng.yaml deployment.apps/gitlab-k8s-demo-dev createdservice/gitlab-k8s-demo-dev configured[root@k8s-master-node1 cicd-runner]# kubectl get deployments.apps -n gitlab NAME                  READY   UP-TO-DATE   AVAILABLE   AGEgitlab-k8s-demo-dev   2/2     2            2           2m11s[root@k8s-master-node1 cicd-runner]# kubectl get pod -n gitlab NAME                                   READY   STATUS    RESTARTS   AGEgitlab-k8s-demo-dev-76c8494bdd-hcwwd   1/1     Running   0          101sgitlab-k8s-demo-dev-76c8494bdd-hfm2n   1/1     Running   0          101s[root@k8s-master-node1 cicd-runner]# kubectl get svc -n gitlab NAME                  TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGEgitlab-k8s-demo-dev   NodePort   10.96.99.185   <none>        80:30800/TCP   31m2.2.10 服务网格:路由管理 将 Bookinfo 应用部署到 default 命名空间下,应用默认请求路由,将所有流 量路由到各个微服务的 v1 版本。然后更改请求路由 reviews,将指定比例的流量 从 reviews 的 v1 转移到 v3。[root@k8s-master-node1 ServiceMesh]# vim route.yamlapiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: reviews-routespec:  hosts: # 将流量路由到指定主机  - reviews  http:  - name: "v1"    route: # 定义路由转发目的地列表(所有http流量都会被路由到标签为version:v1的reviews服务上)    - destination:        host: reviews        subset: v1  - name: "v2"    match:    - uri:        prefix: "/wpcatalog"    - uri:        prefix: "/consumercatalog"    rewrite: # 定义重写HTTP URL 或 Authority headers,不能与重定向同时配置,重写操作会在转发前执行      uri: "/newcatalog"    route:    - destination:        host: reviews        subset: v2[root@k8s-master-node1 ServiceMesh]# kubectl apply -f route.yamlvirtualservice.networking.istio.io/reviews-route created 【检测命令1】[0.5分]kubectl get virtualservice reviews-route -o jsonpath={.spec.http[*].match}【判分标准】"uri":{"prefix":"/wpcatalog"} || "uri":{"prefix":"/consumercatalog"}【检测命令2】[0.5分]kubectl get virtualservice reviews-route -o jsonpath={.spec.http[*].rewrite}【判分标准】{"uri":"/newcatalog"}2.2.11 KubeVirt 运维:VMI 管理 将提供的镜像在default命名空间下创建一台VMI,名称为exam,使用Service 对外暴露 VMI。[root@k8s-master-node1 ~]# vim Dockerfile FROM scratchADD exam.qcow2 /disk/[root@k8s-master-node1 ~]# docker build -t exam:v1.0 -f Dockerfile . [root@k8s-master-node1 ~]# vim exam.yaml apiVersion: kubevirt.io/v1kind: VirtualMachineInstancemetadata:  name: exam  labels:    app: examspec:  domain:    devices:      disks:      - name: containerdisk        disk:          bus: virtio      - name: cloudinitnodisk        disk:          bus: virtio    resources:      requests:        memory: 512Mi  volumes:    - name: containerdisk      containerDisk:        image: exam:v1.0        imagePullPolicy: IfNotPresent    - name: cloudinitnodisk      cloudInitNoCloud:        userData: |-          hostname: exam---apiVersion: v1kind: Servicemetadata:  creationTimestamp: null  name: exam  labels:    app: examspec:  ports:  - name: 80-80    port: 80    nodePort: 30082 # 节点端口    protocol: TCP    targetPort: 80 # 目标端口  selector:    app: exam  type: NodePort[root@k8s-master-node1 ~]# kubectl apply -f exam.yamlvirtualmachineinstance.kubevirt.io/exam createdservice/exam created[root@k8s-master-node1 ~]# kubectl get vmiNAME   AGE   PHASE     IP            NODENAME           READYexam   60s   Running   10.244.0.50   k8s-master-node1   True
  • [技术干货] 一键部署k8s最终版
    1. 控制节点主机名为 controller,设置计算节点主机名为 compute;[root@controller ~]# hostnamectl set-hostname controller && su[root@compute ~]# hostnamectl set-hostname compute && su2.hosts 文件将 IP 地址映射为主机名。[root@controller&&compute ~]#vi /etc/hosts192.168.100.10 controller192.168.100.20 compute[root@controller&&compute ~]#vi /etc/selinux/config更改SELINUX=disabled[root@controller&&compute ~]#setenforce 0[root@controller&&compute ~]#systemctl stop firewalld && systemctl disable firewalld3.配置 yum 源[root@controller ~]rm -rf /etc/yum.repos.d/*[root@controller&&compute ~]# vi /etc/yum.repos.d/http.repo[centos]name=centosbaseurl=http://192.168.133.130/centosgpgcheck=0enabled=1 [openstack]name=openstackbaseurl=http://192.168.133.130/openstack/iaas-repogpgcheck=0enabled=1[root@controller&&compute ~]#yum clean all && yum repolist && yum makecache 2.1.1 部署容器云平台使用 OpenStack 私有云平台创建两台云主机,分别作为 Kubernetes 集群的 master 节点和 node 节点,然后完成 Kubernetes 集群的部署,并完成 Istio 服务网 格、KubeVirt 虚拟化和 Harbor 镜像仓库的部署。创建俩台云主机并配网# Kubernetes 集群的部署[root@localhost ~]# mount -o loop chinaskills_cloud_paas_v2.0.2.iso /mnt/[root@localhost ~]# cp -rfv /mnt/* /opt/[root@localhost ~]# umount /mnt/[root@master ~]# hostnamectl set-hostname master && su[root@worker ~]# hostnamectl set-hostname worker && su# 安装kubeeasy[root@master ~]# mv /opt/kubeeasy /usr/bin/kubeeasy# 安装依赖环境[root@master ~]# kubeeasy install depend \--host 192.168.59.200,192.168.59.201 \--user root \--password 000000 \--offline-file /opt/dependencies/base-rpms.tar.gz# 安装k8s[root@master ~]# kubeeasy install k8s \--master 192.168.59.200 \--worker 192.168.59.201 \--user root \--password 000000 \--offline-file /opt/kubernetes.tar.gz# 安装istio网格[root@master ~]# kubeeasy add --istio istio# 安装kubevirt虚拟化[root@master ~]# kubeeasy add --virt kubevirt# 安装harbor仓库[root@master ~]# kubeeasy add --registry harbor[root@k8s-master-node1 ~]# vim pod.yamlapiVersion: v1kind: Podmetadata:  name: examspec:  containers:  - name: exam    image: nginx:latest    imagePullPolicy: IfNotPresent    env:    - name: exam      value: "2022"[root@k8s-master-node1 ~]# kubectl apply -f pod.yaml[root@k8s-master-node1 ~]# kubectl get pod#部署 Istio 服务网格[root@k8s-master-node1 ~]# kubectl create ns examnamespace/exam created[root@k8s-master-node1 ~]# kubectl edit ns exam更改为:  labels:    istio-injection: enabled[root@k8s-master-node1 ~]# kubectl describe ns exam  #查看任务 2 容器云服务运维(15 分)2.2.1 容器化部署 Node-Exporter编写 Dockerfile 文件构建 exporter 镜像,要求基于 centos 完成 Node-Exporter 服务的安装与配置,并设置服务开机自启。上传Hyperf.tar包[root@k8s-master-node1 ~]#tar -zxvf Hyperf.tar.gz[root@k8s-master-node1 ~]#cd hyperf/[root@k8s-master-node1 hyperf]#docker load -i centos_7.9.2009.tar上传node_exporter-1.7.0.linux-amd64.tar包[root@k8s-master-node1 hyperf]#vim Dockerfile-exporterFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD node_exporter-1.7.0.linux-amd64.tar.gz /root/EXPOSE 9100ENTRYPOINT ["./root/node_exporter-1.7.0.linux-amd64/node_exporter"][root@k8s-master-node1 hyperf]#docker build -t monitor-exporter:v1.0 -f Dockerfile-exporter .2.2.2 容器化部署Alertmanager编写 Dockerfile 文件构建 alert 镜像,要求基于 centos:latest 完成 Alertmanager 服务的安装与配置,并设置服务开机自启。上传alertmanager-0.26.0.linux-amd64.tar包[root@k8s-master-node1 hyperf]#vim Dockerfile-alertFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD alertmanager-0.26.0.linux-amd64.tar.gz /root/EXPOSE 9093 9094ENTRYPOINT ["./root/alertmanager-0.26.0.linux-amd64/alertmanager","--config.file","/root/alertmanager-0.26.0.linux-amd64/alertmanager.yml"][root@k8s-master-node1 hyperf]#docker build -t monitor-alert:v1.0 -f Dockerfile-alert .2.2.3 容器化部署 Grafana编写 Dockerfile 文件构建 grafana 镜像,要求基于 centos 完成 Grafana 服务 的安装与配置,并设置服务开机自启。上传grafana-6.4.1.linux-amd64.tar.gz包[root@k8s-master-node1 hyperf]#vim Dockerfile-grafanaFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD grafana-6.4.1.linux-amd64.tar.gz /root/EXPOSE 3000ENTRYPOINT ["./root/grafana-6.4.1/bin/grafana-server","-homepath","/root/grafana-6.4.1/"][root@k8s-master-node1 hyperf]#docker build -t monitor-grafana:v1.0 -f Dockerfile-grafana .[root@k8s-master-node1 hyperf]#docker run -d --name grafana-exam-jiance monitor-grafana:v1.0 && sleep 5 && docker exec grafana-exam-jiance ps -aux && docker rm -f grafana-exam-jiance2.2.4 容器化部署 Prometheus 编写 Dockerfile 文件构建 prometheus 镜像,要求基于 centos 完成 Promethues 服务的安装与配置,并设置服务开机自启。上传prometheus-2.13.0.linux-amd64.tar.gz并解压[root@k8s-master-node1 hyperf]#tar -zxvf prometheus-2.13.0.linux-amd64.tar.gz[root@k8s-master-node1 hyperf]#mv prometheus-2.13.0.linux-amd64/prometheus.yml /root/hyperf && rm -rf prometheus-2.13.0.linux-amd64[root@k8s-master-node1 hyperf]#vim Dockerfile-prometheusFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD prometheus-2.13.0.linux-amd64.tar.gz /root/RUN mkdir -p /data/prometheus/COPY prometheus.yml /data/prometheus/EXPOSE 9090ENTRYPOINT ["./root/prometheus-2.13.0.linux-amd64/prometheus","--config.file","/data/prometheus/prometheus.yml"][root@k8s-master-node1 hyperf]#docker build -t monitor-prometheus:v1.0 -f Dockerfile-prometheus .[root@k8s-master-node1 hyperf]#vim prometheus.yml #改动- job_name: 'prometheus'    static_configs:    - targets: ['localhost:9090']  - job_name: 'node'    static_configs:    - targets: ['node:9100']  - job_name: 'alertmanager'    static_configs:    - targets: ['alertmanager:9093']  - job_name: 'node-exporter'    static_configs:    - targets: ['node:9100']2.2.5 编排部署 Prometheus编写 docker-compose.yaml 文件,使用镜像 exporter、alert、grafana 和 prometheus 完成监控系统的编排部署。[root@k8s-master-node1 hyperf]#vim docker-compose.yaml编排部署prometheusversion: '3'services:  node:    container_name: monitor-node    image: monitor-exporter:v1.0    restart: always    hostname: node    ports:      - 9100:9100  alertmanager:    container_name: monitor-alertmanager    image: monitor-alert:v1.0    depends_on:      - node    restart: always    hostname: alertmanager    links:      - node    ports:      - 9093:9093      - 9094:9094  grafana:    container_name: monitor-grafana    image: monitor-grafana:v1.0    restart: always    depends_on:      - node      - alertmanager    hostname: grafana    links:      - node      - alertmanager    ports:      - 3000:3000  prometheus:    container_name: monitor-prometheus    image: monitor-prometheus:v1.0    restart: always    depends_on:      - node      - alertmanager      - grafana    hostname: prometheus    links:      - node      - alertmanager      - grafana    ports:      - 9090:9090[root@k8s-master-node1 ~]#docker-compose up -d 2.2.6 安装 Jenkins将 Jenkins 部署到 default 命名空间下。要求完成离线插件的安装,设置 Jenkins 的登录信息和授权策略。上传BlueOcean.tar.gz包[root@k8s-master-node1 ~]#tar -zxvf BlueOcean.tar.gz[root@k8s-master-node1 ~]#cd BlueOcean/images/[root@k8s-master-node1 images]# docker load -i java_8-jre.tar[root@k8s-master-node1 images]# docker load -i jenkins_jenkins_latest.tar[root@k8s-master-node1 images]# docker load -i gitlab_gitlab-ce_latest.tar[root@k8s-master-node1 images]# docker load -i maven_latest.tar[root@k8s-master-node1 images]# docker tag maven:latest  192.168.59.200/library/maven[root@k8s-master-node1 images]# docker login 192.168.59.200Username: adminPassword: (Harbor12345)WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-store[root@k8s-master-node1 images]# docker push  192.168.59.200/library/maven#安装Jenkins[root@k8s-master-node1 BlueOcean]# kubectl create ns devops[root@k8s-master-node1 BlueOcean]# kubectl create deployment jenkins -n devops --image=jenkins/jenkins:latest --port 8080 --dry-run -o yaml > jenkins.yaml[root@k8s-master-node1 BlueOcean]# vim jenkins.yaml # 进入添加apiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: jenkins  name: jenkins  namespace: devopsspec:  replicas: 1  selector:    matchLabels:      app: jenkins  strategy: {}  template:    metadata:      creationTimestamp: null      labels:        app: jenkins    spec:      nodeName: k8s-master-node1      containers:      - image: jenkins/jenkins:latest        imagePullPolicy: IfNotPresent        name: jenkins        ports:        - containerPort: 8080          name: jenkins8080        securityContext:          runAsUser: 0          privileged: true        volumeMounts:        - name: jenkins-home          mountPath: /home/jenkins_home/        - name: docker-home          mountPath: /run/docker.sock        - name: docker          mountPath: /usr/bin/docker        - name: kubectl          mountPath: /usr/bin/kubectl        - name: kube          mountPath: /root/.kube      volumes:      - name: jenkins-home        hostPath:          path: /home/jenkins_home/      - name: docker-home        hostPath:          path: /run/docker.sock      - name: docker        hostPath:          path: /usr/bin/docker      - name: kubectl        hostPath:          path: /usr/bin/kubectl      - name: kube        hostPath:          path: /root/.kube[root@k8s-master-node1 BlueOcean]# kubectl apply -f jenkins.yamldeployment.apps/jenkins created[root@k8s-master-node1 ~]# kubectl get pod -n devops NAME                      READY   STATUS    RESTARTS   AGEjenkins-7d4f5696b7-hqw9d   1/1     Running   0          88s# 进入jenkins,确定docker和kubectl成功安装[root@k8s-master-node1 ~]# kubectl exec -it -n devops jenkins-7d4f5696b7-hqw9d bash[root@k8s-master-node1 BlueOcean]# kubectl expose deployment jenkins -n devops --port=8080 --target-port=30880 --dry-run -o yaml >> jenkins.yaml[root@k8s-master-node1 BlueOcean]# vim jenkins.yaml # 进入修改第二次粘贴在第一此的后面apiVersion: v1kind: Servicemetadata:  creationTimestamp: null  labels:    app: jenkins  name: jenkins  namespace: devopsspec:  ports:  - port: 8080    protocol: TCP    name: jenkins8080    nodePort: 30880  - name: jenkins    port: 50000    nodePort: 30850  selector:    app: jenkins  type: NodePort[root@k8s-master-node1 BlueOcean]# kubectl apply -f jenkins.yamlservice/jenkins created[root@k8s-master-node1 ~]# kubectl get -n devops svcNAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGEjenkins   NodePort   10.96.53.170   <none>        8080:30880/TCP   10s# 使用提供的软件包完成Blue Ocean等离线插件的安装[root@k8s-master-node1 BlueOcean]# kubectl -n devops cp plugins/ jenkins-7d4f5696b7-hqw9d:/var/jenkins_home/* *访问 ip:30880 进入jenkins*# 查看密码[root@k8s-master-node1 BlueOcean]# kubectl -n devops exec jenkins-7d4f5696b7-hqw9d --cat /var/jenkins_home/secrets/initialAdminPassword    2.2.7 安装 GitLab 将 GitLab 部署到 default 命名空间下,要求设置 root 用户密码,新建公开项 目,并将提供的代码上传到该项目。[root@k8s-master-node1 BlueOcean]# kubectl create deployment gitlab -n devops --image=gitlab/gitlab-ce:latest --port 80 --dry-run -o yaml > gitlab.yamlW0222 12:00:34.346609   25564 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.[root@k8s-master-node1 BlueOcean]# vim gitlab.yamljitlab的配置文件apiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: devopsspec:  replicas: 1  selector:    matchLabels:      app: gitlab  strategy: {}  template:    metadata:      creationTimestamp: null      labels:        app: gitlab    spec:      containers:      - image: gitlab/gitlab-ce:latest        imagePullPolicy: IfNotPresent        name: gitlab-ce        ports:        - containerPort: 80        env:        - name: GITLAB_ROOT_PASSWORD          value: admin@123[root@k8s-master-node1 BlueOcean]# kubectl apply -f gitlab.yamldeployment.apps/gitlab created[root@k8s-master-node1 BlueOcean]# kubectl  get pod -n devopsNAME                      READY   STATUS    RESTARTS      AGEgitlab-5b47c8d994-8s9qb   1/1     Running   0             17sjenkins-bbf477c4f-55vgj   1/1     Running   2 (15m ago)   34m[root@k8s-master-node1 BlueOcean]# kubectl expose deployment gitlab -n devops --port=80 --target-port=30888 --dry-run=client -o yaml >> gitlab.yaml[root@k8s-master-node1 BlueOcean]# vim gitlab.yaml # 进入添加---apiVersion: v1kind: Servicemetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: devopsspec:  ports:  - port: 80    nodePort: 30888  selector:    app: gitlab  type: NodePort[root@k8s-master-node1 BlueOcean]# kubectl apply -f gitlab.yamldeployment.apps/gitlab configuredservice/gitlab created[root@k8s-master-node1 BlueOcean]# kubectl get svc -n devopsNAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEgitlab    NodePort   10.96.149.160   <none>        80:30888/TCP     6sjenkins   NodePort   10.96.174.123   <none>        8080:30880/TCP   8m7s# 等待gitlab启动,访问IP:30888  root , admin@123 登录 Gitlab* # 将springcloud文件夹中的代码上传到该项目,Gitlab提供了代码示例[root@k8s-master-node1 BlueOcean]# cd springcloud/[root@k8s-master-node1 springcloud]# git config --global user.name "Administrator"[root@k8s-master-node1 springcloud]# git config --global user.email "admin@example.com"[root@k8s-master-node1 springcloud]# git remote remove origin[root@k8s-master-node1 springcloud]# git remote add origin  http://192.168.100.23:30888/root/springcloud.git[root@k8s-master-node1 springcloud]# git add .[root@k8s-master-node1 springcloud]# git commit -m "Initial commit"# On branch masternothing to commit, working directory clean[root@k8s-master-node1 springcloud]# git push -u origin masterUsername for 'http://192.168.100.23:30888': root Password for 'http://root@192.168.100.23:30888':(admin@123)Counting objects: 3192, done.Delta compression using up to 4 threads.Compressing objects: 100% (1428/1428), done.Writing objects: 100% (3192/3192), 1.40 MiB | 0 bytes/s, done.Total 3192 (delta 1233), reused 3010 (delta 1207)remote: Resolving deltas: 100% (1233/1233), done.To http://192.168.100.23:30888/root/springcloud.git * [new branch]      master -> masterBranch master set up to track remote branch master from origin. 2.2.8 配置 Jenkins 与 GitLab 集成在 Jenkins 中新建流水线任务,配置 GitLab 连接 Jenkins,并完成 WebHook 的配置。 * 在 GitLab 中生成名为 jenkins 的“Access Tokens” * 返回 jenkins   * 回到 Gitlab ,复制 token * 复制后填写到此    2.2.9 构建 CI/CD 环境在流水线任务中编写流水线脚本,完成后触发构建,要求基于 GitLab 中的 项目自动完成代码编译、镜像构建与推送、并自动发布服务到 Kubernetes 集群 中。# 创建命名空间[root@k8s-master-node1 ~]# kubectl create ns springcloud* *新建流水线*    * *添加 Gitlab 用户密码*  * Harbor 仓库创建公开项目 springcloud * *返回 Gitlab 准备编写流水线* # 添加映射[root@k8s-master-node1 ~]# cat /etc/hosts192.168.59.200 apiserver.cluster.local # 选择这一行# 进入jenkins 添加映射[root@k8s-master-node1 ~]# kubectl exec -it -n devops jenkins-bbf477c4f-55vgj bashkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.root@jenkins-bbf477c4f-55vgj:/# echo "192.168.200.59 apiserver.cluster.local" >> /etc/hostsroot@jenkins-bbf477c4f-55vgj:/# cat /etc/hosts # 查看是否成功 # 编写流水线pipeline{    agent none    stages{        stage('mvn-build'){            agent{                docker{                    image '192.168.3.10/library/maven'                    args '-v /root/.m2:/root/.m2'                }            }            steps{                sh 'cp -rvf /opt/repository /root/.m2'                sh 'mvn package -DskipTests'            }        }        stage('image-build'){            agent any            steps{                sh 'cd gateway && docker build -t 192.168.3.10/springcloud/gateway -f Dockerfile .'                sh 'cd config && docker build -t 192.168.3.10/springcloud/config -f Dockerfile .'                sh 'docker login 192.168.3.10 -u=admin -p=Harbor12345'                sh 'docker push 192.168.3.10/springcloud/gateway'                sh 'docker push 192.168.3.10/springcloud/config'            }        }        stage('cloud-deployment'){            agent any            steps{                sh 'sed -i "s/sqshq\\/piggymetrics-gateway/192.168.3.10\\/springcloud\\/gateway/g" yaml/deployment/gateway-deployment.yaml'                sh 'sed -i "s/sqshq\\/piggymetrics-config/192.168.3.10\\/springcloud\\/config/g" yaml/deployment/config-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/gateway-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/config-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/gateway-svc.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/config-svc.yaml'            }        }    }}stages:代表整个流水线的所有执行阶段,通常stages只有1个,里面包含多个stage。stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容。* *保存流水线文件,配置Webhook触发构建*  * *取消勾选 SSL 选择, Add webhook 创建*![](vx_images/545790416256726.png =900x) * 创建成功进行测试,成功后返回 jenkins 会发现流水线已经开始自动构建 * 流水线执行成功  # 流水线构建的项目全部运行[root@k8s-master-node1 ~]# kubectl get pod -n springcloudNAME                       READY   STATUS    RESTARTS      AGEconfig-77c74dd878-8kl4x    1/1     Running   0             28sgateway-5b46966894-twv5k   1/1     Running   1 (19s ago)   28s[root@k8s-master-node1 ~]# kubectl -n springcloud get serviceNAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGEconfig    NodePort   10.96.137.40   <none>        8888:30015/TCP   4m3sgateway   NodePort   10.96.121.82   <none>        4000:30010/TCP   4m4s* *等待 PIg 微服务启动,访问 ip:30010 查看构建成功*2.2.10 服务网格:创建 Ingress Gateway将 Bookinfo 应用部署到 default 命名空间下,请为 Bookinfo 应用创建一个网 关,使外部可以访问 Bookinfo 应用。上传ServiceMesh.tar.gz包[root@k8s-master-node1 ~]# tar -zxvf ServiceMesh.tar.gz[root@k8s-master-node1 ~]# cd ServiceMesh/images/[root@k8s-master-node1 images]# docker load -i image.tar部署Bookinfo应用到kubernetes集群:[root@k8s-master-node1 images]# cd /root/ServiceMesh/[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo/bookinfo.yamlservice/details createdserviceaccount/bookinfo-details createddeployment.apps/details-v1 createdservice/ratings createdserviceaccount/bookinfo-ratings createddeployment.apps/ratings-v1 createdservice/reviews createdserviceaccount/bookinfo-reviews createddeployment.apps/reviews-v1 createdservice/productpage createdserviceaccount/bookinfo-productpage createddeployment.apps/productpage-v1 created[root@k8s-master-node1 ServiceMesh]# kubectl get podNAME                              READY   STATUS    RESTARTS   AGEdetails-v1-79f774bdb9-kndm9       1/1     Running   0          7sproductpage-v1-6b746f74dc-bswbx   1/1     Running   0          7sratings-v1-b6994bb9-6hqfn         1/1     Running   0          7sreviews-v1-545db77b95-j72x5       1/1     Running   0          7s[root@k8s-master-node1 ServiceMesh]# vim bookinfo-gateway.yamlapiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: bookinfo-gatewayspec:  selector:    istio: ingressgateway  servers:  - port:      number: 80      name: http      protocol: HTTP    hosts:    - "*"---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: bookinfospec:  hosts:  - "*"    gateways:  - bookinfo-gateway  http:  - match:    - uri:        exact: /productpage    - uri:        prefix: /static    - uri:        exact: /login    - uri:        exact: /logout    - uri:        prefix: /api/v1/products    route: # 定义路由转发目的地列表    - destination:        host: productpage        port:          number: 9080[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo-gateway.yamlgateway.networking.istio.io/bookinfo-gateway createdvirtualservice.networking.istio.io/bookinfo created[root@k8s-master-node1 ServiceMesh]#kubectl get VirtualService bookinfo -o yamlbookinfo-gateway || exact: /productpage || destination || host: productpage || number: 9080[root@k8s-master-node1 ServiceMesh]#kubectl get gateway bookinfo-gateway -o yamlistio: ingressgateway2.2.11 KubeVirt 运维:创建 VM使用提供的镜像在 kubevirt 命名空间下创建一台 VM,名称为 exam,指定 VM 的内存、CPU、网卡和磁盘等配置。[root@k8s-master-node1 ~]# kubectl explain kubevirt.spec. --recursive |grep use         useEmulation   <boolean>[root@k8s-master-node1 ~]# kubectl -n kubevirt edit kubevirtspec:  certificateRotateStrategy: {}  configuration:    developerConfiguration: #{}      useEmulation: true[root@k8s-master-node1 ~]# vim vm.yamlapiVersion: kubevirt.io/v1kind: VirtualMachinemetadata:  name: examspec:  running: true  template:    spec:      domain:        devices:          disks:            - name: vm              disk: {}        resources:          requests:            memory: 1Gi      volumes:        - name: vm          containerDisk:            image: fedora-virt:v1.0            imagePullPolicy: IfNotPresent[root@k8s-master-node1 ~]# kubectl apply -f vm.yamlvirtualmachine.kubevirt.io/exam created[root@k8s-master-node1 ~]# kubectl get virtualmachineNAME        AGE   STATUS    READY exam   31s   Running   True[root@k8s-master-node1 ~]# kubectl delete -f vm.yamlvirtualmachine.kubevirt.io "exam" deleted 
  • [技术干货] 一键部署k8s最终版
    1. 控制节点主机名为 controller,设置计算节点主机名为 compute;[root@controller ~]# hostnamectl set-hostname controller && su[root@compute ~]# hostnamectl set-hostname compute && su2.hosts 文件将 IP 地址映射为主机名。[root@controller&&compute ~]#vi /etc/hosts192.168.100.10 controller192.168.100.20 compute[root@controller&&compute ~]#vi /etc/selinux/config更改SELINUX=disabled[root@controller&&compute ~]#setenforce 0[root@controller&&compute ~]#systemctl stop firewalld && systemctl disable firewalld3.配置 yum 源[root@controller ~]rm -rf /etc/yum.repos.d/*[root@controller&&compute ~]# vi /etc/yum.repos.d/http.repo[centos]name=centosbaseurl=http://192.168.133.130/centosgpgcheck=0enabled=1 [openstack]name=openstackbaseurl=http://192.168.133.130/openstack/iaas-repogpgcheck=0enabled=1[root@controller&&compute ~]#yum clean all && yum repolist && yum makecache 2.1.1 部署容器云平台使用 OpenStack 私有云平台创建两台云主机,分别作为 Kubernetes 集群的 master 节点和 node 节点,然后完成 Kubernetes 集群的部署,并完成 Istio 服务网 格、KubeVirt 虚拟化和 Harbor 镜像仓库的部署。创建俩台云主机并配网# Kubernetes 集群的部署[root@localhost ~]# mount -o loop chinaskills_cloud_paas_v2.0.2.iso /mnt/[root@localhost ~]# cp -rfv /mnt/* /opt/[root@localhost ~]# umount /mnt/[root@master ~]# hostnamectl set-hostname master && su[root@worker ~]# hostnamectl set-hostname worker && su# 安装kubeeasy[root@master ~]# mv /opt/kubeeasy /usr/bin/kubeeasy# 安装依赖环境[root@master ~]# kubeeasy install depend \--host 192.168.59.200,192.168.59.201 \--user root \--password 000000 \--offline-file /opt/dependencies/base-rpms.tar.gz# 安装k8s[root@master ~]# kubeeasy install k8s \--master 192.168.59.200 \--worker 192.168.59.201 \--user root \--password 000000 \--offline-file /opt/kubernetes.tar.gz# 安装istio网格[root@master ~]# kubeeasy add --istio istio# 安装kubevirt虚拟化[root@master ~]# kubeeasy add --virt kubevirt# 安装harbor仓库[root@master ~]# kubeeasy add --registry harbor[root@k8s-master-node1 ~]# vim pod.yamlapiVersion: v1kind: Podmetadata:  name: examspec:  containers:  - name: exam    image: nginx:latest    imagePullPolicy: IfNotPresent    env:    - name: exam      value: "2022"[root@k8s-master-node1 ~]# kubectl apply -f pod.yaml[root@k8s-master-node1 ~]# kubectl get pod#部署 Istio 服务网格[root@k8s-master-node1 ~]# kubectl create ns examnamespace/exam created[root@k8s-master-node1 ~]# kubectl edit ns exam更改为:  labels:    istio-injection: enabled[root@k8s-master-node1 ~]# kubectl describe ns exam  #查看任务 2 容器云服务运维(15 分)2.2.1 容器化部署 Node-Exporter编写 Dockerfile 文件构建 exporter 镜像,要求基于 centos 完成 Node-Exporter 服务的安装与配置,并设置服务开机自启。上传Hyperf.tar包[root@k8s-master-node1 ~]#tar -zxvf Hyperf.tar.gz[root@k8s-master-node1 ~]#cd hyperf/[root@k8s-master-node1 hyperf]#docker load -i centos_7.9.2009.tar上传node_exporter-1.7.0.linux-amd64.tar包[root@k8s-master-node1 hyperf]#vim Dockerfile-exporterFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD node_exporter-1.7.0.linux-amd64.tar.gz /root/EXPOSE 9100ENTRYPOINT ["./root/node_exporter-1.7.0.linux-amd64/node_exporter"][root@k8s-master-node1 hyperf]#docker build -t monitor-exporter:v1.0 -f Dockerfile-exporter .2.2.2 容器化部署Alertmanager编写 Dockerfile 文件构建 alert 镜像,要求基于 centos:latest 完成 Alertmanager 服务的安装与配置,并设置服务开机自启。上传alertmanager-0.26.0.linux-amd64.tar包[root@k8s-master-node1 hyperf]#vim Dockerfile-alertFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD alertmanager-0.26.0.linux-amd64.tar.gz /root/EXPOSE 9093 9094ENTRYPOINT ["./root/alertmanager-0.26.0.linux-amd64/alertmanager","--config.file","/root/alertmanager-0.26.0.linux-amd64/alertmanager.yml"][root@k8s-master-node1 hyperf]#docker build -t monitor-alert:v1.0 -f Dockerfile-alert .2.2.3 容器化部署 Grafana编写 Dockerfile 文件构建 grafana 镜像,要求基于 centos 完成 Grafana 服务 的安装与配置,并设置服务开机自启。上传grafana-6.4.1.linux-amd64.tar.gz包[root@k8s-master-node1 hyperf]#vim Dockerfile-grafanaFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD grafana-6.4.1.linux-amd64.tar.gz /root/EXPOSE 3000ENTRYPOINT ["./root/grafana-6.4.1/bin/grafana-server","-homepath","/root/grafana-6.4.1/"][root@k8s-master-node1 hyperf]#docker build -t monitor-grafana:v1.0 -f Dockerfile-grafana .[root@k8s-master-node1 hyperf]#docker run -d --name grafana-exam-jiance monitor-grafana:v1.0 && sleep 5 && docker exec grafana-exam-jiance ps -aux && docker rm -f grafana-exam-jiance2.2.4 容器化部署 Prometheus 编写 Dockerfile 文件构建 prometheus 镜像,要求基于 centos 完成 Promethues 服务的安装与配置,并设置服务开机自启。上传prometheus-2.13.0.linux-amd64.tar.gz并解压[root@k8s-master-node1 hyperf]#tar -zxvf prometheus-2.13.0.linux-amd64.tar.gz[root@k8s-master-node1 hyperf]#mv prometheus-2.13.0.linux-amd64/prometheus.yml /root/hyperf && rm -rf prometheus-2.13.0.linux-amd64[root@k8s-master-node1 hyperf]#vim Dockerfile-prometheusFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD prometheus-2.13.0.linux-amd64.tar.gz /root/RUN mkdir -p /data/prometheus/COPY prometheus.yml /data/prometheus/EXPOSE 9090ENTRYPOINT ["./root/prometheus-2.13.0.linux-amd64/prometheus","--config.file","/data/prometheus/prometheus.yml"][root@k8s-master-node1 hyperf]#docker build -t monitor-prometheus:v1.0 -f Dockerfile-prometheus .[root@k8s-master-node1 hyperf]#vim prometheus.yml #改动- job_name: 'prometheus'    static_configs:    - targets: ['localhost:9090']  - job_name: 'node'    static_configs:    - targets: ['node:9100']  - job_name: 'alertmanager'    static_configs:    - targets: ['alertmanager:9093']  - job_name: 'node-exporter'    static_configs:    - targets: ['node:9100']2.2.5 编排部署 Prometheus编写 docker-compose.yaml 文件,使用镜像 exporter、alert、grafana 和 prometheus 完成监控系统的编排部署。[root@k8s-master-node1 hyperf]#vim docker-compose.yaml编排部署prometheusversion: '3'services:  node:    container_name: monitor-node    image: monitor-exporter:v1.0    restart: always    hostname: node    ports:      - 9100:9100  alertmanager:    container_name: monitor-alertmanager    image: monitor-alert:v1.0    depends_on:      - node    restart: always    hostname: alertmanager    links:      - node    ports:      - 9093:9093      - 9094:9094  grafana:    container_name: monitor-grafana    image: monitor-grafana:v1.0    restart: always    depends_on:      - node      - alertmanager    hostname: grafana    links:      - node      - alertmanager    ports:      - 3000:3000  prometheus:    container_name: monitor-prometheus    image: monitor-prometheus:v1.0    restart: always    depends_on:      - node      - alertmanager      - grafana    hostname: prometheus    links:      - node      - alertmanager      - grafana    ports:      - 9090:9090[root@k8s-master-node1 ~]#docker-compose up -d 2.2.6 安装 Jenkins将 Jenkins 部署到 default 命名空间下。要求完成离线插件的安装,设置 Jenkins 的登录信息和授权策略。上传BlueOcean.tar.gz包[root@k8s-master-node1 ~]#tar -zxvf BlueOcean.tar.gz[root@k8s-master-node1 ~]#cd BlueOcean/images/[root@k8s-master-node1 images]# docker load -i java_8-jre.tar[root@k8s-master-node1 images]# docker load -i jenkins_jenkins_latest.tar[root@k8s-master-node1 images]# docker load -i gitlab_gitlab-ce_latest.tar[root@k8s-master-node1 images]# docker load -i maven_latest.tar[root@k8s-master-node1 images]# docker tag maven:latest  192.168.59.200/library/maven[root@k8s-master-node1 images]# docker login 192.168.59.200Username: adminPassword: (Harbor12345)WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-store[root@k8s-master-node1 images]# docker push  192.168.59.200/library/maven#安装Jenkins[root@k8s-master-node1 BlueOcean]# kubectl create ns devops[root@k8s-master-node1 BlueOcean]# kubectl create deployment jenkins -n devops --image=jenkins/jenkins:latest --port 8080 --dry-run -o yaml > jenkins.yaml[root@k8s-master-node1 BlueOcean]# vim jenkins.yaml # 进入添加apiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: jenkins  name: jenkins  namespace: devopsspec:  replicas: 1  selector:    matchLabels:      app: jenkins  strategy: {}  template:    metadata:      creationTimestamp: null      labels:        app: jenkins    spec:      nodeName: k8s-master-node1      containers:      - image: jenkins/jenkins:latest        imagePullPolicy: IfNotPresent        name: jenkins        ports:        - containerPort: 8080          name: jenkins8080        securityContext:          runAsUser: 0          privileged: true        volumeMounts:        - name: jenkins-home          mountPath: /home/jenkins_home/        - name: docker-home          mountPath: /run/docker.sock        - name: docker          mountPath: /usr/bin/docker        - name: kubectl          mountPath: /usr/bin/kubectl        - name: kube          mountPath: /root/.kube      volumes:      - name: jenkins-home        hostPath:          path: /home/jenkins_home/      - name: docker-home        hostPath:          path: /run/docker.sock      - name: docker        hostPath:          path: /usr/bin/docker      - name: kubectl        hostPath:          path: /usr/bin/kubectl      - name: kube        hostPath:          path: /root/.kube[root@k8s-master-node1 BlueOcean]# kubectl apply -f jenkins.yamldeployment.apps/jenkins created[root@k8s-master-node1 ~]# kubectl get pod -n devops NAME                      READY   STATUS    RESTARTS   AGEjenkins-7d4f5696b7-hqw9d   1/1     Running   0          88s# 进入jenkins,确定docker和kubectl成功安装[root@k8s-master-node1 ~]# kubectl exec -it -n devops jenkins-7d4f5696b7-hqw9d bash[root@k8s-master-node1 BlueOcean]# kubectl expose deployment jenkins -n devops --port=8080 --target-port=30880 --dry-run -o yaml >> jenkins.yaml[root@k8s-master-node1 BlueOcean]# vim jenkins.yaml # 进入修改第二次粘贴在第一此的后面apiVersion: v1kind: Servicemetadata:  creationTimestamp: null  labels:    app: jenkins  name: jenkins  namespace: devopsspec:  ports:  - port: 8080    protocol: TCP    name: jenkins8080    nodePort: 30880  - name: jenkins    port: 50000    nodePort: 30850  selector:    app: jenkins  type: NodePort[root@k8s-master-node1 BlueOcean]# kubectl apply -f jenkins.yamlservice/jenkins created[root@k8s-master-node1 ~]# kubectl get -n devops svcNAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGEjenkins   NodePort   10.96.53.170   <none>        8080:30880/TCP   10s# 使用提供的软件包完成Blue Ocean等离线插件的安装[root@k8s-master-node1 BlueOcean]# kubectl -n devops cp plugins/ jenkins-7d4f5696b7-hqw9d:/var/jenkins_home/* *访问 ip:30880 进入jenkins*# 查看密码[root@k8s-master-node1 BlueOcean]# kubectl -n devops exec jenkins-7d4f5696b7-hqw9d --cat /var/jenkins_home/secrets/initialAdminPassword    2.2.7 安装 GitLab 将 GitLab 部署到 default 命名空间下,要求设置 root 用户密码,新建公开项 目,并将提供的代码上传到该项目。[root@k8s-master-node1 BlueOcean]# kubectl create deployment gitlab -n devops --image=gitlab/gitlab-ce:latest --port 80 --dry-run -o yaml > gitlab.yamlW0222 12:00:34.346609   25564 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.[root@k8s-master-node1 BlueOcean]# vim gitlab.yamljitlab的配置文件apiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: devopsspec:  replicas: 1  selector:    matchLabels:      app: gitlab  strategy: {}  template:    metadata:      creationTimestamp: null      labels:        app: gitlab    spec:      containers:      - image: gitlab/gitlab-ce:latest        imagePullPolicy: IfNotPresent        name: gitlab-ce        ports:        - containerPort: 80        env:        - name: GITLAB_ROOT_PASSWORD          value: admin@123[root@k8s-master-node1 BlueOcean]# kubectl apply -f gitlab.yamldeployment.apps/gitlab created[root@k8s-master-node1 BlueOcean]# kubectl  get pod -n devopsNAME                      READY   STATUS    RESTARTS      AGEgitlab-5b47c8d994-8s9qb   1/1     Running   0             17sjenkins-bbf477c4f-55vgj   1/1     Running   2 (15m ago)   34m[root@k8s-master-node1 BlueOcean]# kubectl expose deployment gitlab -n devops --port=80 --target-port=30888 --dry-run=client -o yaml >> gitlab.yaml[root@k8s-master-node1 BlueOcean]# vim gitlab.yaml # 进入添加---apiVersion: v1kind: Servicemetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: devopsspec:  ports:  - port: 80    nodePort: 30888  selector:    app: gitlab  type: NodePort[root@k8s-master-node1 BlueOcean]# kubectl apply -f gitlab.yamldeployment.apps/gitlab configuredservice/gitlab created[root@k8s-master-node1 BlueOcean]# kubectl get svc -n devopsNAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEgitlab    NodePort   10.96.149.160   <none>        80:30888/TCP     6sjenkins   NodePort   10.96.174.123   <none>        8080:30880/TCP   8m7s# 等待gitlab启动,访问IP:30888  root , admin@123 登录 Gitlab* # 将springcloud文件夹中的代码上传到该项目,Gitlab提供了代码示例[root@k8s-master-node1 BlueOcean]# cd springcloud/[root@k8s-master-node1 springcloud]# git config --global user.name "Administrator"[root@k8s-master-node1 springcloud]# git config --global user.email "admin@example.com"[root@k8s-master-node1 springcloud]# git remote remove origin[root@k8s-master-node1 springcloud]# git remote add origin  http://192.168.100.23:30888/root/springcloud.git[root@k8s-master-node1 springcloud]# git add .[root@k8s-master-node1 springcloud]# git commit -m "Initial commit"# On branch masternothing to commit, working directory clean[root@k8s-master-node1 springcloud]# git push -u origin masterUsername for 'http://192.168.100.23:30888': root Password for 'http://root@192.168.100.23:30888':(admin@123)Counting objects: 3192, done.Delta compression using up to 4 threads.Compressing objects: 100% (1428/1428), done.Writing objects: 100% (3192/3192), 1.40 MiB | 0 bytes/s, done.Total 3192 (delta 1233), reused 3010 (delta 1207)remote: Resolving deltas: 100% (1233/1233), done.To http://192.168.100.23:30888/root/springcloud.git * [new branch]      master -> masterBranch master set up to track remote branch master from origin. 2.2.8 配置 Jenkins 与 GitLab 集成在 Jenkins 中新建流水线任务,配置 GitLab 连接 Jenkins,并完成 WebHook 的配置。 * 在 GitLab 中生成名为 jenkins 的“Access Tokens” * 返回 jenkins   * 回到 Gitlab ,复制 token * 复制后填写到此    2.2.9 构建 CI/CD 环境在流水线任务中编写流水线脚本,完成后触发构建,要求基于 GitLab 中的 项目自动完成代码编译、镜像构建与推送、并自动发布服务到 Kubernetes 集群 中。# 创建命名空间[root@k8s-master-node1 ~]# kubectl create ns springcloud* *新建流水线*    * *添加 Gitlab 用户密码*  * Harbor 仓库创建公开项目 springcloud * *返回 Gitlab 准备编写流水线* # 添加映射[root@k8s-master-node1 ~]# cat /etc/hosts192.168.59.200 apiserver.cluster.local # 选择这一行# 进入jenkins 添加映射[root@k8s-master-node1 ~]# kubectl exec -it -n devops jenkins-bbf477c4f-55vgj bashkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.root@jenkins-bbf477c4f-55vgj:/# echo "192.168.200.59 apiserver.cluster.local" >> /etc/hostsroot@jenkins-bbf477c4f-55vgj:/# cat /etc/hosts # 查看是否成功 # 编写流水线pipeline{    agent none    stages{        stage('mvn-build'){            agent{                docker{                    image '192.168.3.10/library/maven'                    args '-v /root/.m2:/root/.m2'                }            }            steps{                sh 'cp -rvf /opt/repository /root/.m2'                sh 'mvn package -DskipTests'            }        }        stage('image-build'){            agent any            steps{                sh 'cd gateway && docker build -t 192.168.3.10/springcloud/gateway -f Dockerfile .'                sh 'cd config && docker build -t 192.168.3.10/springcloud/config -f Dockerfile .'                sh 'docker login 192.168.3.10 -u=admin -p=Harbor12345'                sh 'docker push 192.168.3.10/springcloud/gateway'                sh 'docker push 192.168.3.10/springcloud/config'            }        }        stage('cloud-deployment'){            agent any            steps{                sh 'sed -i "s/sqshq\\/piggymetrics-gateway/192.168.3.10\\/springcloud\\/gateway/g" yaml/deployment/gateway-deployment.yaml'                sh 'sed -i "s/sqshq\\/piggymetrics-config/192.168.3.10\\/springcloud\\/config/g" yaml/deployment/config-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/gateway-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/config-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/gateway-svc.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/config-svc.yaml'            }        }    }}stages:代表整个流水线的所有执行阶段,通常stages只有1个,里面包含多个stage。stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容。* *保存流水线文件,配置Webhook触发构建*  * *取消勾选 SSL 选择, Add webhook 创建*![](vx_images/545790416256726.png =900x) * 创建成功进行测试,成功后返回 jenkins 会发现流水线已经开始自动构建 * 流水线执行成功  # 流水线构建的项目全部运行[root@k8s-master-node1 ~]# kubectl get pod -n springcloudNAME                       READY   STATUS    RESTARTS      AGEconfig-77c74dd878-8kl4x    1/1     Running   0             28sgateway-5b46966894-twv5k   1/1     Running   1 (19s ago)   28s[root@k8s-master-node1 ~]# kubectl -n springcloud get serviceNAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGEconfig    NodePort   10.96.137.40   <none>        8888:30015/TCP   4m3sgateway   NodePort   10.96.121.82   <none>        4000:30010/TCP   4m4s* *等待 PIg 微服务启动,访问 ip:30010 查看构建成功*2.2.10 服务网格:创建 Ingress Gateway将 Bookinfo 应用部署到 default 命名空间下,请为 Bookinfo 应用创建一个网 关,使外部可以访问 Bookinfo 应用。上传ServiceMesh.tar.gz包[root@k8s-master-node1 ~]# tar -zxvf ServiceMesh.tar.gz[root@k8s-master-node1 ~]# cd ServiceMesh/images/[root@k8s-master-node1 images]# docker load -i image.tar部署Bookinfo应用到kubernetes集群:[root@k8s-master-node1 images]# cd /root/ServiceMesh/[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo/bookinfo.yamlservice/details createdserviceaccount/bookinfo-details createddeployment.apps/details-v1 createdservice/ratings createdserviceaccount/bookinfo-ratings createddeployment.apps/ratings-v1 createdservice/reviews createdserviceaccount/bookinfo-reviews createddeployment.apps/reviews-v1 createdservice/productpage createdserviceaccount/bookinfo-productpage createddeployment.apps/productpage-v1 created[root@k8s-master-node1 ServiceMesh]# kubectl get podNAME                              READY   STATUS    RESTARTS   AGEdetails-v1-79f774bdb9-kndm9       1/1     Running   0          7sproductpage-v1-6b746f74dc-bswbx   1/1     Running   0          7sratings-v1-b6994bb9-6hqfn         1/1     Running   0          7sreviews-v1-545db77b95-j72x5       1/1     Running   0          7s[root@k8s-master-node1 ServiceMesh]# vim bookinfo-gateway.yamlapiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: bookinfo-gatewayspec:  selector:    istio: ingressgateway  servers:  - port:      number: 80      name: http      protocol: HTTP    hosts:    - "*"---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: bookinfospec:  hosts:  - "*"    gateways:  - bookinfo-gateway  http:  - match:    - uri:        exact: /productpage    - uri:        prefix: /static    - uri:        exact: /login    - uri:        exact: /logout    - uri:        prefix: /api/v1/products    route: # 定义路由转发目的地列表    - destination:        host: productpage        port:          number: 9080[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo-gateway.yamlgateway.networking.istio.io/bookinfo-gateway createdvirtualservice.networking.istio.io/bookinfo created[root@k8s-master-node1 ServiceMesh]#kubectl get VirtualService bookinfo -o yamlbookinfo-gateway || exact: /productpage || destination || host: productpage || number: 9080[root@k8s-master-node1 ServiceMesh]#kubectl get gateway bookinfo-gateway -o yamlistio: ingressgateway2.2.11 KubeVirt 运维:创建 VM使用提供的镜像在 kubevirt 命名空间下创建一台 VM,名称为 exam,指定 VM 的内存、CPU、网卡和磁盘等配置。[root@k8s-master-node1 ~]# kubectl explain kubevirt.spec. --recursive |grep use         useEmulation   <boolean>[root@k8s-master-node1 ~]# kubectl -n kubevirt edit kubevirtspec:  certificateRotateStrategy: {}  configuration:    developerConfiguration: #{}      useEmulation: true[root@k8s-master-node1 ~]# vim vm.yamlapiVersion: kubevirt.io/v1kind: VirtualMachinemetadata:  name: examspec:  running: true  template:    spec:      domain:        devices:          disks:            - name: vm              disk: {}        resources:          requests:            memory: 1Gi      volumes:        - name: vm          containerDisk:            image: fedora-virt:v1.0            imagePullPolicy: IfNotPresent[root@k8s-master-node1 ~]# kubectl apply -f vm.yamlvirtualmachine.kubevirt.io/exam created[root@k8s-master-node1 ~]# kubectl get virtualmachineNAME        AGE   STATUS    READY exam   31s   Running   True[root@k8s-master-node1 ~]# kubectl delete -f vm.yamlvirtualmachine.kubevirt.io "exam" deleted 
  • [技术干货] 一键部署k8s3
    容器云搭建2.1.1 部署Kubernetes容器云平台使用OpenStack私有云平台创建两台云主机,云主机类型使用4vCPU/12G/100G类型,分别作为Kubernetes集群的Master节点和node节点,然后完成Kubernetes集群部署。2.1.2 部署Harbor镜像仓库在Kubernetes集群中完成Harbor镜像仓库部署。2.1.3 部署Istio服务网格在Kubernetes集群中完成Istio服务网格组件部署。2.1.4 部署kubeVirt 虚拟化组件在Kubernetes集群中完成kubeVirt虚拟化组件部署。mount -o loop chinaskills_cloud_paas_v2.1.iso /mnt/cp -rfv /mnt/* /opt/umount /mnt/ ## 在master节点安装kubeeasy工具:mv /opt/kubeeasy-v2.0 /usr/bin/kubeeasy ## 在master节点安装依赖包:kubeeasy install dependencies \ --host 10.28.0.205,10.28.0.221 \ --user root \ --password Abc@1234 \ --offline-file /opt/dependencies/packages.tar.gz  ## 配置SSH免密:kubeeasy check ssh \ --host 10.28.0.205,10.28.0.221 \ --user root \ --password Abc@1234 kubeeasy create ssh-keygen \  --master 10.28.2.191 \  --worker 10.28.0.198 \  --user root \  --password Abc@1234 ## master节点部署kuberneteskubeeasy install kubernetes \  --master 10.24.2.10 \  --worker 10.24.2.20,10.24.2.30,10.24.2.40 \  --user root \  --password 000000 \  --version 1.25.2 \  --offline-file /opt/kubeeasy.tar.gz容器云服务运维:2.2.1 容器化部署Node-Exporter编写Dockerfile文件构建exporter镜像,要求基于centos完成Node-Exporter服务的安装与配置,并设置服务开机自启。编写Dockerfile构建monitor-exporter:v1.0镜像,具体要求如下:(需要用到的软件包:Monitor.tar.gz)(1)基础镜像:centos:centos7.9.2009;(2)使用二进制包node_exporter-0.18.1.linux-amd64.tar.gz安装node-exporter服务;(3)声明端口:9100;(4)设置服务开机自启。tar -zxvf Monitor.tar.gz docker load -i Monitor/CentOS_7.9.2009.tar cd Monitor/##编写Dockerfile文件vim Dockerfile-exporterFROM centos:centos7.9.2009RUN rm -rf /etc/yum.repos.d/*ADD node_exporter-0.18.1.linux-amd64.tar.gz /root/EXPOSE 9100ENTRYPOINT ["./root/node_exporter-0.18.1.linux-amd64/node_exporter"] ##运行脚本docker build -t monitor-exporter:v1.0 -f Dockerfile-exporter .2.2.2容器化部署Alertmanager编写Dockerfile文件构建alert镜像,要求基于centos:latest完成Alertmanager服务的安装与配置,并设置服务开机自启。编写Dockerfile构建monitor-alert:v1.0镜像,具体要求如下:(需要用到的软件包:Monitor.tar.gz)(1)基础镜像:centos:centos7.9.2009;(2)使用二进制包alertmanager-0.19.0.linux-amd64.tar.gz安装Alertmanager服务;(3)声明端口:9093、9094;(4)设置服务开机自启。tar -zxvf Monitor.tar.gz docker load -i Monitor/CentOS_7.9.2009.tar cd Monitor/ ##编写Dockerfile文件vim Dockerfile-alertFROM centos:centos7.9.2009RUN rm -rf /etc/yum.repos.d/*ADD alertmanager-0.19.0.linux-amd64.tar.gz /root/EXPOSE 9093 9094ENTRYPOINT ["./root/alertmanager-0.19.0.linux-amd64/alertmanager","--config.file","/root/alertmanager-0.19.0.linux-amd64/alertmanager.yml"] ##运行脚本docker build -t monitor-alert:v1.0 -f Dockerfile-alert .2.2.3 容器化部署Grafana编写Dockerfile文件构建grafana镜像,要求基于centos完成Grafana服务的安装与配置,并设置服务开机自启。编写Dockerfile构建monitor-grafana:v1.0镜像,具体要求如下:(需要用到的软件包:Monitor.tar.gz)(1)基础镜像:centos:centos7.9.2009;(2)使用二进制包grafana-6.4.1.linux-amd64.tar.gz安装grafana服务;(3)声明端口:3000;(4)设置nacos服务开机自启。tar -zxvf Monitor.tar.gz docker load -i Monitor/CentOS_7.9.2009.tar cd Monitor/ ##编写Dockerfile文件vim Dockerfile-grafanaFROM centos:centos7.9.2009RUN rm -rf /etc/yum.repos.d/*ADD grafana-6.4.1.linux-amd64.tar.gz /root/EXPOSE 3000ENTRYPOINT ["./root/grafana-6.4.1/bin/grafana-server","-homepath","/root/grafana-6.4.1/"] ##运行脚本docker build -t monitor-grafana:v1.0 -f Dockerfile-grafana .2.2.4 容器化部署Prometheus编写Dockerfile文件构建prometheus镜像,要求基于centos完成Promethues服务的安装与配置,并设置服务开机自启。编写Dockerfile构建monitor-prometheus:v1.0镜像,具体要求如下:(需要用到的软件包:Monitor.tar.gz)(1)基础镜像:centos:centos7.9.2009;(2)使用二进制包prometheus-2.13.0.linux-amd64.tar.gz安装promethues服务;(3)编辑/data/prometheus/prometheus.yml文件,创建3个任务模板:prometheus、node和alertmanager,并将该文件拷贝到/data/prometheus/目录下;(4)声明端口:9090;(5)设置服务开机自启。编写Dockerfile文件FROM centos:centos7.9.2009RUN rm -rf /etc/yum.repos.d/*ADD prometheus-2.13.0.linux-amd64.tar.gz /root/RUN mkdir -p /data/prometheusEXPOSE 9090RUN cat <<EOF > /data/prometheus/prometheus.ymlglobal:  scrape_interval: 15s scrape_configs:- job_name: prometheus  static_configs:  - targets: ['localhost:9090']- job_name: node  static_configs:  - targets: ['localhost:9090']- job_name: alertmanager  static_configs:  - targets: ['localhost:9090']- job_name: grafana:  static_configs:  - targets: ['localhost:9090']    EOF ENTRYPOINT ["./root/prometheus-2.13.0.linux-amd64/prometheus","--config.file","/data/prometheus/prometheus.yml"]上面cat写入了 下面的prometheus.yml就不用再写了编写prometheus.yml (如果写了下面的文件 需要在Dockerfile中COPY文件到/data/prometheus/)[root@master Monitor]# vim prometheus.ymlglobal:  scrape_interval:     15s   evaluation_interval: 15s  alerting:  alertmanagers:  - static_configs:    - targets:      - alertmanager: 9093 rule_files: scrape_configs:  - job_name: 'prometheus'    static_configs:    - targets: ['localhost:9090']   - job_name: 'node'    static_configs:    - targets: ['node:9100']   - job_name: 'alertmanager'    static_configs:    - targets: ['alertmanager:9093']  - job_name: 'node-exporter'    static_configs:    - targets: ['node:9100']跑脚本docker build -t monitor-prometheus:v1.0 -f Dockerfile-prometheus .2.2.5 编排部署监控系统编写docker-compose.yaml文件,使用镜像exporter、alert、grafana和prometheus完成监控系统的编排部署。编写docker-compose.yaml文件,具体要求如下:(1)容器1名称:monitor-node;镜像:monitor-exporter:v1.0;端口映射:9100:9100;(2)容器2名称:monitor- alertmanager;镜像:monitor-alert:v1.0;端口映射:9093:9093、9094:9094;(3)容器3名称:monitor-grafana;镜像:monitor-grafana:v1.0;端口映射:3000:3000;(4)容器4名称:monitor-prometheus;镜像:monitor-prometheus:v1.0;端口映射:9090:9090。完成后编排部署监控系统,将Prometheus设置为Grafana的数据源,并命名为Prometheus。(5)添加元数据 进入grafana的网页 添加prometheus为数据源编写docker-compose.yaml文件version: '3'services:# 容器1:用于监控节点的exporter服务  monitor-node:    image: monitor-exporter:v1.0    ports:      - "9100:9100"         # 容器2:alertmanager服务  monitor-alertmanager:    image: monitor-alert:v1.0    ports:      - "9093:9093"      - "9094:9094"   # 容器3:grafana服务  monitor-grafana:    image: monitor-grafana:v1.0    ports:      - "3000:3000"  # 容器4:prometheus服务  monitor-prometheus:    image: monitor-prometheus:v1.0    ports:      - "9090:9090"有依赖关系的写法;version: '3'services:  node:    container_name: monitor-node    image: monitor-exporter:v1.0    restart: always    hostname: node    ports:      - 9100:9100  alertmanager:    container_name: monitor-alertmanager    image: monitor-alert:v1.0    depends_on:      - node    restart: always    hostname: alertmanager    links:      - node    ports:      - 9093:9093      - 9094:9094  grafana:    container_name: monitor-grafana    image: monitor-grafana:v1.0    depends_on:      - node      - alertmanager    hostname: grafana    restart: always    links:      - node      - alertmanager    ports:      - 3000:3000  prometheus:    container_name: monitor-prometheus    image: monitor-prometheus:v1.0    depends_on:      - node      - alertmanager      - grafana    hostname: prometheus    restart: always    links:      - node      - alertmanager      - grafana    ports:      - 9090:9090查看pod状态[root@master Monitor]# docker ps -aCONTAINER ID   IMAGE                     COMMAND                  CREATED         STATUS         PORTS                                                           NAMESe4a643469259   monitor-prometheus:v1.0   "./root/prometheus-2…"   2 minutes ago   Up 2 minutes   0.0.0.0:9090->9090/tcp, :::9090->9090/tcp                       monitor-prometheuscd1eddaba0d3   monitor-grafana:v1.0      "./root/grafana-6.4.…"   2 minutes ago   Up 2 minutes   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp                       monitor-grafana9032755f8e18   monitor-alert:v1.0        "./root/alertmanager…"   2 minutes ago   Up 2 minutes   0.0.0.0:9093-9094->9093-9094/tcp, :::9093-9094->9093-9094/tcp   monitor-alertmanagere3ae4d3bf8f9   monitor-exporter:v1.0     "./root/node_exporte…"   2 minutes ago   Up 2 minutes   0.0.0.0:9100->9100/tcp, :::9100->9100/tcp                       monitor-node登录grafana网页http://10.28.0.244:3000 账号admin 密码随便(admin)登录后会提示修改密码 可以跳过 添加prometheus为数据源  输入主节点的ip加端口号http://10.28.0.244:9090(普罗米修斯的端口)然后点击下面绿色的保存 再点back退出 2.2.6 部署GitLab将GitLab部署到Kubernetes集群中,设置GitLab服务root用户的密码,使用Service暴露服务,并将提供的项目包导入到GitLab中。在Kubernetes集群中新建命名空间gitlab-ci,将GitLab部署到该命名空间下,Deployment和Service名称均为gitlab,以NodePort方式将80端口对外暴露为30880,设置GitLab服务root用户的密码为admin@123,将项目包demo-2048.tar.gz导入到GitLab中并命名为demo-2048。需要用到的软件包:CICD-Runners-demo2048.tar.gz解压软件包,导入镜像[root@master ~]# tar -zxvf CICD-Runners-demo2048.tar.gz[root@master ~]# ctr -n k8s.io image import gitlab-ci/images/images.tar[root@master ~]# docker load < gitlab-ci/images/images.tar部署GitLab服务[root@master ~]# kubectl create ns gitlab-ci        ## 新建命名空间 [root@master ~]# cd gitlab-ci[root@master gitlab-ci]# vi gitlab-deploy.yamlapiVersion: apps/v1kind: Deploymentmetadata:  name: gitlab  namespace: gitlab-ci  labels:    name: gitlabspec:  selector:    matchLabels:      name: gitlab  template:    metadata:      name: gitlab      labels:        name: gitlab    spec:      containers:      - name: gitlab        image: gitlab/gitlab-ce:latest        imagePullPolicy: IfNotPresent        env:        - name: GITLAB_ROOT_PASSWORD          value: admin@123        - name: GITLAB_ROOT_EMAIL          value: 123456@qq.com        ports:        - name: http          containerPort: 80        volumeMounts:        - name: gitlab-config          mountPath: /etc/gitlab        - name: gitlab-logs          mountPath: /var/log/gitlab        - name: gitlab-data          mountPath: /var/opt/gitlab      volumes:      - name: gitlab-config        hostPath:          path: /home/gitlab/conf      - name: gitlab-logs        hostPath:          path: /home/gitlab/logs      - name: gitlab-data        hostPath:          path: /home/gitlab/data删除deployment资源的命令kubectl -n gitlab-ci delete -f gitlab-deploy.yaml[root@master gitlab-ci]# vi gitlab-svc.yaml        ## 创建service服务释放端口apiVersion: v1kind: Servicemetadata:  name: gitlab  namespace: gitlab-ci  labels:    name: gitlabspec:  type: NodePort  ports:    - name: http      port: 80      targetPort: http      nodePort: 30880  selector:    name: gitlab [root@master gitlab-ci]# kubectl apply -f gitlab-deploy.yaml [root@master gitlab-ci]# kubectl apply -f gitlab-svc.yaml  ## 查看pod[root@master gitlab-ci]# kubectl -n gitlab-ci get pod NAME                      READY   STATUS    RESTARTS   AGEgitlab-65c6b98f6b-q4dwq   1/1     Running   0          2m3s [root@master gitlab-ci]# kubectl -n gitlab-ci get pods -owide        ## 查看pod详细信息NAME                      READY   STATUS    RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATESgitlab-65c6b98f6b-q4dwq   1/1     Running   0          2m57s   192.244.0.21   master   <none>           <none>在集群中定义hosts添加gitlabPod的解析[root@master gitlab-ci]# kubectl edit configmap coredns -n kube-system... ...     16            fallthrough in-addr.arpa ip6.arpa     17            ttl 30     18  }     19         hosts {     20             192.244.0.21 gitlab-65c6b98f6b-q4dwq            ## 这里是Pod容器的ip     21             fallthrough     22  }     23         prometheus :9153     24                                                             ## 这里有三行删除     25         cache 30... ... 保存退出  需要保存两遍[root@master gitlab-ci]# kubectl -n kube-system rollout restart deploy coredns    ## 保存刚才的设置进入gitlab Pod中[root@master gitlab-ci]#  kubectl -n gitlab-ci get pods[root@master gitlab-ci]#  kubectl exec -it -n gitlab-ci gitlab-65c6b98f6b-q4dwq bashroot@gitlab-7b54df755-6ljtp:/# vi /etc/gitlab/gitlab.rb external_url 'http://192.244.0.21:80'            ## 再首行添加  这里也是Pod的iproot@gitlab-7b54df755-6ljtp:/# rebootroot@gitlab-7b54df755-6ljtp:/# exit查看service[root@master gitlab-ci]# kubectl -n gitlab-ci get svcNAME     TYPE       CLUSTER-IP        EXTERNAL-IP   PORT(S)        AGEgitlab   NodePort   192.102.225.126   <none>        80:30880/TCP   18m访问主机IPhttp://10.28.3.102:30880用户:123456@qq.com 密码:admin@123 点击 “Create a project” 点击“Create biank project” 创建项目demo-2048 可见等级选Public 填好后 点“Create project” 进入项目 将代码推送到项目中[root@master gitlab-ci]# cd /root/gitlab-ci/demo-2048[root@master demo-2048]# git config --global user.name "Administrator"     ## 这里的用户密码[root@master demo-2048]# git config --global user.email "123456@qq.com"     ## 是用于下载时候登录的[root@master demo-2048]# git remote remove origin        ## 删除原有库[root@master demo-2048]# git remote add origin http://10.28.0.95:30880/root/demo-2048.git ## 添加库主节点IP[root@master demo-2048]# git add .[root@master demo-2048]# git commit -m "initial commit"[root@master demo-2048]# git push -u origin droneUsername for 'http://10.28.0.198:30880': root        Password for 'http://root@10.28.0.198:30880': admin@123         ## 这是deployment资源文件中设置的推送完刷新 项目库 2.2.7 部署GitLab Runner将GitLab Runner部署到Kubernetes集群中,为GitLab Runner创建持久化构建缓存目录以加速构建速度,并将其注册到GitLab中。将GitLab Runner部署到gitlab-ci命名空间下,Release名称为gitlab-runner,为GitLab Runner创建持久化构建缓存目录/home/gitlab-runner/ci-build-cache以加速构建速度,并将其注册到GitLab中。登录GitLab管理界面(http://10.24.2.14:30880/admin),然后点击左侧菜单栏中的CI/CD下的Runners 记住复制的token:DN3ZZDAGSGB-kWSb-qBT创建Service服务[root@master ~]# cd /root/gitlab-ci/[root@master gitlab-ci]# cat runner-sa.yaml apiVersion: v1kind: ServiceAccountmetadata:  name: gitlab-ci  namespace: gitlab-ci创建角色[root@master gitlab-ci]# cat runner-role.yaml kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:  name: gitlab-ci  namespace: gitlab-cirules:  - apiGroups: [""]    resources: ["*"]    verbs: ["*"]创建角色对接[root@master gitlab-ci]# cat runner-rb.yaml kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: gitlab-ci  namespace: gitlab-cisubjects:  - kind: ServiceAccount    name: gitlab-ci    namespace: gitlab-ciroleRef:  kind: Role  name: gitlab-ci  apiGroup: rbac.authorization.k8s.io创建资源对象[root@master gitlab-ci]# kubectl apply -f runner-sa.yaml [root@master gitlab-ci]# kubectl apply -f runner-role.yaml [root@master gitlab-ci]# kubectl apply -f runner-rb.yaml apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  name: default  labels:    k8s-app: gitlab-defaultroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:  - kind: ServiceAccount    name: default    namespace: gitlab-ci————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/qq_36416567/article/details/144212465
  • [分享交流] 人工智能-02 准备开发环境
    人工智能-02 准备开发环境持续更新,欢迎批评指正。创建服务器先准备一个服务器,最好能独立使用,方便后续开发和调试,也便于能随时对环境做更改且不影响其他人。通过ecs购买服务器参考官网的指导购买一个ECS服务器。cid:link_10注意:1、CPU、内存、存储资源以满足基本使用即可,根据自己情况选择,可以留一点余量,不用太大,以免造成浪费,后续有扩容需求,还可以继续扩充。如果是经常用可以选包周期,如果偶尔用,可以选按需购买。2、操作系统根据需求选择对应的镜像和版本。3、如果需要通过SSH登录Linux弹性云服务器时,弹性云服务器必须绑定弹性公网IP(EIP),其他参数如果没有特殊要求参考链接选择默认即可,确认购买的服务器参数,创建服务器。4、服务器不用的时候,可以先关机,节省费用。安全设置为了服务器安全,可以通过安全组配置网络策略,防止服务器被入侵。默认安全组的规则是在出方向上的数据报文全部放行,入方向访问受限,所以重点配置入方向的安全策略,可以以最小策略为原则,即只开放指定的用途(端口和协议)给指定的来源(IP),后面有其他需求的时候再开放。如:TCP:22端口,允许SSH远程连接Linux弹性云服务器。TCP:20-21端口,允许通过FTP上传和下载文件。ICMP,允许ping程序测试弹性云服务器的连通。服务器基本配置登录服务器通过轻量级的putty或者专业的Xshell、MobaXterm等其他工具,连接即可。在公司的工具网站上下载使用。cid:link_18 PING操作ping提供了基本的网络问题定位功能。如果不能使用ping操作,首先,检查ECS服务器的安全组是否放通ICMP协议。如果想让远端ping通服务器,需要放通入规则,如果服务器本地想ping通,需要放通出规则。再次,检查是否禁用了ping命令。临时允许PING操作的命令排查一下,命令重启失效:#echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all其他,检查防火墙配置等。参考:cid:link_1Windows下的ping操作默认ping 4次,Linux默认会一直执行,通过- c参数可以指定ping多少次后自动终止。DNS解析上面ping用的IP地址,有时我们经常使用域名去ping,但域名却无法ping通,再结合提示信息大概率可以看出是没有做域名解析。临时生效:在/etc/resolv.conf 配置公司内网域名服务器后,可以解析域名。如果没有配置NDS域名解析服务器,ping域名的时候就会报Could not resolve 'xx域名',域名解析服务器可以在电脑上通过ipconfig –all查询后填上去,也可以内网上找一些。参考:cid:link_11永久生效(~不知道为什么实际操作不生效,暂时还是用临时方法~):/etc/resolv.conf是一个软连接,所以上面的方法会在重启服务器后失效。如果想永久生效就在/etc/resolvconf/resolv.conf.d/base文件中配置,然后使用sudo resolvconf -u使配置生效。 永久生效:找了DNS和OS的oncall同事帮定位后找到了解决方法。再次cat /etc/resolv.conf,文件里面写了关键信息,只是一开始不太懂,信息提示:1、不要编辑这个文件,因为会被覆盖2、这是一个软连接文件,实际指向了../run/resolvconf/resolv.conf3、运行systemd-resolve –status查看实际的nameservers执行systemd-resolve --status,发现:这里的DNS是创建服务器的时候,弹性网卡上绑定的子网对应的DNS,重新创建子网,修改DNS服务器地址,更换服务器的VPC,重启机器,DNS解析正确,ping域名正常,NDS永久生效。python开发环境安装配置配置华为内源新环境安装后,很多软件都是操作系统自带的。可以先更新一次。默认系统的安装包地址是国外的地址,下载会很慢或者直接下载失败,因此需要先替换软件包下载源地址,这里替换为公司的地址。华为开源镜像站的地址:https://mirrors.huaweicloud.com(公网)https://repo.huaweicloud.com(公网)首先ping一下内网镜像地址,看看服务器和内网镜像是否连通。 备份配置文件:sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak修改sources.list文件,将http://archive.ubuntu.com和http://security.ubuntu.com替换成http://mirrors.tools.huawei.com,可以参考如下命令:sudo sed -i "s@http://.*archive.ubuntu.com@http://mirrors.tools.huawei.com@g" /etc/apt/sources.listsudo sed -i "s@http://.*security.ubuntu.com@http://mirrors.tools.huawei.com@g" /etc/apt/sources.listapt-get update #同步/etc/apt/sources.list,更新最新的软件包apt-get upgrade #对已经安装的软件包进行升级,如果出现/var/lib/dpkg/info相关问题参考:cid:link_7下载并更新软件:参考:DevEnvSetup - PerformanceQuickFeedback_VsCode (huawei.com)cid:link_12安装python安装系统时会默认自带python,但是版本会比较旧。通过which python命令查看当前python的路径。Whereis python可以看出系统安装了2.7和3.6的版本。查看python版本以及python路径:对于安装指定的python版本,可以下载源码后编译安装。参考:cid:link_81、安装编译依赖:sudo apt install -y wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev2、下载对应版本的python包cid:link_21,选择Gzipped source tarball,并上传到服务器并解压tar -zxvf Python-3.9.5.tgz。 3、cd Python-3.9.5/,进入解压后的Python-3.9.5目录,进行编译安装。执行如下命令编译安装:./configure --prefix=/usr/local/python39make && make install--prefix是Python的安装目录,同时安装了setuptools和pip工具,编译后提示安装成功,但是系统这里提示还没有环境变量。参考:cid:link_20配置软连接查看一下python的软连接,python、python2会进入安装的python2.7版本,python3会进入安装的python3.6版本。为了能使用我们自行安装的python3.9,这里需要把原来的软连接删除掉,添加python3.9的软连接。执行ll /usr/bin | grep python和ll /usr/bin | grep pip查看设置后的软链接删除原来的软连接:sudo rm pythonsudo rm python3 #删除软连接,并不会删除安装的python2.7和python3.5版本 创建新的软连接sudo ln -s /usr/local/python39/bin/python3.9 /usr/bin/python #创建软连接sudo ln -s /usr/local/python39/bin/python3.9 /usr/bin/python3 #创建软连接 配置后即可通过python直接进入python3.9运行环境。 同样,为pip命令创建软连接:sudo ln -s /usr/local/python39/bin/pip3.9 /usr/bin/pip #为 pip 设置软链接sudo ln -s /usr/local/python39/bin/pip3.9 /usr/bin/pip3 #为 pip 设置软链接重新安装python并更换软连接后,pip list命令会报错。此时把/usr/local/bin/pip的版本改成安装的版本即可。或者通过环境变量,把新安装的python放环境变量里(这里和上面的操作二选一)。配置环境变量,只修改当前用户的PATH并永久生效。echo $PATH #打印环境变量vim .bashrc #修改环境变量的配置文件source ~/.bashrc #配置文件参数立即生效参考:cid:link_15配置pip内源安装python三方库时,pip install命令仍然报错,网络一直发生重试。这是因为linux上下载/更新python库(pip install),默认会直接访问国外的镜像源地址,经常由于无法下载而安装失败,可以用公司的源下载安装。更新下载镜像的python三方库source源即可。更新源后,可正常下载安装python三方库。参考:cid:link_16安装pytorchpytorch官网:cid:link_22。官网提供了非常多的案例和文档,可以了解一下。可以在官网找到安装的命令和安装的要求,如建议Ubuntu的最低版本是13.04,python的最低版本是3.7。所以在安装环境前先确认好Linux、python、torch之间的版本依赖。pip install torch,同理安装torchvision、torchaudio库,安装完后通过pip查看包和版本。torchvision是pytorch的一个图形库,它服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型。torchaudio是pytorch的一个音频库。pytorch基础参考:cid:link_14Pycharm远程连接服务器配置解释器pycharm远程连接服务器本地pycharm IDE远程连接服务器,这样可以多个人同时在相同的环境上开发调试。通过Tools->Deployment->Configuration,进入远程连接配置。首先配置连接,配置SSH登录信息并测试连通性。配置服务器远端的代码目录,本地代码将上传到这个目录。添加远程服务器的python解释器进入下一步输入密码,配置服务器上python解释器的路径,如果需要自动上传本地文件到服务器,可以勾上自动上传勾选框。添加成功后,自动显示读取到的服务器上安装的pip三方库。初次运行时确实用了服务器的解释器,但是运行报没有文件,这是因为前面我们可能没有选择自动上传,手动上传文件后运行成功。手动upload后,运行成功。参考:cid:link_17通过pycharm同步本地和服务器的文件pycharm连接esc服务器后,可以通过pycharm同步本地和服务器上的文件。本地和服务器上的文件映射关系是上面的mappings配置。上传:上面配置时勾选自动上传,在本地新建文件后,IDE会自动上传。下载:在服务器上新增文件后,需要通过IDE手动同步到本地。环境备份与保护通过镜像或快照可以快速、方便的恢复环境到备份时的状态。通过镜像创建ecs服务器创建镜像:cid:link_91、选择创建私有镜像,类型为系统盘镜像,为云服务器创建镜像。命名可以带上日期,或者其他易于辨识的标志,创建镜像即可。 2、用创建的镜像购买ECS云服务器,其他网络、硬盘配置参考原来的ecs配置。登录两个环境,看看安装的软件是否一样。推荐及时创建备份镜像,以镜像形式恢复环境,系统盘镜像是免费的。镜像计费标准:cid:link_3通过快照恢复环境在新建的环境上创建快照, 或者在首页快速进入快照页面。快照恢复:需要先关机、然后卸载磁盘后,再通过快照回滚。通过快照恢复数据:cid:link_5卸载一些安装包后,通过快照恢复,查看是否恢复环境。通过外部镜像创建ecs服务器参考:cid:link_61、准备镜像,准备将要创建服务器的镜像2、上传镜像,把外部镜像上传到obs3、注册镜像,通过镜像服务注册镜像4、创建ecs服务器,用注册的镜像创建ecs服务器如果想克隆他人环境,可以把他人的环境制作的镜像导出后作为外部镜像,然后基于这个镜像创建自己的服务器。Linux常用命令基本命令xxcommand –help #帮助命令,查询xxcommand的用法reboot #重启系统cat /proc/version  #查看版本信息,lsb_release –a #查看Linux发行版,cat /etc/issue #查看Linux发行版echo $PATH #打印环境变量vim .bashrc #修改环境变量的配置文件source ~/.bashrc #配置文件参数立即生效vim /etc/hostname #修改主机名find /xx -name test01 #在根目录下查找test01这个文件夹ls /xx -lR|grep "^-"|wc –l #查看数据多少du -sh /xx #查看数据大小网络命令ifconfig #查看ip信息systemd-resolve --status #查看DNS服务状态systemd-resolve DOMAIN #解析域名,如systemd-resolve baidu.comdig #dig是一个给力DNS查询工具curl #网络连通测试、下载等工具
  • [技术干货] 一键部署k8s2
    # 查看密码[root@k8s-master-node1 BlueOcean]# kubectl -n devops exec jenkins-7d4f5696b7-hqw9d --cat /var/jenkins_home/secrets/initialAdminPassword32c47352c469a4ef58e8a797226949e88 * *前面安装了离线插件,所以这里需要重启 jenkins ,地址栏加入 restart 完成重启*   2.2.7 安装 GitLab将 GitLab 部署到 default 命名空间下,要求设置 root 用户密码,新建公开项 目,并将提供的代码上传到该项目。[root@k8s-master-node1 BlueOcean]# kubectl create deployment gitlab -n devops --image=gitlab/gitlab-ce:latest --port 80 --dry-run -o yaml > gitlab.yamlW0222 12:00:34.346609   25564 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.[root@k8s-master-node1 BlueOcean]# vim gitlab.yamlapiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: devopsspec:  replicas: 1  selector:    matchLabels:      app: gitlab  #strategy: {}  template:    metadata:      #creationTimestamp: null      labels:        app: gitlab    spec:      containers:      - image: gitlab/gitlab-ce:latest         imagePullPolicy: IfNotPresent        name: gitlab-ce        ports:        - containerPort: 80        env:        - name: GITLAB_ROOT_PASSWORD          value: admin@123[root@k8s-master-node1 BlueOcean]# kubectl apply -f gitlab.yamldeployment.apps/gitlab created[root@k8s-master-node1 BlueOcean]# kubectl  get pod -n devopsNAME                      READY   STATUS    RESTARTS      AGEgitlab-5b47c8d994-8s9qb   1/1     Running   0             17sjenkins-bbf477c4f-55vgj   1/1     Running   2 (15m ago)   34m[root@k8s-master-node1 BlueOcean]# kubectl expose deployment gitlab -n devops --port=80 --target-port=30888 --dry-run=client -o yaml >> gitlab.yaml[root@k8s-master-node1 BlueOcean]# vim gitlab.yaml # 进入添加---apiVersion: v1kind: Servicemetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: devopsspec:  ports:  - port: 80    nodePort: 30888  selector:    app: gitlab  type: NodePort[root@k8s-master-node1 BlueOcean]# kubectl apply -f gitlab.yaml deployment.apps/gitlab configuredservice/gitlab created[root@k8s-master-node1 BlueOcean]# kubectl get svc -n devops NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEgitlab    NodePort   10.96.149.160   <none>        80:30888/TCP     6sjenkins   NodePort   10.96.174.123   <none>        8080:30880/TCP   8m7s# 等待gitlab启动,访问IP:30888  root , admin@123 登录 Gitlab* # 将springcloud文件夹中的代码上传到该项目,Gitlab提供了代码示例[root@k8s-master-node1 BlueOcean]# cd springcloud/[root@k8s-master-node1 springcloud]# git config --global user.name "Administrator"[root@k8s-master-node1 springcloud]# git config --global user.email "admin@example.com"[root@k8s-master-node1 springcloud]# git remote remove origin[root@k8s-master-node1 springcloud]# git remote add origin  cid:link_0[root@k8s-master-node1 springcloud]# git add .[root@k8s-master-node1 springcloud]# git commit -m "Initial commit"# On branch masternothing to commit, working directory clean[root@k8s-master-node1 springcloud]# git push -u origin masterUsername for 'http://192.168.100.23:30888': root Password for 'http://root@192.168.100.23:30888':(admin@123)Counting objects: 3192, done.Delta compression using up to 4 threads.Compressing objects: 100% (1428/1428), done.Writing objects: 100% (3192/3192), 1.40 MiB | 0 bytes/s, done.Total 3192 (delta 1233), reused 3010 (delta 1207)remote: Resolving deltas: 100% (1233/1233), done.To cid:link_0 * [new branch]      master -> masterBranch master set up to track remote branch master from origin.2.2.8 配置 Jenkins 与 GitLab 集成在 Jenkins 中新建流水线任务,配置 GitLab 连接 Jenkins,并完成 WebHook 的配置。 * *在 GitLab 中生成名为 jenkins 的“Access Tokens”* * *返回 jenkins*   * *回到 Gitlab ,复制 token* * *复制后填写到此* 2.2.9 构建 CI/CD 环境在流水线任务中编写流水线脚本,完成后触发构建,要求基于 GitLab 中的 项目自动完成代码编译、镜像构建与推送、并自动发布服务到 Kubernetes 集群 中。# 创建命名空间[root@k8s-master-node1 ~]# kubectl create ns springcloud* *新建流水线*    * *添加 Gitlab 用户密码*  * *记住脚本路径的名称 Jenkinsfile ,后面创建的流水线文件名与此匹配* * *Harbor 仓库创建公开项目 springcloud* * *返回 Gitlab 准备编写流水线* # 添加映射[root@k8s-master-node1 ~]# cat /etc/hosts192.168.59.200 apiserver.cluster.local # 选择这一行# 进入jenkins 添加映射[root@k8s-master-node1 ~]# kubectl exec -it -n devops jenkins-bbf477c4f-55vgj bashkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.root@jenkins-bbf477c4f-55vgj:/# echo "192.168.200.59 apiserver.cluster.local" >> /etc/hostsroot@jenkins-bbf477c4f-55vgj:/# cat /etc/hosts # 查看是否成功 # 编写流水线pipeline{    agent none    stages{        stage('mvn-build'){            agent{                docker{                    image '192.168.3.10/library/maven'                    args '-v /root/.m2:/root/.m2'                }            }            steps{                sh 'cp -rvf /opt/repository /root/.m2'                sh 'mvn package -DskipTests'            }        }        stage('image-build'){            agent any            steps{                sh 'cd gateway && docker build -t 192.168.3.10/springcloud/gateway -f Dockerfile .'                sh 'cd config && docker build -t 192.168.3.10/springcloud/config -f Dockerfile .'                sh 'docker login 192.168.3.10 -u=admin -p=Harbor12345'                sh 'docker push 192.168.3.10/springcloud/gateway'                sh 'docker push 192.168.3.10/springcloud/config'            }        }        stage('cloud-deployment'){            agent any            steps{                sh 'sed -i "s/sqshq\\/piggymetrics-gateway/192.168.3.10\\/springcloud\\/gateway/g" yaml/deployment/gateway-deployment.yaml'                sh 'sed -i "s/sqshq\\/piggymetrics-config/192.168.3.10\\/springcloud\\/config/g" yaml/deployment/config-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/gateway-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/config-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/gateway-svc.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/config-svc.yaml'            }        }    }}stages:代表整个流水线的所有执行阶段,通常stages只有1个,里面包含多个stage。stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容。* *保存流水线文件,配置Webhook触发构建*  * *取消勾选 SSL 选择, Add webhook 创建*![](vx_images/545790416256726.png =900x) * *创建成功进行测试,成功后返回 jenkins 会发现流水线已经开始自动构建* * *流水线执行成功* * *springcloud 项目镜像上传成功*# 流水线构建的项目全部运行[root@k8s-master-node1 ~]# kubectl get pod -n springcloud NAME                       READY   STATUS    RESTARTS      AGEconfig-77c74dd878-8kl4x    1/1     Running   0             28sgateway-5b46966894-twv5k   1/1     Running   1 (19s ago)   28s[root@k8s-master-node1 ~]# kubectl -n springcloud get serviceNAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGEconfig    NodePort   10.96.137.40   <none>        8888:30015/TCP   4m3sgateway   NodePort   10.96.121.82   <none>        4000:30010/TCP   4m4s* *等待 PIg 微服务启动,访问 ip:30010 查看构建成功*2.2.10 服务网格:创建 Ingress Gateway将 Bookinfo 应用部署到 default 命名空间下,请为 Bookinfo 应用创建一个网 关,使外部可以访问 Bookinfo 应用。上传ServiceMesh.tar.gz包[root@k8s-master-node1 ~]# tar -zxvf ServiceMesh.tar.gz [root@k8s-master-node1 ~]# cd ServiceMesh/images/[root@k8s-master-node1 images]# docker load -i image.tar 部署Bookinfo应用到kubernetes集群:[root@k8s-master-node1 images]# cd /root/ServiceMesh/[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo/bookinfo.yamlservice/details createdserviceaccount/bookinfo-details createddeployment.apps/details-v1 createdservice/ratings createdserviceaccount/bookinfo-ratings createddeployment.apps/ratings-v1 createdservice/reviews createdserviceaccount/bookinfo-reviews createddeployment.apps/reviews-v1 createdservice/productpage createdserviceaccount/bookinfo-productpage createddeployment.apps/productpage-v1 created[root@k8s-master-node1 ServiceMesh]# kubectl get podNAME                              READY   STATUS    RESTARTS   AGEdetails-v1-79f774bdb9-kndm9       1/1     Running   0          7sproductpage-v1-6b746f74dc-bswbx   1/1     Running   0          7sratings-v1-b6994bb9-6hqfn         1/1     Running   0          7sreviews-v1-545db77b95-j72x5       1/1     Running   0          7s[root@k8s-master-node1 ServiceMesh]# vim bookinfo-gateway.yamlapiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: bookinfo-gatewayspec:  selector:    istio: ingressgateway  servers:  - port:      number: 80      name: http      protocol: HTTP    hosts:     - "*" ---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: bookinfospec:  hosts:   - "*"    gateways:  - bookinfo-gateway  http:  - match:     - uri:        exact: /productpage     - uri:        prefix: /static    - uri:        exact: /login    - uri:        exact: /logout    - uri:        prefix: /api/v1/products    route: # 定义路由转发目的地列表    - destination:        host: productpage        port:          number: 9080[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo-gateway.yamlgateway.networking.istio.io/bookinfo-gateway createdvirtualservice.networking.istio.io/bookinfo created [root@k8s-master-node1 ServiceMesh]#kubectl get VirtualService bookinfo -o yamlbookinfo-gateway || exact: /productpage || destination || host: productpage || number: 9080[root@k8s-master-node1 ServiceMesh]#kubectl get gateway bookinfo-gateway -o yamlistio: ingressgateway2.2.11 KubeVirt 运维:创建 VM使用提供的镜像在 kubevirt 命名空间下创建一台 VM,名称为 exam,指定 VM 的内存、CPU、网卡和磁盘等配置。[root@k8s-master-node1 ~]# kubectl explain kubevirt.spec. --recursive |grep use         useEmulation   <boolean>[root@k8s-master-node1 ~]# kubectl -n kubevirt edit kubevirtspec:  certificateRotateStrategy: {}  configuration:    developerConfiguration: #{}      useEmulation: true[root@k8s-master-node1 ~]# vim vm.yamlapiVersion: kubevirt.io/v1kind: VirtualMachinemetadata:  name: examspec:  running: true  template:    spec:      domain:        devices:          disks:            - name: vm              disk: {}        resources:          requests:            memory: 1Gi      volumes:        - name: vm          containerDisk:            image: fedora-virt:v1.0            imagePullPolicy: IfNotPresent[root@k8s-master-node1 ~]# kubectl apply -f vm.yamlvirtualmachine.kubevirt.io/exam created[root@k8s-master-node1 ~]# kubectl get virtualmachineNAME        AGE   STATUS    READYexam   31s   Running   True[root@k8s-master-node1 ~]# kubectl delete -f vm.yamlvirtualmachine.kubevirt.io "exam" deleted2.2.12 完成容器云平台的调优或排错工作。(本任务只公布考试范围,不公 布赛题) 任务 3 容器云运维开发(10 分)2.3.1 管理 Job 服务Kubernetes Python 运维脚本开发-实现 Job 服务管理。 2.3.2 自定义调度器Kubernetes Python 运维脚本开发-实现调度器管理。 2.3.3 编写 Kubernetes 容器云平台自动化运维工具。(本任务只公布考试范 围,不公布赛题)  
  • [技术干货] 一键部署k8s
    命令两台安装好docker的Linux主机registry  192.168.XX.YYnode1     192.168.XX.YY#仓库机,在将要安装镜像仓库的机子上进行的操作:#拉取registry镜像docker pull registry#在本地创建文件夹,将来将容器内的文件夹映射到此文件夹mkdir /myregistry#基于registry镜像启动容器#  -d 容器后台运行#  -p 5000:5000  将镜像仓库容器提供服务的5000端口映射到宿主机5000端口#  --name  pri_registry 将容器命名为pri_registry#  -v /myregistry:/var/lib/registry 将容器内的/var/lib/registry文件夹映射到宿主机的/myregistry文件夹#  --restart=always  设置容器故障自动重启docker run -d -p 5000:5000 --name pri_registry -v /myregistry:/var/lib/registry --restart=always registry#查看容器docker ps -a#测试一下是否能访问到容器内的catalog文件,如果可以,标识成功,否则失败curl -X GET http://192.168.XX.XX:5000/v2/_catalog###此IP为运行容器的宿主机的IP地址###正确访问执行结果如下:{"repositories":[]}#标识当前仓库中没有任何镜像,为空#以下步骤是从官网拉取一个测试镜像,进行标注,推送到自建的私有仓库docker pull busyboxdocker tag busybox:latest 192.168.XX.XX:5000/busybox:latestdocker push 192.168.XX.XX:5000/busybox:latest#如遇到问题vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --insecure-registry 192.168.XX.XX:5000systemctl daemon-reloadsystemctl restart dockerdocker restart pri_registry####若要允许远程访问vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 192.168.XX.XX:5000###此时可以把上面push操作再测试一下docker push 192.168.XX.XX:5000/busybox:latestcurl -X GET http://192.168.XX.XX:5000/v2/_catalog##查看到的结果如下{"repositories":["busybox"]}#表示我们的镜像busybox已经push到私有仓库###查看仓库镜像:ls /myregistry/docker/registry/v2/repositories##客户机,在镜像仓库所在机器之外的另外一台装好了docker的机器上操作docker pull 192.168.XX.XX:5000/busybox#如遇到问题vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --insecure-registry 192.168.XX.XX:5000systemctl daemon-reloadsystemctl restart docker1  ip a 2  vi /etc/sysconfig/network-scripts/ifcfg-ens333  vi /etc/sysconfig/network-scripts/ifcfg-ens344  systemctl restart network    9  dhclient   10  ping www.baidu.com   11  systemctl stop firewalld   12  setenforce 0   13  ping www.baidu.com   14  vi /etc/sysconfig/network-scripts/ifcfg-ens33   15  systemctl restart network   18  vi /etc/sysconfig/n   30  systemctl stop firewalld   31  systemctl disable firewalld   32  setenforce 0   34  vi /etc/selinux/configdisabled   35  cd /etc/yum.repos.d/   36  ls   37  vi /etc/fstab /dev/cdrom /mnt 9660 defaults 0 0         init 6    38  ll /mnt   39  mount /dev/cdrom /mnt/   40  ll /mnt/   41  ls   42  mkdir backup   43  mv C* backup/   44  ls   45  vi local.repo   46  yum clean all   47  yum makecache   48  yum repolist      55  ll /mnt/   56  umount /mnt/   57  ll /mnt/   58  mount chinaskills_cloud_paas_v2.1.iso /mnt/   59  cp -rvf /mnt/* /opt/   60  umount /mnt/   61  mv /opt/kubeeasy-v2.0 /usr/bin/kubeeasy    65  yum -y install wget   66  sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo   69  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo          yum makecache   73  yum repolist   75  yum -y install wget   76  mv backup/CentOS-Base.repo ./          mkdir backup   95  cd ../   96  mv C* backup/   97  ls   98  vi local.repo[centos]name=centosbaseurl=file:///mntgpgcheck=0enabled=1    99  yum makecahe  102   yum -y install wget  103  sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo  106  yum install -y yum-utils device-mapper-persistent-data lvm2  107  yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  108  yum makecache  111  sudo yum remove docker-ce docker-ce-cli containerd.io -y  114  yum install docker-ce-20.10.21 docker-ce-cli-20.10.21 containerd.io   115  systemctl start docker  116  systemctl restart docker  117  docker -v  118  systemctl enable docker  119  cd /etc/docker/  120  ls  121  vi daemon.jsonsudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<EOF{    "registry-mirrors": [        "https://docker.1ms.run",        "https://docker.xuanyuan.me"    ]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker  122  systemctl daemon.json   123  systemctl daemon-reload  124  sudo systemctl restart docker  125  docker run -dit -p 80:80 nginx:latest  126  docker image ls   137  cd  138  ls  139  yum install gcc.x86_64  -y  140  yum install gcc-c++.x86_64 -y  141  ls wget https://nchc.dl.sourceforge.net/project/sshpass/sshpass/1.06/sshpass-1.06.tar.gztar  zxf sshpass-1.06.tar.gzcd sshpass-1.06./configure  --prefix=/usr/local/make && make installyum -y install sshpass    142  tar zxf sshpass-1.10.tar.gz  143   cd sshpass-1.10  144  ./configure  146  make&& make install    147  kubeeasy install depend --host 192.168.122.11,192.168.122.12 --user root --password 123456 --offline-file /opt/dependencies/packages.tar.gz    149  yum -y install rsync  151  sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo   152  yum makecache   154  cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF   155  cd  156  yum makecache  157  yum install kubelet-1.25.2 kubeadm-1.25.2 kubectl-1.25.2 --nogpgcheck -y   153 ( yum -y install kubelet-1.25.2 kubeadm-1.25.2 kubectl–1.25.2 --disableexcludes=kubernetes)  158  yum search kubeadm  159  history  160  yum -y install rsync           yum -y install rsync sudo yum install nfs-utils rpcbindsudo yum install nfs-utils rpcbind sudo systemctl restart nfs-server rpcbind nfs-client.targetsudo systemctl status nfs-server rpcbind   162  kubeeasy install k8s --master 192.168.122.11 --worker 192.168.122.12 --user root --password 123456 --offline-file /opt/kubeeasy.tar.gz    163  kubectl cluster-info  164  kubectl get pods  165  kubectl get nodes [root@k8s-master-node1 ~]#tar -zxvf Hyperf.tar.gz[root@k8s-master-node1 ~]#cd hyperf/[root@k8s-master-node1 hyperf]#docker load -i centos_7.9.2009.tar上传node_exporter-1.7.0.linux-amd64.tar包[root@k8s-master-node1 hyperf]#vim Dockerfile-exporterFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD node_exporter-1.7.0.linux-amd64.tar.gz /root/EXPOSE 9100ENTRYPOINT ["./root/node_exporter-1.7.0.linux-amd64/node_exporter"][root@k8s-master-node1 hyperf]#docker build -t monitor-exporter:v1.0 -f Dockerfile-exporter .2.2.2 容器化部署Alertmanager编写 Dockerfile 文件构建 alert 镜像,要求基于 centos:latest 完成 Alertmanager 服务的安装与配置,并设置服务开机自启。上传alertmanager-0.26.0.linux-amd64.tar包[root@k8s-master-node1 hyperf]#vim Dockerfile-alertFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD alertmanager-0.26.0.linux-amd64.tar.gz /root/EXPOSE 9093 9094ENTRYPOINT ["./root/alertmanager-0.26.0.linux-amd64/alertmanager","--config.file","/root/alertmanager-0.26.0.linux-amd64/alertmanager.yml"][root@k8s-master-node1 hyperf]#docker build -t monitor-alert:v1.0 -f Dockerfile-alert .2.2.3 容器化部署 Grafana编写 Dockerfile 文件构建 grafana 镜像,要求基于 centos 完成 Grafana 服务 的安装与配置,并设置服务开机自启。上传grafana-6.4.1.linux-amd64.tar.gz包[root@k8s-master-node1 hyperf]#vim Dockerfile-grafanaFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD grafana-6.4.1.linux-amd64.tar.gz /root/EXPOSE 3000ENTRYPOINT ["./root/grafana-6.4.1/bin/grafana-server","-homepath","/root/grafana-6.4.1/"][root@k8s-master-node1 hyperf]#docker build -t monitor-grafana:v1.0 -f Dockerfile-grafana .[root@k8s-master-node1 hyperf]#docker run -d --name grafana-exam-jiance monitor-grafana:v1.0 && sleep 5 && docker exec grafana-exam-jiance ps -aux && docker rm -f grafana-exam-jiance2.2.4 容器化部署 Prometheus 编写 Dockerfile 文件构建 prometheus 镜像,要求基于 centos 完成 Promethues 服务的安装与配置,并设置服务开机自启。上传prometheus-2.13.0.linux-amd64.tar.gz并解压[root@k8s-master-node1 hyperf]#tar -zxvf prometheus-2.13.0.linux-amd64.tar.gz[root@k8s-master-node1 hyperf]#mv prometheus-2.13.0.linux-amd64/prometheus.yml /root/hyperf && rm -rf prometheus-2.13.0.linux-amd64[root@k8s-master-node1 hyperf]#vim Dockerfile-prometheusFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD prometheus-2.13.0.linux-amd64.tar.gz /root/RUN mkdir -p /data/prometheus/COPY prometheus.yml /data/prometheus/EXPOSE 9090ENTRYPOINT ["./root/prometheus-2.13.0.linux-amd64/prometheus","--config.file","/data/prometheus/prometheus.yml"][root@k8s-master-node1 hyperf]#docker build -t monitor-prometheus:v1.0 -f Dockerfile-prometheus .[root@k8s-master-node1 hyperf]#vim prometheus.yml #改动  - job_name: 'prometheus'    static_configs:    - targets: ['localhost:9090']   - job_name: 'node'    static_configs:    - targets: ['node:9100']   - job_name: 'alertmanager'    static_configs:    - targets: ['alertmanager:9093']  - job_name: 'node-exporter'    static_configs:    - targets: ['node:9100']2.2.5 编排部署 Prometheus编写 docker-compose.yaml 文件,使用镜像 exporter、alert、grafana 和 prometheus 完成监控系统的编排部署。[root@k8s-master-node1 hyperf]#vim docker-compose.yamlversion: '3'services:  node:    container_name: monitor-node    image: monitor-exporter:v1.0    restart: always    hostname: node    ports:      - 9100:9100  alertmanager:    container_name: monitor-alertmanager    image: monitor-alert:v1.0    depends_on:      - node    restart: always    hostname: alertmanager    links:      - node    ports:      - 9093:9093      - 9094:9094  grafana:    container_name: monitor-grafana    image: monitor-grafana:v1.0    restart: always    depends_on:      - node      - alertmanager    hostname: grafana    links:      - node      - alertmanager    ports:      - 3000:3000  prometheus:    container_name: monitor-prometheus    image: monitor-prometheus:v1.0    restart: always    depends_on:      - node      - alertmanager      - grafana    hostname: prometheus    links:      - node      - alertmanager      - grafana    ports:      - 9090:9090[root@k8s-master-node1 ~]#docker-compose up -d  模块二 容器云(30 分)任务 1 容器云服务搭建(5 分)2.1.1 部署容器云平台使用 OpenStack 私有云平台创建两台云主机,分别作为 Kubernetes 集群的 master 节点和 node 节点,然后完成 Kubernetes 集群的部署,并完成 Istio 服务网 格、KubeVirt 虚拟化和 Harbor 镜像仓库的部署。创建俩台云主机并配网# Kubernetes 集群的部署[root@localhost ~]# mount -o loop chinaskills_cloud_paas_v2.0.2.iso /mnt/[root@localhost ~]# cp -rfv /mnt/* /opt/[root@localhost ~]# umount /mnt/[root@master ~]# hostnamectl set-hostname master && su[root@worker ~]# hostnamectl set-hostname worker && su# 安装kubeeasy[root@master ~]# mv /opt/kubeeasy /usr/bin/kubeeasy# 安装依赖环境[root@master ~]# kubeeasy install depend \--host 192.168.59.200,192.168.59.201 \--user root \--password 000000 \--offline-file /opt/dependencies/base-rpms.tar.gz# 安装k8s[root@master ~]# kubeeasy install k8s \--master 192.168.59.200 \--worker 192.168.59.201 \--user root \--password 000000 \--offline-file /opt/kubernetes.tar.gz# 安装istio网格[root@master ~]# kubeeasy add --istio istio# 安装kubevirt虚拟化[root@master ~]# kubeeasy add --virt kubevirt# 安装harbor仓库[root@master ~]# kubeeasy add --registry harbor[root@k8s-master-node1 ~]# vim pod.yamlapiVersion: v1kind: Podmetadata:  name: examspec:  containers:  - name: exam    image: nginx:latest    imagePullPolicy: IfNotPresent    env:    - name: exam      value: "2022"[root@k8s-master-node1 ~]# kubectl apply -f pod.yaml[root@k8s-master-node1 ~]# kubectl get pod#部署 Istio 服务网格[root@k8s-master-node1 ~]# kubectl create ns examnamespace/exam created[root@k8s-master-node1 ~]# kubectl edit ns exam更改为:  labels:    istio-injection: enabled[root@k8s-master-node1 ~]# kubectl describe ns exam  #查看任务 2 容器云服务运维(15 分)2.2.1 容器化部署 Node-Exporter编写 Dockerfile 文件构建 exporter 镜像,要求基于 centos 完成 Node-Exporter 服务的安装与配置,并设置服务开机自启。yum -y install git上传Hyperf.tar包[root@k8s-master-node1 ~]#tar -zxvf Hyperf.tar.gz[root@k8s-master-node1 ~]#cd hyperf/[root@k8s-master-node1 hyperf]#docker load -i centos_7.9.2009.tar上传node_exporter-1.7.0.linux-amd64.tar包[root@k8s-master-node1 hyperf]#vim Dockerfile-exporterFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD node_exporter-1.7.0.linux-amd64.tar.gz /root/EXPOSE 9100ENTRYPOINT ["./root/node_exporter-1.7.0.linux-amd64/node_exporter"][root@k8s-master-node1 hyperf]#docker build -t monitor-exporter:v1.0 -f Dockerfile-exporter .2.2.2 容器化部署Alertmanager编写 Dockerfile 文件构建 alert 镜像,要求基于 centos:latest 完成 Alertmanager 服务的安装与配置,并设置服务开机自启。上传alertmanager-0.26.0.linux-amd64.tar包[root@k8s-master-node1 hyperf]#vim Dockerfile-alertFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD alertmanager-0.26.0.linux-amd64.tar.gz /root/EXPOSE 9093 9094ENTRYPOINT ["./root/alertmanager-0.26.0.linux-amd64/alertmanager","--config.file","/root/alertmanager-0.26.0.linux-amd64/alertmanager.yml"][root@k8s-master-node1 hyperf]#docker build -t monitor-alert:v1.0 -f Dockerfile-alert .2.2.3 容器化部署 Grafana编写 Dockerfile 文件构建 grafana 镜像,要求基于 centos 完成 Grafana 服务 的安装与配置,并设置服务开机自启。上传grafana-6.4.1.linux-amd64.tar.gz包[root@k8s-master-node1 hyperf]#vim Dockerfile-grafanaFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD grafana-6.4.1.linux-amd64.tar.gz /root/EXPOSE 3000ENTRYPOINT ["./root/grafana-6.4.1/bin/grafana-server","-homepath","/root/grafana-6.4.1/"][root@k8s-master-node1 hyperf]#docker build -t monitor-grafana:v1.0 -f Dockerfile-grafana .[root@k8s-master-node1 hyperf]#docker run -d --name grafana-exam-jiance monitor-grafana:v1.0 && sleep 5 && docker exec grafana-exam-jiance ps -aux && docker rm -f grafana-exam-jiance2.2.4 容器化部署 Prometheus 编写 Dockerfile 文件构建 prometheus 镜像,要求基于 centos 完成 Promethues 服务的安装与配置,并设置服务开机自启。上传prometheus-2.13.0.linux-amd64.tar.gz并解压[root@k8s-master-node1 hyperf]#tar -zxvf prometheus-2.13.0.linux-amd64.tar.gz[root@k8s-master-node1 hyperf]#mv prometheus-2.13.0.linux-amd64/prometheus.yml /root/hyperf && rm -rf prometheus-2.13.0.linux-amd64[root@k8s-master-node1 hyperf]#vim Dockerfile-prometheusFROM centos:centos7.9.2009MAINTAINER ChinaskillsRUN rm -rf /etc/yum.repos.d/*ADD prometheus-2.13.0.linux-amd64.tar.gz /root/RUN mkdir -p /data/prometheus/COPY prometheus.yml /data/prometheus/EXPOSE 9090ENTRYPOINT ["./root/prometheus-2.13.0.linux-amd64/prometheus","--config.file","/data/prometheus/prometheus.yml"][root@k8s-master-node1 hyperf]#docker build -t monitor-prometheus:v1.0 -f Dockerfile-prometheus .[root@k8s-master-node1 hyperf]#vim prometheus.yml #改动  - job_name: 'prometheus'    static_configs:    - targets: ['localhost:9090']   - job_name: 'node'    static_configs:    - targets: ['node:9100']   - job_name: 'alertmanager'    static_configs:    - targets: ['alertmanager:9093']  - job_name: 'node-exporter'    static_configs:    - targets: ['node:9100']2.2.5 编排部署 Prometheus编写 docker-compose.yaml 文件,使用镜像 exporter、alert、grafana 和 prometheus 完成监控系统的编排部署。[root@k8s-master-node1 hyperf]#vim docker-compose.yamlversion: '3'services:  node:    container_name: monitor-node    image: monitor-exporter:v1.0    restart: always    hostname: node    ports:      - 9100:9100  alertmanager:    container_name: monitor-alertmanager    image: monitor-alert:v1.0    depends_on:      - node    restart: always    hostname: alertmanager    links:      - node    ports:      - 9093:9093      - 9094:9094  grafana:    container_name: monitor-grafana    image: monitor-grafana:v1.0    restart: always    depends_on:      - node      - alertmanager    hostname: grafana    links:      - node      - alertmanager    ports:      - 3000:3000  prometheus:    container_name: monitor-prometheus    image: monitor-prometheus:v1.0    restart: always    depends_on:      - node      - alertmanager      - grafana    hostname: prometheus    links:      - node      - alertmanager      - grafana    ports:      - 9090:9090[root@k8s-master-node1 ~]#docker-compose up -d2.2.6 安装 Jenkins将 Jenkins 部署到 default 命名空间下。要求完成离线插件的安装,设置 Jenkins 的登录信息和授权策略。上传BlueOcean.tar.gz包[root@k8s-master-node1 ~]#tar -zxvf BlueOcean.tar.gz[root@k8s-master-node1 ~]#cd BlueOcean/images/[root@k8s-master-node1 images]# docker load -i java_8-jre.tar[root@k8s-master-node1 images]# docker load -i jenkins_jenkins_latest.tar[root@k8s-master-node1 images]# docker load -i gitlab_gitlab-ce_latest.tar[root@k8s-master-node1 images]# docker load -i maven_latest.tar[root@k8s-master-node1 images]# docker tag maven:latest  192.168.59.200/library/maven[root@k8s-master-node1 images]# docker login 192.168.59.200Username: adminPassword: (Harbor12345) WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-store[root@k8s-master-node1 images]# docker push  192.168.59.200/library/maven#安装Jenkins[root@k8s-master-node1 BlueOcean]# kubectl create ns devops[root@k8s-master-node1 BlueOcean]# kubectl create deployment jenkins -n devops --image=jenkins/jenkins:latest --port 8080 --dry-run -o yaml > jenkins.yaml[root@k8s-master-node1 BlueOcean]# vim jenkins.yaml # 进入添加apiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: jenkins  name: jenkins  namespace: devopsspec:  replicas: 1  selector:    matchLabels:      app: jenkins#strategy: {}  template:metadata:#creationTimestamp: null      labels:        app: jenkins    spec:      nodeName: k8s-master-node1 # 强制调度到master节点      containers:      - image: jenkins/jenkins:latest        imagePullPolicy: IfNotPresent        name: jenkins        ports:        - containerPort: 8080          name: jenkins8080        securityContext:          runAsUser: 0          privileged: true        volumeMounts:        - name: jenkins-home          mountPath: /home/jenkins_home/        - name: docker-home          mountPath: /run/docker.sock        - name: docker          mountPath: /usr/bin/docker        - name: kubectl          mountPath: /usr/bin/kubectl        - name: kube          mountPath: /root/.kube      volumes:      - name: jenkins-home        hostPath:          path: /home/jenkins_home/      - name: docker-home        hostPath:          path: /run/docker.sock      - name: docker        hostPath:          path: /usr/bin/docker      - name: kubectl        hostPath:          path: /usr/bin/kubectl      - name: kube        hostPath:          path: /root/.kube[root@k8s-master-node1 BlueOcean]# kubectl apply -f jenkins.yamldeployment.apps/jenkins created[root@k8s-master-node1 ~]# kubectl get pod -n devops NAME                      READY   STATUS    RESTARTS   AGEjenkins-7d4f5696b7-hqw9d   1/1     Running   0          88s# 进入jenkins,确定docker和kubectl成功安装[root@k8s-master-node1 ~]# kubectl exec -it -n default  jenkins-7d4f5696b7-hqw9d bash[root@k8s-master-node1 BlueOcean]# kubectl expose deployment jenkins -n devops --port=8080 --target-port=30880 --dry-run -o yaml >> jenkins.yaml[root@k8s-master-node1 BlueOcean]# vim jenkins.yaml # 进入修改apiVersion: v1kind: Servicemetadata:  creationTimestamp: null  labels:    app: jenkins  name: jenkins  namespace: devopsspec:  ports:  - port: 8080#protocol: TCP    name: jenkins8080    nodePort: 30880  - name: jenkins    port: 50000    nodePort: 30850  selector:    app: jenkins  type: NodePort[root@k8s-master-node1 BlueOcean]# kubectl apply -f jenkins.yamlservice/jenkins created[root@k8s-master-node1 ~]# kubectl get -n devops svcNAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGEjenkins   NodePort   10.96.53.170   <none>        8080:30880/TCP   10s# 使用提供的软件包完成Blue Ocean等离线插件的安装[root@k8s-master-node1 BlueOcean]# kubectl -n devops cp plugins/ jenkins-7d4f5696b7-hqw9d:/var/jenkins_home/* *访问 ip:30880 进入jenkins*# 查看密码[root@k8s-master-node1 BlueOcean]# kubectl -n devops exec jenkins-7d4f5696b7-hqw9d --cat /var/jenkins_home/secrets/initialAdminPassword32c47352c469a4ef58e8a797226949e88 * *前面安装了离线插件,所以这里需要重启 jenkins ,地址栏加入 restart 完成重启*  2.2.7 安装 GitLab将 GitLab 部署到 default 命名空间下,要求设置 root 用户密码,新建公开项 目,并将提供的代码上传到该项目。[root@k8s-master-node1 BlueOcean]# kubectl create deployment gitlab -n devops --image=gitlab/gitlab-ce:latest --port 80 --dry-run -o yaml > gitlab.yamlW0222 12:00:34.346609   25564 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.[root@k8s-master-node1 BlueOcean]# vim gitlab.yamlapiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: devopsspec:  replicas: 1  selector:    matchLabels:      app: gitlab  #strategy: {}  template:    metadata:      #creationTimestamp: null      labels:        app: gitlab    spec:      containers:      - image: gitlab/gitlab-ce:latest         imagePullPolicy: IfNotPresent        name: gitlab-ce        ports:        - containerPort: 80        env:        - name: GITLAB_ROOT_PASSWORD          value: admin@123[root@k8s-master-node1 BlueOcean]# kubectl apply -f gitlab.yamldeployment.apps/gitlab created[root@k8s-master-node1 BlueOcean]# kubectl  get pod -n devopsNAME                      READY   STATUS    RESTARTS      AGEgitlab-5b47c8d994-8s9qb   1/1     Running   0             17sjenkins-bbf477c4f-55vgj   1/1     Running   2 (15m ago)   34m[root@k8s-master-node1 BlueOcean]# kubectl expose deployment gitlab -n devops --port=80 --target-port=30888 --dry-run=client -o yaml >> gitlab.yaml[root@k8s-master-node1 BlueOcean]# vim gitlab.yaml # 进入添加---apiVersion: v1kind: Servicemetadata:  creationTimestamp: null  labels:    app: gitlab  name: gitlab  namespace: devopsspec:  ports:  - port: 80    nodePort: 30888  selector:    app: gitlab  type: NodePort[root@k8s-master-node1 BlueOcean]# kubectl apply -f gitlab.yaml deployment.apps/gitlab configuredservice/gitlab created[root@k8s-master-node1 BlueOcean]# kubectl get svc -n devops NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEgitlab    NodePort   10.96.149.160   <none>        80:30888/TCP     6sjenkins   NodePort   10.96.174.123   <none>        8080:30880/TCP   8m7s# 等待gitlab启动,访问IP:30888  root , admin@123 登录 Gitlab*  # 将springcloud文件夹中的代码上传到该项目,Gitlab提供了代码示例[root@k8s-master-node1 BlueOcean]# cd springcloud/[root@k8s-master-node1 springcloud]# git config --global user.name "Administrator"[root@k8s-master-node1 springcloud]# git config --global user.email "admin@example.com"[root@k8s-master-node1 springcloud]# git remote remove origin[root@k8s-master-node1 springcloud]# git remote add origin  cid:link_0[root@k8s-master-node1 springcloud]# git add .[root@k8s-master-node1 springcloud]# git commit -m "Initial commit"# On branch masternothing to commit, working directory clean[root@k8s-master-node1 springcloud]# git push -u origin masterUsername for 'http://192.168.100.23:30888': root Password for 'http://root@192.168.100.23:30888':(admin@123)Counting objects: 3192, done.Delta compression using up to 4 threads.Compressing objects: 100% (1428/1428), done.Writing objects: 100% (3192/3192), 1.40 MiB | 0 bytes/s, done.Total 3192 (delta 1233), reused 3010 (delta 1207)remote: Resolving deltas: 100% (1233/1233), done.To cid:link_0 * [new branch]      master -> masterBranch master set up to track remote branch master from origin.2.2.8 配置 Jenkins 与 GitLab 集成在 Jenkins 中新建流水线任务,配置 GitLab 连接 Jenkins,并完成 WebHook 的配置。 * *在 GitLab 中生成名为 jenkins 的“Access Tokens”* * *返回 jenkins*   * *回到 Gitlab ,复制 token* * *复制后填写到此* 2.2.9 建 CI/CD境在流水线任务中编写流水线脚本,完成后触发构建,要求基于 GitLab 中的 项目自动完成代码编译、镜像构建与推送、并自动发布服务到 Kubernetes 集群 中。# 创建命名空间[root@k8s-master-node1 ~]# kubectl create ns spri * *记住脚本路径的名称 Jenkinsfile ,后面创建的流水线文件名与此匹配* * *Harbor 仓库创建公开项目 springcloud* * *返回 Gitlab 准备编写流水线* # 添加映射[root@k8s-master-node1 ~]# cat /etc/hosts192.168.59.200 apiserver.cluster.local # 选择这一行# 进入jenkins 添加映射[root@k8s-master-node1 ~]# kubectl exec -it -n devops jenkins-bbf477c4f-55vgj bashkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.root@jenkins-bbf477c4f-55vgj:/# echo "192.168.200.59 apiserver.cluster.local" >> /etc/hostsroot@jenkins-bbf477c4f-55vgj:/# cat /etc/hosts # 查看是否成功 # 编写流水线pipeline{    agent none    stages{        stage('mvn-build'){            agent{                docker{                    image '192.168.3.10/library/maven'                    args '-v /root/.m2:/root/.m2'                }            }            steps{                sh 'cp -rvf /opt/repository /root/.m2'                sh 'mvn package -DskipTests'            }        }        stage('image-build'){            agent any            steps{                sh 'cd gateway && docker build -t 192.168.3.10/springcloud/gateway -f Dockerfile .'                sh 'cd config && docker build -t 192.168.3.10/springcloud/config -f Dockerfile .'                sh 'docker login 192.168.3.10 -u=admin -p=Harbor12345'                sh 'docker push 192.168.3.10/springcloud/gateway'                sh 'docker push 192.168.3.10/springcloud/config'            }        }        stage('cloud-deployment'){            agent any            steps{                sh 'sed -i "s/sqshq\\/piggymetrics-gateway/192.168.3.10\\/springcloud\\/gateway/g" yaml/deployment/gateway-deployment.yaml'                sh 'sed -i "s/sqshq\\/piggymetrics-config/192.168.3.10\\/springcloud\\/config/g" yaml/deployment/config-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/gateway-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/config-deployment.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/gateway-svc.yaml'                sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/config-svc.yaml'            }        }    }}stages:代表整个流水线的所有执行阶段,通常stages只有1个,里面包含多个stage。stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容。* *保存流水线文件,配置Webhook触发构建*  * *取消勾选 SSL 选择, Add webhook 创建*![](vx_images/545790416256726.png =900x) * *创建成功进行测试,成功后返回 jenkins 会发现流水线已经开始自动构建* * *流水线执行成功* * *springcloud 项目镜像上传成功*#构建的项目全部运行[root@k8s-master-node1 ~]# kubectl get pod -n springcloud NAME                       READY   STATUS    RESTARTS      AGEconfig-77c74dd878-8kl4x    1/1     Running   0             28sgateway-5b46966894-twv5k   1/1     Running   1 (19s ago)   28s[root@k8s-master-node1 ~]# kubectl -n springcloud get serviceNAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGEconfig    NodePort   10.96.137.40   <none>        8888:30015/TCP   4m3sgateway   NodePort   10.96.121.82   <none>        4000:30010/TCP   4m4s* *等待 PIg 微服务启动,访问 ip:30010 查看构建成功*2.2.10 服务网格:创建 Ingress Gateway将 Bookinfo 应用部署到 default 命名空间下,请为 Bookinfo 应用创建一个网 关,使外部可以访问 Bookinfo 应用。上传ServiceMesh.tar.gz包[root@k8s-master-node1 ~]# tar -zxvf ServiceMesh.tar.gz [root@k8s-master-node1 ~]# cd ServiceMesh/images/[root@k8s-master-node1 images]# docker load -i image.tar 部署Bookinfo应用到kubernetes集群:[root@k8s-master-node1 images]# cd /root/ServiceMesh/[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo/bookinfo.yamlservice/details createdserviceaccount/bookinfo-details createddeployment.apps/details-v1 createdservice/ratings createdserviceaccount/bookinfo-ratings createddeployment.apps/ratings-v1 createdservice/reviews createdserviceaccount/bookinfo-reviews createddeployment.apps/reviews-v1 createdservice/productpage createdserviceaccount/bookinfo-productpage createddeployment.apps/productpage-v1 created[root@k8s-master-node1 ServiceMesh]# kubectl get podNAME                              READY   STATUS    RESTARTS   AGEdetails-v1-79f774bdb9-kndm9       1/1     Running   0          7sproductpage-v1-6b746f74dc-bswbx   1/1     Running   0          7sratings-v1-b6994bb9-6hqfn         1/1     Running   0          7sreviews-v1-545db77b95-j72x5       1/1     Running   0          7s[root@k8s-master-node1 ServiceMesh]# vim bookinfo-gateway.yamlapiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: bookinfo-gatewayspec:  selector:    istio: ingressgateway  servers:  - port:      number: 80      name: http      protocol: HTTP    hosts:     - "*" ---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: bookinfospec:  hosts:   - "*"    gateways:  - bookinfo-gateway  http:  - match:     - uri:        exact: /productpage     - uri:        prefix: /static    - uri:        exact: /login    - uri:        exact: /logout    - uri:        prefix: /api/v1/products    route: # 定义路由转发目的地列表    - destination:        host: productpage        port:          number: 9080[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo-gateway.yamlgateway.networking.istio.io/bookinfo-gateway createdvirtualservice.networking.istio.io/bookinfo created [root@k8s-master-node1 ServiceMesh]#kubectl get VirtualService bookinfo -o yamlbookinfo-gateway || exact: /productpage || destination || host: productpage || number: 9080[root@k8s-master-node1 ServiceMesh]#kubectl get gateway bookinfo-gateway -o yamlistio: ingressgateway2.2.11 KubeVirt 运维:创建 VM使用提供的镜像在 kubevirt 命名空间下创建一台 VM,名称为 exam,指定 VM 的内存、CPU、网卡和磁盘等配置。[root@k8s-master-node1 ~]# kubectl explain kubevirt.spec. --recursive |grep use         useEmulation   <boolean>[root@k8s-master-node1 ~]# kubectl -n kubevirt edit kubevirtspec:  certificateRotateStrategy: {}  configuration:    developerConfiguration: #{}      useEmulation: true[root@k8s-master-node1 ~]# vim vm.yamlapiVersion: kubevirt.io/v1kind: VirtualMachinemetadata:  name: examspec:  running: true  template:    spec:      domain:        devices:          disks:            - name: vm              disk: {}        resources:          requests:            memory: 1Gi      volumes:        - name: vm          containerDisk:            image: fedora-virt:v1.0            imagePullPolicy: IfNotPresent[root@k8s-master-node1 ~]# kubectl apply -f vm.yamlvirtualmachine.kubevirt.io/exam created[root@k8s-master-node1 ~]# kubectl get virtualmachineNAME        AGE   STATUS    READYexam   31s   Running   True[root@k8s-master-node1 ~]# kubectl delete -f vm.yamlvirtualmachine.kubevirt.io "exam" deleted2.2.12 完成容器云平台的调优或排错工作。(本任务只公布考试范围,不公 布赛题)  
  • [热门活动] 心得
    本人是一名作为大学生,小白,参与次参加了华为活动,并拿下这些认证,于我而言是宝贵的学习历程。在接触人工智能入门认证时,起初看着文档操作,从陌生到逐渐熟悉。跟着文档步骤搭建环境、配置参数,过程中虽因对概念理解不深偶有卡顿,但每解决一个小问题,都让我对ai的底层逻辑有了新认识。我觉得这些认证看似按部就班,但是实则是在不断积累对人工智能算法和开发流程的感知。这段跟着文档学习拿证的经历,让我明白理论与实践结合的重要性。它不仅为我构建了基础技术框架,更培养了我自主学习和解决问题的能力。未来,我会凭借这份经验,更深入探索相关技术领域。  
  • [问题求助] 按照云搜索服务 CSS-基于Dify集成CSS与DeepSeek构建智能问答助手:步骤二:部署Dify 进行部署出错
    按照这篇文章的步骤进行操作,到最后一步输入网址打不开,可能是因为虚拟私有云要和OpenSearch的VPC的配置不对,请求帮助
  • [热门活动] 【案例共创】使用鲲鹏ECS和Huawei Cloud Euler OS快速搭建WordPress
    一、案例介绍本案例介绍关于如何使用鲲鹏ECS和Huawei Cloud Euler OS快速搭建WordPress。鲲鹏ECS是基于华为鲲鹏处理器构建的弹性计算服务,是华为自主研发的基于ARM架构的服务器处理器,旨在提供高性能、低功耗的计算解决方案。鲲鹏ECS实例适用于多种应用场景,如应用部署、网站托管等。Huawei Cloud EulerOS是华为云基于开源的欧拉操作系统(openEuler)定制优化的一款服务器操作系统,专为云计算环境设计。它不仅继承了openEuler稳定、高效的特点,还针对华为云的基础设施进行了特别优化,旨在提供更加安全、可靠的计算服务。主要特点安全性高:Huawei Cloud EulerOS 提供了多层次的安全防护措施,包括但不限于内核级别的安全加固、支持国密算法等,以保护用户数据的安全。性能优越:通过针对华为云平台的优化,Huawei Cloud EulerOS 能够提供卓越的计算性能和稳定性,满足各种业务场景的需求。兼容性强:支持多种架构(如x86_64, ARM64),能够适应不同的硬件环境,为用户提供灵活的选择。易于管理:提供了便捷的系统管理和运维工具,简化了部署、监控及故障排除的过程,降低了维护成本。社区支持:作为openEuler的一个分支,Huawei Cloud EulerOS同样受益于活跃的开源社区支持,可以快速获取最新的技术更新和支持。WordPress是一个以PHP和MySQL为平台的免费开源博客软件和内容管理系统(CMS)。可以轻松创建、编辑、管理和发布内容到网站上。WordPress是最受欢迎的内容管理系统之一,广泛用于个人博客、企业网站、电子商务平台等。二、安装流程2.1 鲲鹏服务器购买在控制台搜索“ECS” 进入去云服务器管理页面,点击右上角:购买弹性去服务器,进入购买页面。选择自定义购买 - 按需计费 。cpu架构选择:鲲鹏计算.实例筛选:2c 4G - 鲲鹏KC2 (可根据业务实际需求进行性能筛选)。操作系统:Huawei Cloud EulerOS - Huawei Cloud EulerOS 2.0 标准版 64位 ARM版(10GiB)云服务器管理:输入规范的密码。其他选项默认即可,勾选《服务声明》,点击立即购买,即可成功购买成功鲲鹏KC1。购买成功后,在弹性云管理平台即可查看所有的云资源,点击右侧 远程登录 开始进行云服务器连接。点击远程登录后,弹出登录云服务器提示,我们直接使用CloudShell登录。点击立即登录,在新的CloudShell连接页面,已经带出了所有服务器的信息,我们只需要输入购买云服务器时输入的密码即可。看到 "Welcome to Huawei Cloud Service" 即登录成功了。2.2 LNMP环境安装在安装WordPress前,我们需要安装其所依赖的环境,也就是LNMP环境,LNMP也就是:Linux 、Nginx 、Mysql 、Php 这四个服务。2.2.1 安装Nginx1、执行以下命令,看到输出 Complete 即安装完成。sudo yum -y install nginx2、验证nginx输入下列命令,如果成功打印出了nginx version: *** ,则成功nginx -v3、启动nginx并设置期开机启动输入下列的命令启动nginx并设置nginx在以后重启也自动启动。systemctl start nginx systemctl enable nginx4、查看nginx是否成功启动在连接处有一个ip,这个是服务器外网ip (在云资源列表处也可查看),在浏览器直接输入这个ip,能看到下方nginx的欢迎页,则成功启动了。2.2.2 安装MySQLmysql是数据库服务,1、按顺序执行下列的命令,进行mysql安装mkdir mysql-server cd mysql-server wget https://repo.huaweicloud.com/hce/2.0/os/x86_64/Packages/mysql-8.0.28-1.hce2.x86_64.rpm yum install mysql-server2、启动mysql并设置开机启动systemctl start mysqld systemctl enable mysqld3、对数据库进行加固输入下面的命令开始加固数据库,这里需要注意的是:1、需要输入y/n 的,直接输入y就ok2、Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG  这里输入 2 就好3、需要输入密码的地方,如果密码很简单的话,会提示错误,需要输入更复杂的密码。mysql_secure_installation2.2.3 安装 php1、安装php这里之所以 cd ~ 是为了防止上一步安装mysql没有推出安装目录按顺序执行以下的命令行。注意,这里的版本是与Huawei Cloud EulerOS 2.0镜像匹配的。cd ~ wget https://repo.huaweicloud.com/hce/2.0/os/aarch64/Packages/php-8.0.0-10.hce2.aarch64.rpm yum install php-8.0.0-10.hce2.aarch64.rpm2、验证php安装版本php -v3、启动php并设置开机启动systemctl start php-fpm systemctl enable php-fpm4、修改nginx以支持php服务 因为php是依赖于nginx来运行的,所以我们在nginx 的配置文件中来支持php打开配置文件 vim /etc/nginx/defauld.d/default.conf修改内容  server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm index.php; } location ~ \.php$ { root /usr/share/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }5、重载nginx配置文件 nginx配置文件变更后,需要重载一下,否则变更不会生效。service nginx reload6、测试php运行在nginx的文件目录下创建一个demo.phpvim /usr/share/nginx/html/demo.php输入内容<?php phpinfo(); ?>通过浏览器访问 :http://ip/demo.php 就可以查看到php相关信息 至此我们的lamp环境就安装成功了。2.4 安装wordpress1、创建wordpress数据库输入下方命令行,会提示输入密码,输入创建数据库时的密码。mysql -u root -p成功登录mysql后,创建数据库CREATE DATABASE wordpress;2、开始安装执行下列命令cd /usr/share/nginx/html wget https://cn.wordpress.org/wordpress-6.6.1-zh_CN.tar.gz tar zxvf wordpress-6.6.1-zh_CN.tar.gz cd ./wordpress cp wp-config-sample.php wp-config.php编辑配置文件vim wp-config.php主要修改数据库的名称、账号、密码配置完成后,通过http://ip/wordpress 就可以正常的访问wordpress安装向导了。进入安装向导后,按向导正常输入相关的站点信息,wordpress就完全安装成功啦~~ 我正在参加【案例共创】第2期 构建开发场景最佳实践/体验评测,创作案例文章cid:link_0 
  • [热门活动] 【案例共创】基于华为云 ECS 鲲鹏实例、Huawei Cloud Euler OS 和 Uptime-Kuma 快速构建服务监控系统实践
    一、案例介绍本方案通过华为云 ECS 鲲鹏 KC1 实例和 Huawei Cloud Euler OS 快速搭建了高性价比的监控系统,结合开源工具 Uptime-Kuma 的灵活监控能力,特别适合中小型团队的基础设施监控需求,可在 15 分钟内完成部署。华为云 ECS 鲲鹏实例:基于华为自研鲲鹏处理器(ARM架构)的高性能云服务器,具备卓越计算性能、低功耗及高扩展性,适用于人工智能、大数据分析、科学计算等场景,并提供安全隔离、弹性资源调配及多存储选项,满足企业高效能计算需求;Huawei Cloud Euler OS:华为云基于 openEuler 构建的云原生操作系统,具备高性能、高安全、易迁移等特性,支持x86和Arm架构,可替代CentOS等传统镜像,助力企业业务高效上云;Uptime-Kuma:轻量级开源自托管监控工具,支持 HTTP(S)、TCP、Ping 等多种协议监控,提供实时报警、可视化仪表盘及状态页面,适用于个人开发、企业内网等场景,具备易部署、数据隐私可控等特点。 二、购买华为云 ECS 鲲鹏 KC1 实例在华为云官网点击“产品”“计算”-“弹性云服务器ECS”,在弹性云服务器ECS详情页点击“购买”按钮进入购买页面:在自定义购买中选择/设置配置信息:基础配置-计费模式:按需计费实例-规格类型选型:鲲鹏计算规格名称:kc1.large.2操作系统-公共镜像:Huawei Cloud Euler OS-Huawei Cloud EulerOS 2.0 标准版 64位 ARM版(10GiB)公网访问-公网带宽:按流量计费云服务管理:设置密码其它配置项使用默认即可全部配置信息如下,勾选右侧的“我已阅读并同意”,点击右下角的“立即购买”完成购买等待服务器完成创建,然后点击“返回云服务器列表”进入服务器列表页面 三、放通 3001 端口uptime-kuma 默认需要用到 3001 端口,需在安全组中放通,在服务器列表页面,点击前面创建的服务器名称/ID,进入服务器管理页面,点击“安全组”选项卡,点击“配置规则”点击“入方向规则”-“添加规则”,优先级输入 1、协议端口输入 3001、源地址输入 0.0.0.0/0 点击右下角的“确定”按钮放通 3001 端口。四、安装Docker首先需要登录服务器,可以在服务器列表中点击“远程登录”在弹窗中点击“立即登录”按钮输入购买服务器时设置的密码,点击“连接”按钮登录Huawei Cloud Euler OS 中安装 Docker 非常方便,一行命令即可完成:dnf install docker安装过程种需要输入两次 y 并按回车键确认:安装完成之后使用 systemctl start docker 命令即可启动服务:systemctl start docker至此我们还需要设置加速镜像,个人使用可以参考设置镜像加速器,设置之后需要执行 systemctl restart docker 重启容器引擎systemctl restart docker 五、安装uptime-kumauptime-kuma 的安装也非常简单,一行命令即可搞定:docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1安装完成之后通过浏览器打开服务器公网IP:3001端口即可访问,首次访问需要设置管理员用户名和密码:接下来我们就可以点击“点击添加”来添加监控服务,设置域名之后保存,即可 24 小时不间断对Web服务、API接口、数据库等组件的状态检测,你还可以根据需要设置通知,uptime-kuma 支持数十种通知方式,一旦你的服务发生故障,uptime-kuma 可以实时通知你来处理:除此之外,uptime-kuma 还可以创建状态页面对外公开展示:本方案通过华为云 ECS 鲲鹏 KC1 实例和 Huawei Cloud Euler OS 快速搭建了高性价比的监控系统,结合 Uptime-Kuma 的灵活监控能力,特别适合中小型团队的基础设施监控需求。 我正在参加【案例共创】第2期 构建开发场景最佳实践/体验评测,创作案例文章cid:link_0
  • [热门活动] 【案例共创】基于鲲鹏KC2构建宝塔快速搭建fastadmin后台管理平台
    案例介绍本案例基于鲲鹏KC2云服务器构建宝塔服务,以快速搭建fastadmin后台管理平台。鲲鹏KC2云服务器鲲鹏云服务器是基于鲲鹏920处理器(ARMv8架构)打造的计算优化型实例,主打高性能与多核并发能力。单CPU支持最高64核,主频2.6GHz,搭配DDR4内存及高速存储(本地NVMe SSD/云硬盘),满足高吞吐、低延迟需求,网络带宽可达25Gbps以上,适配分布式计算场景。是基于QingTian架构的自研极简虚拟化云服务 购买鲲鹏KC2云服务器在控制台搜索ECS,点击弹性云服务器ESC开始购买进行到购买页面后,我们首先选择按需计费,也可以选择包年/包月进行购买,选择区域大家可以自行选择。选择系统为ubuntu, 带宽为按带宽计费搜索2C4G的服务器,就可以应对基础的服务了,如果用户量增大则扩容。如果需要更大的服务器可以自行搜索更大的规格,选择KC2的通用服务即可。这样基础云服务器资源就选择好了,点击立即购买,完成购买。 CloudShell连接鲲鹏云服务器成功购买了鲲鹏云服务器后,如果到弹性云服务器中没有找到购买的服务器,那在页面上稍微等一下,准备服务器资源需要一些些时间。在页面上到购买的服务器后,状态为运行中,则说明服务器已经完全准备好了,点击右侧远程登录,开始进行远程连接。在CloudShell中,已经准备好了当前云服务器相关的所有数据,只需要输入密码,就可以连接上。正确输入密码后,进入欢迎页。至此,服务器已经正常连接上了。安装宝塔在ubuntu中安装宝塔非常简单,只需要输入下面的命令即可自动安装成功wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh && sudo bash install_panel.sh ed8484bec输入命令后,直到出现下图的面板账号信息,则说明安装成功了。记录这里的外网地址、账号、密码,后面就可以直接访问登录了。注意提示:请在安全组放行42651端口。在云服务器列表上点击对应有服务,进入详情,切换到安全组,点击配置规则。点击添加规则后,输入对应的优先级、端口和源地址,点击确认。接下来就是输入安装成功时提示的外网地址,就可以看到下面的页面。输入安装成功时提供的账号密码。 安装lnmp环境首次安装时,会需要关联宝塔账号,直接注册一下登录上就行,页面会做初始化推荐,我们直接按推荐安装好LNMP环境即可。点击一键安装后,就会显示相关的安装任务列表,这里会需要一些时间,让子弹飞一会。安装完成后。安装fastadmin第一步:新建站点在宝塔面板中,创建一个新的站点,并填写项目域名。   在域名这里可以填写你的真实域名。根目录修改为fastadmin . 这个名称是自定义的,可以随机。只需要与下方上传的文件目录保持一致。第二步:上传框架通过宝塔的文件管理功能,进入站点的文件目录。上传 最新版 FastAdmin 开源框架完整包 并解压到站点的当前目录,比如:/www/wwwroot/fastadmin。     点击新建创建一个fastadmin的目录,点击上传,将上面下载的完整包传到fastadmin目录下。接下来对上传的文件进行解压缩,通过CloudShell软件进入/www/wwwroot/fastadmin目录下,使用unzip命令对上传的包进行解压缩。解压缩成功后我们在文件这里就可以看到所有的文件了。 第三步:配置并安装进入站点配置,设置站点的运行目录为 /public(注意:这是 FastAdmin 后台框架的运行目录,必须设置为 /public,否则无法正常运行),并设置站点的伪静态为 thinkphp 规则。    点击网站- 列表中的设置 - 网站目录,进行到运行目录的配置。这里选择php版本。访问你的站点域名进行安装,比如:https://www.demo.com/install.php安装完成后即可进入后台,比如:http://域名/LFsSCXfwPn.php (奇怪的文件名.php 是后台安全入口)第一次进入会报错,我们手动删除一下禁用函数:再次访问可以看到下面页面,输入账号密码进入后台至此 FastAdmin 后台框架已经安装完成。注意事项:如果你重复执行install.php,数据库中的 FastAdmin 框架基础表和用户表将被重置,请提前做好全站备份。 我正在参加【案例共创】第2期 构建开发场景最佳实践/体验评测,创作案例文章cid:link_0
  • [热门活动] 【案例共创】ESC基于RAGFlow和DeepSeek构建本地问答知识库
    【案例共创】ESC基于RAGFlow和DeepSeek构建本地问答知识库一、案例介绍在人工智能技术飞速发展的当下,企业知识库智能化正成为提升运营效率的核心路径。DeepSeek 几乎家喻户晓,而 RAGFlow 是一个基于深入文档理解的开源RAG(检索增强生成)引擎。当与LLMs集成时,它能够提供真实的问题回答功能,并由来自各种复杂格式数据的有理有据的引用支持。本次我们基于ESC使用 Docker 部署RAGFlow,并使用 ollama 部署 DeepSeek R1 模型和 bge-m3 嵌入模型,体验 RAGFlow 的知识库、对话、Agent等功能,通过RAGFlow的智能文档解析与DeepSeek大语言模型的精准推理能力,构建具备多源异构数据处理、语义深度理解及动态知识更新特征的问答知识库、Agent。二、案例用时本案例总时长预计120分钟。三、案例流程 说明:通过ECS中安装dokcer部署ragflow通过ECS中docker部署ollama来运行deepseek通过配置ragflow来调用deepseek-r1模型能力用过通过公网ip访问ECS从而体验ragflow+deepseek四、资源总览云资源消耗/时时长ECS(含公网IP、磁盘等)0.9885120min合计:1.977元五、实践步骤0. 购买ECS配置如下:bash计费模式: 按需计费区域: 西南-贵阳一可用区: 随机分配CPU架构:x86计算实例规格:通用计算增强型 | x1e.4u.16g | 4vCPUs | 16GiB镜像: 公共镜像-Ubuntu 24.04 server 64bit(10GiB)磁盘: 通用型SSD 50G弹性公网IP:现在购买-全动态BGP-按带宽计算-5Mbit/s-随实例释放云服务器名称:ecs-ragflow密码:RagFlow@123使用时长:设定删除时间为 8 小时之后购买数量: 1清单链接:https://www.huaweicloud.com/pricing/calculator.html?shareListId=267c3c60fc6411efa933bd915e6892f51、安装 RAGFlow1.1 安装 Docker CE 和 Docker Compose打开终端,新建 install-docker.sh:bash# 查看系统uname -alsb_release -a# 准备安装 dockercd ~pwdmkdir RAGFlowcd RAGFlowvi install-docker.sh写入以下脚本到 install-docker.shbash#!/bin/bash# 定义日志文件路径LOGFILE="/var/docker-install.log"# 将标准输出和错误输出重定向到日志文件,同时显示到终端exec > >(tee -a "$LOGFILE") 2>&1# 设置DEBUG模式下的时间戳输出格式trap '{ set +x; } 2>/dev/null; echo -n "[$(date -Is)] "; set -x' DEBUG# 下载并安装 docker CE 和 docker composeecho "开始安装 Docker CE 和 Docker Compose..."# 添加Docker官方GPG密钥curl -fsSL https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -echo "已添加 Docker GPG 密钥"# 添加Docker软件源echo "" | sudo add-apt-repository "deb [arch=amd64] https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"echo "已添加 Docker 软件源"# 更新软件包列表echo "正在更新软件包列表..."echo "y" | sudo apt-get update# 安装Docker CE和Docker Composeecho "正在安装 Docker CE 和 Docker Compose..."echo "y" | sudo apt-get install docker-ce docker-composeecho "Docker 安装完成"# 配置docker镜像仓库为华为云镜像echo "正在配置华为云镜像源..."sudo echo '{"registry-mirrors": ["https://b4a1f63a156e435f9aeb797bdf515250.mirror.swr.myhuaweicloud.com"]}' >/etc/docker/daemon.json# 重启docker服务使配置生效echo "正在重启 Docker 服务..."sudo systemctl restart dockerecho "Docker 配置完成"接着运行 docker 安装脚本:bashsudo bash ./install-docker.sh我们查看版本发现 docker-compse 版本有点低,可能会影响后续的安装,因此尝试升级 docker-composebashdocker -vdocker-compse -v升级 docker-compose:bash# 先看看 docker-compose 的路径whereis docker-compose# 备份一下sudo mv /usr/bin/docker-compose /usr/bin/docker-compose.bak# 下载对应系统的 docker-composewget https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64 -O docker-compose# 如果速度慢可以尝试使用加速源,如 https://hub.gitmirror.com/、https://github.moeyy.xyz/、https://ghfast.top/# wget https://hub.gitmirror.com/https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64 -O docker-compose# 也可以自行去 github 下载: https://github.com/docker/compose/releases# 替换 docker-composesudo cp ./docker-compose /usr/bin/docker-compose# 加权限sudo chmod +x /usr/bin/docker-compose# 验证docker-compose -v1.2 安装 RAGFlow先设置一下最大虚拟内存。vm.max_map_count该值设置进程可能拥有的内存映射区域的最大数量。它的默认值是65530。虽然大多数应用程序需要的映射少于一千个,但减小此值可能会导致异常行为,并且当进程达到限制时,系统将抛出内存不足错误。RAGFlow v0.17.0使用Elasticsearch或Infinity进行多次调用。正确设置vm.max_map_count的值对于Elasticsearch组件的正常运行至关重要。bash# 检查vm.max_map_count的值sysctl vm.max_map_count# 如果小于 262144 则至少设置为 262144sudo sysctl -w vm.max_map_count=262144接着安装 RAGFlowbash# 下载源码git clone https://github.com/infiniflow/ragflow.git# 如果下载比较慢请尝试使用镜像加速,如:# git clone https://ghfast.top/https://github.com/infiniflow/ragflow.gitcd ragflow/docker# 切换最新稳定分支 (截止 20205-03-08 为 0.17.0)git checkout -f v0.17.0git branch我们可以修改 .env 启用全量版本(非必须,可无须修改直接使用 slim 版本),并设置 docker 镜像源:bashsudo echo '{"registry-mirrors": ["https://b4a1f63a156e435f9aeb797bdf515250.mirror.swr.myhuaweicloud.com"]}' >/etc/docker/daemon.jsonRAGFlow镜像标签镜像大小(GB)是否包含嵌入模型和Python包是否稳定v0.17.0≈9✔️稳定版本v0.17.0-slim≈2❌稳定版本nightly≈9✔️nightly 构建不稳定nightly-slim≈2❌nightly 构建不稳定接着通过 docker-compose 启动 RAGFlow,全量的镜像约 9G,安装稍微慢些,需要耐心等待大约10分钟bash# 拉取镜像并启动(默认不包含 embedding 模型, 可以修改 .env 配置,选为华为云镜像v0.17.0 )# vi .env 找到对应位置进行修改docker-compose -f docker-compose.yml up -d# 如果minio拉取不顺,请尝试切换镜像源,需修改 docker-compose-base.yml 的:quay.io 为 quay.m.daocloud.io# 查看日志docker-compose logs -f ragflow-server# 查看端口情况netstat -nptl2. 访问本地 RAGFlow并配置模型RAGFlow是一个RAG引擎,需要与大模型服务一起搭配使用,实现本地、无幻觉的问答功能。RAGFlow支持大多数主流LLMs。2.1 访问本地RAGFlow 并注册账号登录如本次案例中 ecs-ragflow 的 ip 为1.95.184.111 则访问: http://1.95.184.111/login ,注册账号即可使用 RAGFlow。登录之后的主界面如下:⚠️本地模型为选配,同样可以使用其他大模型API服务,比如 Mass、硅基流动等2.2 通过 Docker 安装 ollama首先我们设置docker镜像源,重启docker之后,通过docker拉取ollama镜像并运行bash# 设置 docker 镜像源sudo echo '{"registry-mirrors": ["https://b4a1f63a156e435f9aeb797bdf515250.mirror.swr.myhuaweicloud.com"]}' >/etc/docker/daemon.jsonsudo systemctl restart dockersudo docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama2.3 安装 DeepSeek-R1 模型和 bge-m3 鉴于网络下载速度比较慢,我们拉取相对较小的 deepseek-r1:1.5b 和嵌入模型 bge-m3 (预计25分钟,具体看网络状况)bash# 拉取 deepseek-r1:1.5bsudo docker exec ollama ollama pull deepseek-r1:1.5b# 拉取 bge-m3sudo docker exec ollama ollama pull bge-m32.4 配置模型虽然RAGFlow和Ollama都是跑在同一台机器上,但由于分别使用了docker-compose和docker来部署,可能会导致网络不通的情况,那我们可以通过暴露 11434 ollama的端口来提高大模型服务。于是,我们在模型提供商选择Ollam之后分别配置了嵌入模型 bge-m3 和聊天模型deepseek-r1:1.5b。接着并在设置--系统模型设置中配置好聊天模型和嵌入模型。3. 简单使用接下来,我们简单体验一下RAGFlow 提供的功能,分别是知识库、聊天、搜索、Agent。3.1 知识库功能体验点击知识库,我们创建了一个名为ModelArts助手的知识库,传入了几个pdf文件作为本地知识库。在RAGFlow中知识库被称为数据集,我们可以上次多个文件作为数据集,并通过不通的解析方法将文档进行处理如切片、Q/A等。解析成功的文档可以在后续功能中作为知识库引入。3.2 聊天功能体验我们创建了ModelArts助手的助理,可以对助理进行配置如基本信息、关键词分析、模型参数设置等,并选取知识库作为回答语料。我们一个“如何快速入门”的简单问题开始,AI助理根据挂载的知识给了相关的回答。3.3 搜索功能体验在RAGFlow中,还有搜索功能,类似于传统的搜索引擎给出结果并添加了智能回答和思维导图。3.4 Agent功能体验最后我们来体验Agent功能,这里我们使用的是预置的 text2sql。Agent 会提供一个工作流编排界面,并提供运行测试功能,我们发现Agent也是可以作为单独的页面嵌入到其他网站,简单地要Agent给出“用户转化率”,它基于 deepseek-r1 模型,因此也有思考能力,最终它生成了一段完整的 SQL 语句。至此,案例实践就结束了,记得释放资源哦!记得释放资源哦!记得释放资源哦!我正在参加【案例共创】第2期 构建开发场景最佳实践/体验评测,创作案例文章cid:link_0
  • [案例共创] 【案例共创】华为云ModelArts赋能加密金融:DeepSeek构建具备策略自适应进化能力的AI分析机器人
    华为云ModelArts赋能加密金融:DeepSeek构建具备策略自适应进化能力的AI分析机器人一、项目概述1.1 项目背景加密金融市场以其高波动性和24/7不间断交易特性著称,这给投资者带来了前所未有的挑战。在这个信息爆炸的时代,人工分析已经难以跟上市场节奏,而传统的自动化交易系统又缺乏足够的智能性和适应性。华为云ModelArts是华为云提供的一站式AI开发平台,提供了DeepSeek大模型,结合ECS高性能计算资源,为构建具备策略自适应进化能力的AI分析机器人提供了强大支持,可以实现从信号监控、智能分析到自动交易的全流程智能化。1.2 案例流程 图1:案例实施流程1.3 资源概览本案例(演示)预计花费总计0元/月(按需付费可能有所不同),本地开发、调试都是免费的,还可以免费领取Token。资源名称规格单价(元/月)数量ModelArtsDeepseekR1按需计费1ECS4核、4G、5M按需计费11.4 适用对象AI分析机器人的设计旨在满足不同类型用户的需求,主要适用于以下群体:用户类型特点描述适用场景核心价值个人开发者具备编程基础,希望开发AI交易系统的开发者系统二次开发、功能定制、API集成提供完整的开发文档和API接口,支持自定义策略和功能扩展高校学生对AI和加密金融感兴趣的学生群体学习研究、毕业设计、创新创业提供详细的技术文档和示例代码,便于学习和实践加密金融爱好者对加密市场感兴趣,希望了解AI分析技术的爱好者市场研究、技术探索、投资参考提供直观的分析报告和可视化界面,降低使用门槛市场研究机构需要大量数据支持研究的分析机构市场趋势研究、Token生命周期分析、风险评估提供大量结构化数据和分析结果,支持深度研究和报告生成二、技术挑战与解决方案2.1 加密金融市场挑战据最新统计,加密金融市场每日交易量超过1000亿美元,价格波动率是传统金融市场的5-10倍。在这样的环境下,投资者面临着几个关键痛点:信息过载:每天产生的市场信号、社交媒体讨论和新闻报道数以万计,人工无法全面处理决策延迟:从发现机会到执行交易的时间窗口极短,人工决策往往错失良机情绪干扰:人类交易者容易受到恐惧和贪婪情绪影响,导致非理性决策策略固化:传统交易系统策略一旦设定很少调整,无法适应市场变化图2:加密金融市场的主要痛点与挑战2.2 AI分析机器人实现构建一个真正智能的交易分析系统面临着多重技术挑战:多源异构数据处理:需要同时处理结构化交易数据和非结构化社交媒体信息实时性要求:系统需要在毫秒级别完成信号接收、分析和决策策略进化机制:如何让系统能够从历史交易中学习并自我优化风险控制:在追求收益的同时,如何有效控制风险面对这些挑战,我们需要一个集成了先进AI技术、具备自适应进化能力的智能交易系统。系统的核心功能包括:多模态信息分析:同时处理结构化交易数据和非结构化文本信息风险评估:对每个交易机会进行1-10分的风险评分收益预测:基于历史数据预测可能的收益范围交易决策生成:综合各项指标,生成明确的交易建议以下流程图展示了AI分析机器人的核心工作流程,从信号监听到交易执行的完整闭环: 图3:AI分析机器人系统逻辑流程图系统逻辑流程主要包括以下几个环节:信号监听与解析:持续监听TG频道,捕获并解析交易信号AI智能分析:利用ModelArts对信号进行多维度分析风险评估:对潜在交易机会进行风险评分和收益预测交易决策生成:综合分析结果,生成明确的交易建议交易执行:根据决策自动执行交易操作结果记录:记录交易过程和结果策略进化:基于历史数据,优化决策模型系统设计理念:"让AI的客观分析弥补人类决策的情绪偏差,让人类的经验智慧指导AI的进化方向"三、策略自适应进化机制3.1 交易策略进化系统最大的创新点在于其策略自适应进化机制。传统交易系统往往采用固定的决策规则,而我们的系统能够从历史交易中不断学习,自动调整决策阈值和策略参数。策略进化机制的工作流程如下:历史数据收集:系统记录每次交易的详细信息,包括决策依据和实际结果特征提取:从历史交易中提取关键特征,如社区情绪、风险评级、资金流动等模式识别:识别成功交易和失败交易的共同特征策略优化:基于分析结果,自动调整决策阈值和权重效果验证:在新交易中应用优化后的策略,并持续监控效果 // 策略自适应进化核心代码 async evolveStrategy() { try { logger.info('------开始执行策略自适应进化分析...'); // 加载历史交易数据 const tradeLogFile = path.join(__dirname, '../logs/trades.json'); let tradeHistory = []; if (fs.existsSync(tradeLogFile)) { const fileContent = fs.readFileSync(tradeLogFile, 'utf8'); tradeHistory = JSON.parse(fileContent); } // 提取关键特征 const features = tradeHistory.map(trade => { // 从分析结果中提取关键信息 const analysis = trade.analysisResult.toLowerCase(); return { tokenSymbol: trade.tokenSymbol, timestamp: trade.timestamp, // 社区情绪和市场动态 communityMood: analysis.includes('社区情绪积极') || analysis.includes('社区反应良好') ? '积极' : analysis.includes('社区情绪消极') || analysis.includes('社区反应不佳') ? '消极' : '中性', // 买入决策相关 decision: analysis.includes('建议购买') ? '购买' : '放弃', // 风险评估 riskLevel: (analysis.match(/风险评估:(\d+)/) || [])[1] || '未知', // 资金流动相关 hasNegativeNetInflow: analysis.includes('净流入为负') || analysis.includes('资金流出'), hasHighVolatility: analysis.includes('高波动性') || analysis.includes('波动性高') || analysis.includes('极高的波动性'), hasDeveloperSellAll: analysis.includes('sell all') || analysis.includes('开发者卖出'), hasLowLiquidity: analysis.includes('流动性低') || analysis.includes('流动性较低'), hasKOLBuying: analysis.includes('kol') && analysis.includes('买入'), // 交易计划相关 hasProfitTarget: analysis.includes('止盈点') || analysis.includes('止盈价格'), hasStopLoss: analysis.includes('止损点') || analysis.includes('止损价格'), hasBatchSelling: analysis.includes('分批卖出') || analysis.includes('分批出售'), // 交易结果(如果有) tradingResult: trade.tradingResult || '未知', // 原始数据 buyAmount: trade.buyAmount, tokenAddress: trade.tokenAddress }; }); // 构建分析提示词 const historicalPrompt = ` 请分析以下历史交易数据,找出决策模式和改进方向: ${JSON.stringify(features)} 请提供以下分析: 1. 失败交易的3个主要原因 2. 成功交易的3个关键特征 3. 改进交易策略的3个建议 4. 是否存在可能错过的潜在机会(例如,拒绝了但市场表现良好的代币) 5. 如何调整决策阈值以提高成功率 `; // 调用华为云ModelArts进行分析 const systemContent = '你是一个专业的加密金融数据分析师,擅长从历史数据中总结经验并提供具体的改进建议。'; const analysisResult = await aiService.callDeepseekAPI(historicalPrompt, systemContent); // 保存分析结果并应用到未来决策中 // ... return { success: true, result: analysisResult }; } catch (error) { logger.error('分析历史交易数据时出错:', error); return { success: false, message: `分析出错: ${error.message}` }; } } 通过这种自适应进化机制,系统能够不断从自身的交易历史中学习,逐步提高决策准确性。这种"自我进化"能力是传统交易系统所不具备的,也是本项目的核心创新点。 3.2 交易执行系统在生成交易决策后,会自动执行交易通知并实施多级风险控制。整个过程无需人工干预,大大提高了交易效率。 // 执行购买订单核心代码 async executeBuyOrder(message, tokenInfo, analysisResult) { try { logger.info('准备执行购买订单...'); // 默认购买金额(SOL) let buyAmount = process.env.DEFAULT_BUY_AMOUNT || '0.01'; // 构建购买命令 const buyCommand = `/buy ${tokenInfo.address} ${buyAmount}`; logger.info(`准备执行购买命令: ${buyCommand}`); // 发送购买命令到邮件里...交易通知 logger.info(`已发送购买命令到 ${tradingBot}`); // 记录交易信息 const tradeInfo = { timestamp: new Date().toISOString(), tokenAddress: tokenInfo.address, tokenName: tokenInfo.name, tokenSymbol: tokenInfo.symbol, buyAmount: buyAmount, oldMessage: message, analysisResult: analysisResult }; // 保存交易记录到文件 this.saveTradeRecord(tradeInfo); return true; } catch (error) { logger.error(`执行购买订单时出错: ${error.message}`); return false; } } 系统的风险控制机制包括:交易金额限制:系统默认设置较小的交易金额,降低单笔交易风险止损机制:每笔交易都设置明确的止损点,限制最大损失分批卖出策略:采用分批卖出策略,锁定部分利润交易记录审计:所有交易都有详细记录,便于后续分析和优化 四、华为云平台应用4.1 ModelArts平台介绍华为云ModelArts是本系统的核心AI能力提供者。ModelArts提供了从数据处理、模型训练到推理服务的全流程AI开发平台,极大地简化了AI应用的开发和部署过程。 图5:华为云ModelArts在AI分析机器人中的应用决策引擎的核心功能包括:多模态信息分析:同时处理结构化交易数据和非结构化文本信息风险评估:对每个交易机会进行1-10分的风险评分收益预测:基于历史数据预测可能的收益范围交易决策生成:综合各项指标,生成明确的交易建议 // AI服务类核心代码 async analyzeTrading(message, options = {}) { const modelName = options.model || this.defaultModel; const buyAmount = options.buyAmount || process.env.DEFAULT_BUY_AMOUNT || '0.01'; try { logger.info(`正在使用 ${modelName} 分析交易信息...`); // 构建提示词 const prompt = ` 你是一个顶级加密金融交易专家,帮我深度分析: 1、我可以接受中级风险投资。 2、报告里增加情绪分析、趋势预测和风险评估(1-10分,10分最高风险)。 3、搜索 X 或网络上的最新动态和社区情绪,给我更全面的信息。 4、综合交易信息与最新动态和社区情绪信息,判断是否买入,给出具体买入理由。 5、如果建议买入,假设我投入 ${buyAmount} SOL,必须明确给出完整的交易计划,包括买入价格、止损价格、止盈价格和分批卖出计划,交易机器人会按照你给的交易方案执行。 ... `; // 调用华为云ModelArts API let aiResponse; if (modelName === 'deepseek') { aiResponse = await this.callDeepseekAPI(prompt); } else if (modelName === 'openai') { aiResponse = await this.callOpenAIAPI(prompt); } else { throw new Error(`不支持的模型: ${modelName}`); } // 分析响应内容,判断是否建议购买 const shouldBuy = aiResponse.toLowerCase().includes('报告结果:建议购买'); // 提取理由 let reason = aiResponse; if (reason.length > 200) { reason = reason.substring(0, 200) + '...'; } return { shouldBuy, reason, fullAnalysis: aiResponse }; } catch (error) { logger.error(`${modelName} 分析失败: ${error.message}`); throw error; } } 4.2 ECS服务介绍系统的稳定运行离不开可靠的基础设施支持。华为云ECS(弹性云服务器)为AI分析机器人提供了高性能、高可用的计算环境。图6:基于华为云ECS的系统部署架构华为云ECS在本项目中的关键价值:高性能计算:提供强大的CPU和内存资源,确保AI模型推理和数据处理的高效执行弹性扩展:根据交易量和分析需求自动调整资源配置,优化成本高可用性:多可用区部署,确保系统7*24小时稳定运行安全防护:提供多层次安全防护,保障交易数据安全五、系统实施效果与价值5.1 性能指标与改进效果相比传统交易分析方法,AI分析机器人在多个关键指标上都取得了显著提升。主要性能指标:指标传统方法AI分析机器人提升幅度信号识别准确率65%92%+27%决策响应时间30-60秒3-5秒-90%风险评估准确性70%89%+19%策略优化周期人工周/月级自动日级提速30倍多源数据处理能力单一数据源多源异构数据能力扩展5.2 业务价值与实际案例AI分析机器人在实际应用中创造了显著的业务价值,以下是一个真实案例分析:案例:Solana生态新代币分析与交易2025年3月,系统监测到一个KOL购买信号。传统分析可能仅关注价格和交易量,但AI分析机器人通过多维度分析,发现该Token具有以下特点:开发者持续增加流动性(而非减少)KOL净流入为正且持续增长社区情绪积极且活跃度高安全指标全部通过(NoMint、Blacklist、Burnt)系统自动执行了购买决策,并设置了分批卖出策略。最终系统成功锁定了较大的收益。通过策略自适应进化机制,系统能够从每次交易中学习,不断优化决策模型。以下是系统自动生成的一份策略优化报告摘要: 策略优化报告(自动生成) 时间:2025-03-6 1. 失败交易的3个主要原因: - 开发者状态为"Sell All"的Token,失败率达85% - 流动性低于50K USD的Token,失败率达78% - KOL净流入为负的Token,失败率达72% 2. 成功交易的3个关键特征: - 社区情绪积极且持有者数量>1000 - 开发者持续增加流动性 - 价格6小时变化率>15%且交易量稳定增长 3. 改进建议: - 提高"开发者状态"在决策权重中的比例 - 对流动性低于50K USD的Token设置更严格的购买条件 - 增加社区活跃度分析维度 系统已自动应用以上优化建议到决策模型中。 六、基础环境及资源准备要成功部署和运行AI分析机器人,需要准备以下基础环境和资源:部署文档① 需要准备好华为云账号,并开通ModelArts服务,拿到ModelArts的API KEY、DEEPSEEK_API_URL,这时就有AI分析服务了;② 需要准备好TG的账号,并进群组 [@gmgnsignals],这时就有信号源了;③ 下载示例代码,将ModelArts的API KEY,还有DEEPSEEK_API_URL 粘贴到.env文件中,启动AI分析服务,这时AI分析机器人就可以正常工作了;④ 首次启动TG需要输入账号、密码、验证码登录,登录后 session 保存在本地,以后免登录。⑤ 本工程核心文件是index.js,工程难度并不复杂,工程代码1000行,适合初学者学习。⑥ 如需测试交易功能,需在TG关注机器人[@US_GMGNBOT],点击 /start 激活。只为学习使用,不建议在真实交易中使用,风险自负。6.1 硬件资源需求资源类型最低配置推荐配置用途说明华为云ECSc6.large (2vCPUs, 4GB内存)c6.2xlarge (4vCPUs, 4GB内存)运行核心服务和数据处理存储空间50GB高IO云硬盘存储交易数据和模型文件网络带宽5Mbps确保与API的稳定连接ModelArtsDeepseekR1DeepseekR1模型调用、训练和推理6.2 软件环境配置# 操作系统环境- 操作系统:Ubuntu 20.04 LTS- Node.js:v16.x 或更高版本- npm:v8.x 或更高版本# 核心依赖包- axios: ^1.8.1 (HTTP请求)- dayjs: ^1.11.13 (日期处理)- dotenv: ^16.3.1 (环境变量)- openai: ^4.86.1 (AI接口)- telegraf: ^4.15.3 (Bot框架)- winston: ^3.11.0 (日志记录)- ws: ^8.14.2 (WebSocket)# 华为云服务配置- ModelArts服务:开通并配置访问权限- OBS对象存储:用于存储模型和数据- IAM身份认证:配置适当的访问权限 6.3 核心配置系统运行需要核心配置:华为云账户:用于访问ModelArts和其他云服务TG账户:用于监听消息、发起交易监听信号群组:[@gmgnsignals],由gmgn.ai提供机器人(可选):[@US_GMGNBOT],点击 /start 激活安全提示:所有API密钥应妥善保存在环境变量或安全的密钥管理服务中,避免硬编码在代码中。建议使用华为云KMS(密钥管理服务)进行统一管理。6.4 环境配置详解以下是创建华为云ECS实例的详细操作指南:登录华为云控制台:cid:link_1在导航菜单中选择"计算 > 弹性云服务器 ECS"点击"购买云服务器"按钮按照以下配置进行选择:计费模式:按需计费区域:根据您所在位置选择最近的区域可用区:可用区1规格:通用计算增强型 c6.2xlarge (4vCPUs, 4GB内存)镜像:公共镜像 > Ubuntu 20.04 LTS系统盘:高IO 100GB网络:默认VPC,或创建新的VPC安全组:开放22、80、443端口设置登录凭证(密码或密钥对)确认配置并完成购买图7:华为云ECS实例创建步骤6.5 AI服务配置以下是配置ModelArts访问权限的详细步骤:登录华为云控制台,进入ModelArts服务在左侧导航栏选择"设置 > 全局配置"创建API密钥:点击"创建 API Key"按钮设置API密钥描述点击"确定"创建API密钥复制并安全保存API密钥(只显示一次) 图8:ModelArts API密钥设置七、系统实际运行与测试7.1 启动AI分析服务在本地配置 Node.js 开发环境:Node.js 环境搭建 # 1. 安装 Node.js - 访问 https://nodejs.org/ - 下载并安装 LTS 版本(推荐 v16.x 或更高版本) # 2. 验证安装 node -v npm -v # 3. 克隆项目代码 git clone https://github.com/linapex/AiAnalysisBot.git cd AiAnalysisBot # 4. 安装依赖包 npm install # 5. 配置环境变量 cp .env.example .env # 编辑 .env 文件,填入必要的配置信息: # - DEEPSEEK_API_KEY=你的华为云ModelArts API密钥 # - DEEPSEEK_API_URL=你的Deepseek API地址 # 6. 启动开发服务器 node src/index.js # 7. 后台运行(生产环境) npm install -g pm2 pm2 start src/index.js --name tudog 图9:TG监听服务运行截图 图10:AI分析服务运行截图 7.2 系统效果验证验证系统运行效果:检查logs目录下,AI分析结果和交易决策观察的如开启机器人,决策成功后是否给机器人发送 /buy 指令注意:程序只用于分析决策,不建议用于交易,请自行评估风险 八、未来展望与规划8.1 技术迭代方向深度强化学习应用:引入深度强化学习技术,使系统能够通过与市场环境的交互不断优化交易策略大模型微调优化:基于华为云ModelArts平台,对大模型进行金融领域专业知识微调,提升分析精度多链生态支持:扩展对更多区块链生态的支持,包括Ethereum Layer2、Polkadot等知识图谱整合:构建加密金融领域知识图谱,增强系统的推理能力和决策解释性 结语华为云ModelArts和ECS为构建具备策略自适应进化能力的AI分析机器人提供了强大支持。通过多模态分析、自适应进化和实时决策能力,系统有效解决了加密金融市场中的信息过载、决策延迟和策略固化等痛点问题。随着AI技术的不断发展和华为云服务的持续优化,我们有理由相信,这类智能交易系统将在金融科技领域发挥越来越重要的作用,为投资者创造更大的价值。需要特别提醒的是,加密金融市场具有高风险特性,投资者在使用任何交易系统时都应审慎评估风险,合理配置资金比例,避免过度依赖自动化系统。 正在参加【案例共创】第3期 华为云ModelArts赋能加密金融:构建具备策略自适应进化能力的AI分析机器人 https://bbs.huaweicloud.com/forum/thread-0218176004967264062-1-1.html
  • [交流吐槽] Flexus云服务,开玩dify,拥有自己的云AI
    选择云华为云Flexus云服务,新用户有云礼包选了3天,从云主机到云服务器,从弹性云服务器(也就是常说的ECS)到云服务器实例(就是本文提到的Flexus),从AWS看到阿里再看到华为,从cloud studio 看到 modelArts IDE,最后入了2个规格的Flexus2核1G 2M 和 2核 | 4GiB,加上弹性公网和域名,相当于周末约顿饭的费用成本入手后进入控制台,查看自己的云服务器访问云在这儿吐槽一下,官方文档是挺全的, 不过按场景的少,要自己找,跳来跳去容易乱,第一次用比较费时间,下边是按本文场景顺序理的官网参考文档VNC远程登录华为Cloudshell登录SHH密码登录如果Web登录不了,查看弹性公网是否绑定如果还登录不了,查看安全组规则,是否开放约定port我最常用的是Web和IDE,试用了modelArts,体验不错,主要这个IDE现阶段也不收费云上部署AI目标:部署dify如果你找到了快速搭建Dify-LLM应用开发平台,但是并不想另外付费的话,请转==下步==(这里也要说的是,我想把这个方案部署好在已经购买的云服务器上,都不行,只能另外付费)。转==这里==方式二:Docker Compose方式部署Dify,这个方式在本地验证过(可以看我之前的blog:windows+dify+wsl),简单,推荐访问difygiteee有dify v1.0.01.在您的云服务器列表页查看当前机器的公网IP地址2.浏览器中输入复制的IP地址以访问Dify:http://xxxx.xxxx.xxxx.xxxap监控云主机