K8s: 应用项目部署运维环境搭建

使用 StatefulSet 部署 Mysql

  • 数据库环境准备是应用的前置准备工作

  • 先在 node 节点上安装 mysql

    • $ sudo yum install mysql-server -y 安装
    • $ sudo systemctl start mysqld 启动
    • $ sudo systemctl enable mysqld 设置开启启动
    • $ sudo mysql_secure_installation 设置安全选项
    • $ mysql --version 查看版本
  • 我们在 node1 这个 work 节点部署,准备 app-mysql.yaml

    yaml 复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-nodeport
    spec:
      ports:
        - port: 3306
          nodePort: 30306
      selector:
        app: mysql
      type: NodePort
    
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      serviceName: "mysql"
      replicas: 1 # 虽然您要求不要副本,但StatefulSet通常需要至少一个副本
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:8.0.36
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: "password"
            ports:
            - containerPort: 3306
              name: mysql
            volumeMounts:
            - name: mysql-config
              mountPath: /etc/mysql/conf.d
            - name: mysql-data
              mountPath: /var/lib/mysql
          volumes:
          - name: mysql-config
            hostPath:
              path: /tmp/mysql/conf.d
              type: DirectoryOrCreate
          - name: mysql-data
            hostPath:
              path: /tmp/mysql/data
              type: DirectoryOrCreate
  • $ kubectl create -f app-mysql.yaml 创建

    conf 复制代码
    service/mysql-nodeport created
    statefulset.apps/mysql created
  • $ kubectl get all

    conf 复制代码
    NAME          READY   STATUS    RESTARTS   AGE
    pod/mysql-0   1/1     Running   0          27s
    
    NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    service/kubernetes       ClusterIP   10.1.0.1       <none>        443/TCP          35h
    service/mysql-nodeport   NodePort    10.1.183.195   <none>        3306:30306/TCP   27s
    
    NAME                     READY   AGE
    statefulset.apps/mysql   1/1     27s
  • $ mysql -u root -P 30306 -h node1.k8s -p

    conf 复制代码
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.0.36 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2024, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    • 输入密码 password 就可以登录了
  • 注意,在低版本的一些 mysql 中的配置会有不同,而且可能需要加上如下,不会意外退出

    conf 复制代码
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
  • 现在,我们可以创建一个新的数据库了

  • $ create database blogDBTest DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

    conf 复制代码
    Query OK, 1 row affected, 2 warnings (0.06 sec)
  • 查看 $ show databases

    conf 复制代码
    +--------------------+
    | Database           |
    +--------------------+
    | blogDBTest         |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.03 sec)
  • 可见,mysql数据库环境准备好了,这里只做了单实例的

  • 注意,这个配置有很多的优化点,比如:集群副本,存储,密码加密等

    • 密码这块,参考下面的配置
  • 仅供参考,可关注我之前的博文以及持续关注 ...

为应用程序配置 Service 和 Development

1 ) 先说明下博客应用的底层配置

  • 比如,当前博客应用的application.yml

    yaml 复制代码
    spring:
      thymeleaf:
        mode: HTML
      profiles:
        active: dev
    
    comment.avater: /images/avatar.png
    server:
      port: 5000
  • 可以看到应用程序启动后的端口是 5000

  • 继续看下其 Dockerfile 文件

    yaml 复制代码
    FROM openjdk:8-jdk-alpine3.7
    VOLUME /tmp
    ADD target/blog.jar /blog.jar
    EXPOSE 5000
    ENTRYPOINT ["java", "-jar", "/blog.jar"]
  • 可见容器内对外暴露的也是 5000 的端口

  • application-dev.yml 文件中做了一些数据库相关的配置,如下

    yaml 复制代码
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://${MYSQL_SERVER:localhost}:${MYSQL_PORT:3306}/${MYSQL_DB_NAME_TEST:blogDB}?useUnicode=true&characterEncoding=utf-8
        username: ${MYSQL_USER_TEST: root}
        password: ${MYSQL_PASSWORD_TEST: password}

2 )现在进入正题,应用程序的配置

  • $ vi app-blog.yaml 这个是博客应用程序的yaml文件

    yaml 复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: k8sblog
    spec:
      selector:
        app: k8sblog
      type: NodePort
      ports:
      - port: 5000
        targetPort: 5000
        nodePort: 30002
        
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: k8sblog
    spec:
      selector:
        matchLabels:
          app: k8sblog
      template:
        metadata:
          labels:
            app: k8sblog
        spec:
          hostAliases:
          - ip: "10.211.10.2"
            hostnames:
            - "art.local" # 这里是我们的私有镜像中心
          containers:
          - name: k8sblog
            image: 10.211.10.2:8081/docker-local/k8sblog:1.1
            ports:
            - containerPort: 5000
            env:
              - name: MYSQL_PORT
                value: "30306"
              - name: MYSQL_SERVER
                value: "node1.k8s"
              - name: MYSQL_DB_NAME_TEST
                value: blogDB
              - name: MYSQL_USER_TEST
                value: "root"
              - name: MYSQL_PASSWORD_TEST
                valueFrom:
                    secretKeyRef:
                      name: mysql-password-test
                      key: MYSQL_PASSWORD_TEST
          imagePullSecrets:
          - name: regcred-local
  • 这里的密码加密的生成,这里上面的可以进行参考,之前博文也有其他方式,请持续关注

    • $ kubectl create secret generic mysql-password-test --from-literal=MYSQL_PASSWORD_TEST=password
  • $ kubectl create -f app-blog.yaml 创建

  • $ kubectl get po 查看app成功运行

  • 访问: http://node1.k8s:30002

  • 以上仅仅是一种演示,仅供参考

