企业级Devops— 打造完整 CICD 实践指南(八):容器化实战

🐳 容器化实战:应用上云

前面搭建好了jenkinsK8s集群,现在我们来编写配置文件

🐳 Dockerfile文件详解

Dockerfile定义了一个构建镜像过程。

各个名词解释:

  • FROMDockerfile的第一条指令,用来指定基础镜像。在这里,镜像基于openjdk:17,它是一个包含JDK17的官方Docker镜像。
  • ENV:用于设置环境变量。
  • RUN:用于在镜像构建时执行命令。
  • ADD:用于将文件从宿主机复制到容器中
  • WORKDIR: 设置工作目录
  • ENTRYPOINT: 定义容器启动时默认执行命令
  • EXPOSE: 用于在容器内部声明该容器会监听的网络端口

📄 Kubernetes YAML文件详解

Kubernetes YAML文件包含两个主要部分:一个Deployment和一个Service

各个名词解释:

  • Pod : K8S中最小调度单元,通常是一个或多个容器的集合,具有共享网络和存储。
  • Deployment : 用于管理Pod的生命周期,包括副本的自动扩缩容、滚动更新和回滚,确保应用程序的高可用性和稳定性。
  • Service : 为一组Pod提供稳定的访问入口,负责负载均衡和服务发现。它通过DNS名称和虚拟IP地址,使得客户端能够访问到对应的Pod
  • apiVersion: 指定资源版本
  • metadata :元数据部分;name指定Deployment的名字,namespace执行Deployment部署的命名空间,label指定Deployment的标签
  • spec : 指定Deployment的详细规格,如:Pod副本数、镜像地址、端口、容器名称、容器可使用资源、凭证等。

👨‍💻 后端

release-test根目录添加Dockerfilek8s-releasetest.yaml两个文件并提交到远程仓库

🐳 Dockerfile

dockerfile 复制代码
FROM openjdk:17

ENV JAVA_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.security.jgss/sun.security.krb5=ALL-UNNAMED"

RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

ADD target/release-test-*.jar /data/release-test-0.0.1.jar

WORKDIR /data

ENTRYPOINT ["/bin/sh", "-c", "java ${JAVA_OPTS} -jar release-test-0.0.1.jar"]

EXPOSE 30001

📄 k8s-releasetest.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: release-test
  namespace: $NAMESPACE
  labels:
    app: release-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: release-test
  template:
    metadata:
      name: release-test
      labels:
        app: release-test
    spec:
      containers:
        - name: release-test
          image: $REGISTRY/$PROJECT/$IMAGENAME:$TAGS
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 30001
              protocol: TCP
          resources:
            requests:
              memory: "0.5G"
              cpu: "0.2"
            limits:
              memory: "1G"
              cpu: "0.5"
      imagePullSecrets:
        - name: harbor-k8s-secret
      restartPolicy: Always
      
---

apiVersion: v1
kind: Service
metadata:
  name: release-test
  namespace: $NAMESPACE
spec:
  type: NodePort
  ports:
    - port: 30001
      name: release-test
      protocol: TCP
      targetPort: 30001
      nodePort: 30001
  selector:
    app: release-test

👩‍💻 前端

release-frontend根目录添加Dockerfilek8s-reelasefrontend.yaml两个文件并提交到远程仓库。

🐳 Dockerfile

dockerfile 复制代码
FROM nginx:latest
ENV ENV LANG en_US.UTF-8
# 同步时区及时间
RUN ln -snf /usr/share/zoneinfo/Asia/ShangHai /etc/localtime && echo 'Asia/ShangHai' > /etc/timezone

ADD dist/ /data/www/
RUN sed -i 's/#gzip on/gzip on/g' /etc/nginx/nginx.conf
RUN sed -i '/index  index.html index.htm/a\      try_files \$uri \$uri/ \/index.html;' /etc/nginx/conf.d/default.conf
RUN sed -i 's|/usr/share/nginx/html|/data/www/|g' /etc/nginx/conf.d/default.conf

WORKDIR /data/www/
ENTRYPOINT [ "nginx", "-g", "daemon off;" ]