从私有镜像中心拉取/同步应用镜像

1 ) 拉取

  • 从上面的yaml中,可以看到,image: 10.211.10.2:8081/docker-local/k8sblog:1.1 这个配置
  • 这个就是私有镜像中心拉取的

2 )上传同步

  • 当应用程序修改源码后,需要重新打包, 重新将镜像传到镜像中心
  • $ mvn package
  • $ docker build -t 10.211.10.2:8081/docker-local/k8sblog:1.1 .
  • $ docker push 10.211.10.2:8081/docker-local/k8sblog:1.1
  • 注意,每次发版都要升级版本

3 )关于设置镜像拉取密码

  • 从上面可以看到, 有如下配置

    conf 复制代码
    imagePullSecrets:
    - name: regcred-local
  • 这个就是在私有镜像中心设置的拉取镜像时的密码

  • $ kubectl create secret docker-registry regcred-local --docker-server=10.211.10.2:8081 --docker-username=admin --docker-password=password --docker-email=xxx@qq.com

    • 这里 regcred-local 就代表你的用户名和密码加密后的code
    • $ kubectl describe secret regcred-local 可以看到加密了和之前的其他secret 一样的效果

空间隔离

1 ) 关于空间隔离

  • 空间的隔离,一般都是指的是 namespace
  • default 命名空间可以用于测试,测试完成后需要归类到某个命名空间下
  • 之前所有的 pod 都是运行在 default 命名空间中的
  • $ kubectl get ns 查看所有命名空间
  • $ kubectl create ns test 创建 test 命名空间

2 )创建相关环境的秘钥

  • $ kubectl create secret generic mysql-password-test --from-literal=MYSQL_PASSWORD_TEST=password -n test

    • 创建 test 环境命名空间的 mysql 秘钥
  • $ kubectl create secret docker-registry regcred-local --docker-server=10.211.10.2:8081 --docker-username=admin --docker-password=password --docker-email=xxx@qq.com -n test

    • 创建 test 环境命名空间的 拉取镜像的 秘钥
  • 同时,我们可以在上述 yaml 配置下的 metadata 中添加命名空间

    conf 复制代码
    metadata:
      namespace: test
  • $ kubectl get secret -n test 查看test空间下创建的所有秘钥

私有镜像仓库管理

  • 在本地研发测试的时候,不是直接部署到 docker-test, docker-prod
  • 可以在local本地建空间来测试,比如在 docker-local下继续建
    • docker-local-test
    • docker-local-prod
  • 这样在研发的时候就可以进行本地测试 test 和 prod了
  • 同样,在 yaml 中对应的镜像地址可以修改,之前是这样的
    • $ 10.211.10.2:8081/docker-local/k8sblog:1.1
  • 现在没有必要改成如下的配置
    • $ 10.211.10.2:8081/docker-local-test/k8sblog:1.1
    • $ 10.211.10.2:8081/docker-local-prod/k8sblog:1.1
  • 只需要这样,使用虚拟镜像地址
    • $ 10.211.10.2:8081/docker/k8sblog:1.1
    • 注意,所有的仓库都在 docker 组下
    • 可以在 Set Me Up 中设置
  • 注意,实际使用中需要使用 API 和脚本去做镜像从一个仓库拷贝到另一个仓库的操作
相关推荐
moppol2 小时前
Serverless 架构入门与实战:AWS Lambda、Azure Functions、Cloudflare Workers 对比
云原生·serverless·aws
IvanCodes2 小时前
一、Docker:一场颠覆应用部署与运维的容器革命
docker·容器
栗子~~3 小时前
Milvus docker-compose 部署
docker·容器·milvus
没有名字的小羊4 小时前
2.安装Docker
运维·docker·容器
xiezhr4 小时前
50 个常用 Docker 命令
运维·docker·容器
退役小学生呀10 天前
三、kubectl使用详解
云原生·容器·kubernetes·k8s
被困者10 天前
Linux部署Sonic前后端(详细版)(腾讯云)
spring cloud·云原生·eureka
程序员小潘10 天前
Kubernetes多容器Pod实战
云原生·容器·kubernetes
进击的码码码码N10 天前
Docker 镜像加速
运维·docker·容器