EXPOSE 30002

📄 k8s-reelasefrontend.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: release-frontend
  namespace: $NAMESPACE
  labels:
    app: release-frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: release-frontend
  template:
    metadata:
      name: release-frontend
      labels:
        app: release-frontend
    spec:
      containers:
        - name: release-frontend
          image: $REGISTRY/$PROJECT/$IMAGENAME:$TAGS
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80 # nginx端口号
              protocol: TCP
          resources:
            requests:
              memory: "0.5G"
              cpu: "0.2"
            limits:
              memory: "1G"
              cpu: "0.5"
      imagePullSecrets:
        - name: harbor-k8s-secret
      restartPolicy: Always
      
---

apiVersion: v1
kind: Service
metadata:
  name: release-frontend
  namespace: $NAMESPACE
spec:
  type: NodePort
  ports:
    - port: 30002
      name: release-frontend
      protocol: TCP
      targetPort: 80
      nodePort: 30002
  selector:
    app: release-frontend

📝 创建命名空间

🖥️ 机器B中创建

前面的配置文件中可以看到namespace为:$NAMESPACE

$NAMESPACE变量的值根据不同环境(开发、测试、生产)不同,这里我们以开发环境为例,在k8s集群服务器中执行下面命令:

bash 复制代码
kubectl create namespace develop

🛠️ 配置 Kubernetes Secret 以访问私有 Harbor

🖥️ 机器B中创建

前面的配置文件中可以看到imagePullSecretsname为:harbor-k8s-secret, kubelet拉取镜像时需要验证是否有权限拉取。 当没有配时,拉取镜像会报:pull access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials

  • 创建 Kubernetes Secret : 使用 kubectl create secret docker-registry 命令创建Secret,确保提供正确的Harbor服务器地址、用户名和密码。

    bash 复制代码
    kubectl create secret docker-registry harbor-k8s-secret \
      --docker-server=https://xxx \
      --docker-username=<your-username> \
      --docker-password=<your-password> \
      --docker-email=<your-email> \
      -n develop

    这个命令会在develop命名空间下创建一个名为 harbor-k8s-secretSecret⚠️ 注意 :xxx必须和k8s yaml文件中镜像地址一致,如:images: xxx/test:2024110215014382

  • 在 Pod 或 Deployment 中引用 Secret : 在你的PodDeploymentYAML文件中,需要指定 imagePullSecrets,以便Kubernetes在拉取镜像时使用该Secret

🔒 配置服务器安全组规则

  • k8s所在服务器的ip地址需要添加到harbor(https一般为443端口)所在服务器的安全组规则中
  • jenkins所在服务器的ip地址需要 添加到harbor(https一般为443端口)所在服务器的安全组规则中
相关推荐
考虑考虑3 小时前
cmd局部设置java变量
运维·后端·自动化运维
2601_962284171 天前
欧洲转码指南:后端、前端与全栈开发解析
前端开发·devops·后端开发·全栈开发·欧洲转码指南
运维全栈笔记2 天前
运维技术网址大全 DevOps 官方资源导航
运维·devops
宋均浩2 天前
重跑率 31% → 6%,变更失败率 12% → 4%:CI/CD 流水线治理实战的 5 个配置
ci/cd·自动化运维·devops
考虑考虑2 天前
docker compose环境变量替换
运维·后端·自动化运维
本尊粥3 天前
网站一改版自动化脚本就废?聊聊自愈回放的完整设计
自动化运维
あ-3 天前
企业 DevOps + 协同办公 + 可观测性 + 网络基础设施平台
运维·网络·devops
SkyWalking中文站3 天前
Horizon UI 1.0 正式发布:SkyWalking 新一代控制台接棒 Booster
运维·监控·自动化运维
帷幕落秋4 天前
Nginx 系列实战(三):LNMP 完整搭建,动静分离的学习总结
运维·自动化运维
帷幕落秋4 天前
一文吃透 Nginx 虚拟主机:原理 + 双站点实战 + SELinux 排错
运维·自动化运维